장유진

종목 선별 및 백테스팅 프로그램

Showing 39 changed files with 728 additions and 0 deletions
# Default ignored files
/shelf/
/workspace.xml
# Datasource local storage ignored files
/../../../../../../../:\Users\YuJin\Desktop\캡디2\stock_pbr_test\.idea/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/result_kr.csv" charset="x-windows-949" />
<file url="file://$PROJECT_DIR$/result_kr1.csv" charset="x-windows-949" />
</component>
</project>
\ No newline at end of file
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="PyChainedComparisonsInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="ignoreConstantInTheMiddle" value="true" />
</inspection_tool>
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredIdentifiers">
<list>
<option value="str.__setitem__" />
<option value="dict.__getitem__" />
<option value="list.pop" />
<option value="str.__and__" />
</list>
</option>
</inspection_tool>
</profile>
</component>
\ No newline at end of file
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (stock_pbr_test)" project-jdk-type="Python SDK" />
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/stock_pbr_test.iml" filepath="$PROJECT_DIR$/.idea/stock_pbr_test.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/venv" />
</content>
<orderEntry type="jdk" jdkName="Python 3.9 (stock_pbr_test)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
\ No newline at end of file
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal"
}
]
}
\ No newline at end of file
{
"python.linting.pylintEnabled": true,
"python.linting.enabled": true,
"python.linting.lintOnSave": true,
"python.pythonPath": "C:\\Python39\\python.exe",
"python.languageServer": "Pylance"
}
\ No newline at end of file
from QuantDB import QuantDB
from typing import List
class DataProvider:
DB = None
def __init__(self):
self.Name = "Default"
self.DB = QuantDB()
def __repr__(self):
return self.Name
def initialize(self):
return self.DB.connect()
def close(self):
if( self.DB ):
self.DB.close()
self.DB = None
def findFS(self, columns: List[str], year: int, quarter: int, div: str): # a: str, b: str, times: int
if( self.DB ):
querystring = 'SELECT '
for target in columns:
querystring = querystring + '"' + target + '",'
querystring = querystring[:-1]
querystring = querystring + 'from "FinancialStatements" ' + 'WHERE ' + '"Year"=' + str(year) + ' and "Quarter"=' + str(quarter) + ' and "Div"=' + "'" + div + "'"
return self.DB.searchData(querystring, columns)
def findAllFS(self, columns: List[str], year: int, quarter: int, div: str):
if( self.DB ):
querystring = 'SELECT '
for target in columns:
querystring = querystring + '"' + target + '",'
querystring = querystring[:-1]
querystring = querystring + 'from "FinancialStatements" ' + 'WHERE ' + '"Year"=' + str(year) + ' and "Quarter"=' + str(quarter) + ' and "Div"=' + "'" + div + "'"
return self.DB.searchData(querystring, columns)
def findOneFS(self, columns: List[str], stockcode: str, year: int, quarter: int, div: str):
if( self.DB ):
querystring = 'SELECT '
for target in columns:
querystring = querystring + '"' + target + '",'
querystring = querystring[:-1]
querystring = querystring + 'from "FinancialStatements" ' + 'WHERE ' + '"id"=' + "'" + stockcode + str(year) + str(quarter) + div + "'"
return self.DB.searchData(querystring, columns)
def findSPbyID(self, columns: List[str], stockcode: str, stockdate: str):
if( self.DB ):
querystring = 'SELECT '
for target in columns:
querystring = querystring + '"' + target + '",'
querystring = querystring[:-1]
querystring = querystring + 'from "StockPrice" ' + 'WHERE ' + '"id"=' + "'" + stockcode + stockdate + "'"
return self.DB.searchData(querystring, columns)
def findSP(self, columns: List[str], stockcode: str, stock_startdate: str, stock_enddate: str):
if( self.DB ):
querystring = 'SELECT '
for target in columns:
querystring = querystring + '"' + target + '",'
querystring = querystring[:-1]
querystring = querystring + 'from "StockPrice" ' + 'WHERE ' + '"StockCode"=' + "'" + stockcode + "'" ' and "StockDate" >= ' + "'" + stock_startdate + "'" + ' and "StockDate" <= ' + "'" + stock_enddate + "' order by id asc"
return self.DB.searchData(querystring, columns)
def findCompany(self, columns: List[str], stockcode: str):
if( self.DB ):
querystring = 'SELECT '
for target in columns:
querystring = querystring + '"' + target + '",'
querystring = querystring[:-1]
querystring = querystring + 'from "Company" ' + 'WHERE ' + '"StockCode"=' + "'" + stockcode + "'"
return self.DB.searchData(querystring, columns)
def findStockName(self, stockcode: str):
if( self.DB ):
df_comapanys = self.findCompany(["StockName"], stockcode)
if df_comapanys is None :
return ''
else :
return df_comapanys["StockName"][0]
\ No newline at end of file
from datetime import date
import pandas as pd
import sys
from Investment.Strategy.StrategyBase import StrategyBase
class FinancialStatementsStrategyBase(StrategyBase):
AdditionalFinancialStatementsItem = []
FinancialStatementsCondition = ''
FinancialStatementsYear = 2017
FinancialStatementsQuater = 1
FinancialStatementsDiv = 'CFS'
StockDate = date.today()
DataSearchStartDate = date.today()
DataSearchEndDate = date.today()
FinancialStatementsSearchTarget = []
StockSearchTarget = []
FinancialStatementsOrderBy = []
FinancialStatementsOrderMethod = ''
df_fs = None
df_stock = None
df_company = None
def __init__(self):
super().__init__()
self.Division = "FinancialStatements"
def __repr__(self):
return self.Name
def setStrategy(self):
super().setStrategy()
def searchData(self):
try:
if self.df_fs is None:
self.df_fs = self.db.findFS(self.FinancialStatementsSearchTarget, self.FinancialStatementsYear,
self.FinancialStatementsQuater, self.FinancialStatementsDiv)
if self.df_fs is None:
print('db query error')
sys.exit(1)
except:
print("Unexpected error:", sys.exc_info()[0])
return False
return True
def setAdditionalData(self):
try:
for item in self.AdditionalFinancialStatementsItem:
self.df_fs[item] = 0
for item in self.StockSearchTarget:
self.df_fs[item] = 0
for index, row in self.df_fs.iterrows():
self.df_stock = self.db.findSPbyID(self.StockSearchTarget, row['StockCode'],
self.StockDate.strftime("%Y-%m-%d"))
if self.df_stock is None:
print('db query error')
else:
if self.df_stock.size < 1:
continue
for item in self.StockSearchTarget:
self.df_fs.loc[index, item] = self.df_stock[item][0]
for item in self.AdditionalFinancialStatementsItem:
if item == 'PER':
if row["ProfitLoss"] != 0:
self.df_fs.loc[index, item] = self.df_fs.loc[index, 'MarketCapitalization'] / row[
"ProfitLoss"]
elif item == 'PBR':
if row["Equity"] != 0:
self.df_fs.loc[index, item] = self.df_fs.loc[index, 'MarketCapitalization'] / row[
"Equity"]
elif item == 'ROE':
if row["Equity"] != 0:
self.df_fs.loc[index, item] = float(row["ProfitLoss"]) / float(
row["Equity"]) * 100.00
asc = True
if self.FinancialStatementsOrderMethod == 'asc':
asc = True
elif self.FinancialStatementsOrderMethod == 'desc':
asc = False
self.df_all = self.df_fs.query(self.FinancialStatementsCondition).sort_values(
by=self.FinancialStatementsOrderBy, ascending=asc).head(self.NumberOfStocks)
self.df_all.insert(1, 'StockName', '')
self.df_all['StockName'] = ''
for index, row in self.df_all.iterrows():
self.df_all.loc[index, "StockName"] = self.db.findStockName(row['StockCode'])
except:
print("Unexpected error:", sys.exc_info()[0])
return False
return True
from datetime import date
class StrategyBase:
Name = ''
Division = ''
NumberOfStocks = 0
DataSearchStartDate = date.today()
DataSearchEndDate = date.today()
df_all = None
db = None
def __init__(self):
self.Name = 'Base'
def __repr__(self):
return self.Name
def setStrategy(self):
print('setStrategy')
def searchData(self):
print('searchData')
def setAdditionalData(self):
print('setAdditionalData')
\ No newline at end of file
import pandas as pd
class TradingBase:
Name = ''
TotalInvestmentAmount = 0
Method = "Split evenly"
BuyingMethod = 1 # 1 : at_once
BuyingDateTime = [] # datetime
SellDateTime = [] # datetime
NumberOfStocks = 10
PriceDiv = "Open"
StockBuyingSearchTarget = []
StockSellSearchTarget = []
df_all = None
df_stock = None
db = None
def __init__(self):
self.Name = 'Base'
def __repr__(self):
return self.Name
def setTrading(self):
print("setTrading")
def doTrading(self):
self.df_all['BuyingPrice'] = 0
self.df_all['SellPrice'] = 0
self.df_all['BuyingAmount'] = 0
if self.Method == 1: # "Split evenly"
if self.BuyingMethod == 1:
investmentAmount = self.TotalInvestmentAmount / self.NumberOfStocks
for index, row in self.df_all.iterrows():
self.df_stock = self.db.findSPbyID(self.StockBuyingSearchTarget, self.df_all.loc[index, 'StockCode'], self.BuyingDateTime[0].strftime("%Y-%m-%d"))
if self.df_stock is None :
print('db query error')
else:
if self.df_stock.size < 1 :
continue
buyingPrice = self.df_stock[self.StockBuyingSearchTarget[0]][0]
self.df_stock = self.db.findSPbyID(self.StockSellSearchTarget, self.df_all.loc[index, 'StockCode'], self.SellDateTime[0].strftime("%Y-%m-%d"))
if self.df_stock is None :
print('db query error')
else:
if self.df_stock.size < 1 :
continue
sellPrice = self.df_stock[self.StockSellSearchTarget[0]][0]
self.df_all.loc[index, 'BuyingPrice'] = buyingPrice
self.df_all.loc[index, 'SellPrice'] = sellPrice
self.df_all.loc[index, 'BuyingAmount'] = int(investmentAmount / buyingPrice)
elif self.BuyingMethod == 2:
print('...')
else:
print('...')
else:
print('...')
\ No newline at end of file
import pandas as pd
import json
class VerificationBase:
Name = ''
TotalInvestmentAmount = 0
Balance: int = 0
Yield: float = 0
df_all = None # type: pd
db = None
def __init__(self):
self.Name = 'Base'
def __repr__(self):
return self.Name
def setVerification(self):
print("setVerification")
def doVerification(self):
self.df_all['ProfitLossByStock'] = 0
self.df_all['InvestmentAmount'] = 0
self.df_all['Balance'] = 0
self.df_all['Yield'] = 0
for index, row in self.df_all.iterrows():
buyingPrice = self.df_all.loc[index, 'BuyingPrice']
sellPrice = self.df_all.loc[index, 'SellPrice']
investmentCurrentAmount = self.df_all.loc[index, 'BuyingAmount'] * buyingPrice
self.df_all.loc[index, 'ProfitLossByStock'] = sellPrice - buyingPrice
self.df_all.loc[index, 'InvestmentAmount'] = investmentCurrentAmount
self.df_all.loc[index, 'Balance'] = investmentCurrentAmount + self.df_all.loc[index, 'ProfitLossByStock'] * \
self.df_all.loc[index, 'BuyingAmount']
self.df_all.loc[index, 'Yield'] = (float(self.df_all.loc[index, 'Balance']) - float(
investmentCurrentAmount)) / float(investmentCurrentAmount) * 100.00
self.Balance = self.df_all['Balance'].sum()
investmentCurrentTotalAmount = self.df_all['InvestmentAmount'].sum()
self.df_all = self.df_all.append(pd.Series(), ignore_index=True)
self.df_all.loc[len(self.df_all) - 1, 'Balance'] = self.Balance
self.Yield = ((float(self.Balance) + float(self.TotalInvestmentAmount - investmentCurrentTotalAmount)) - float(
self.TotalInvestmentAmount)) / float(self.TotalInvestmentAmount) * 100.00
self.df_all.loc[len(self.df_all) - 1, 'Yield'] = self.Yield
def saveResult(self):
self.df_all.to_csv("result1.csv")
self.df_all.to_csv("result_kr1.csv", encoding='euc-kr')
def saveResulToJSON(self):
result = self.df_all.to_json(orient="split")
parsed = json.loads(result)
with open("result.json", "w") as text_file:
text_file.write(json.dumps(parsed, indent=4, ensure_ascii=False))
def saveSummary(self, record, num):
self.Yield = round(self.Yield, 5)
if record[-1] < self.Yield:
if record[0] == 0:
record[0] = self.Yield
else:
for i in range(5):
if record[i] == self.Yield:
return False, 0
elif record[i] < self.Yield:
record.insert(i, self.Yield)
break
if len(record) > 5:
record.pop()
jsonobj = {"TotalInvestmentAmount": str(self.TotalInvestmentAmount), "Balance": str(self.Balance),
"Yield": str(self.Yield)}
with open(f"result_summary{num}.json", "w") as text_file:
text_file.write(json.dumps(jsonobj, indent=4))
return True, self.Yield
return False, 0
import psycopg2
import pandas as pd
from typing import List
class QuantDB:
Name = 'Base'
Conn = None
ConnectionStr = 'host=aifactory-test.cp90w5j6b2ld.ap-northeast-2.rds.amazonaws.com dbname=QuantDB user=quantdb password=quantdb'
def __init__(self):
self.Name = "Default"
def __repr__(self):
return self.Name
def connect(self):
self.Conn = None
try:
self.Conn = psycopg2.connect(self.ConnectionStr)
except (Exception, psycopg2.DatabaseError) as error:
print(error)
return False
return True
def searchData(self, query: str, columns: List[str]):
cursor = self.Conn.cursor()
try:
cursor.execute(query)
except (Exception, psycopg2.DatabaseError) as error:
print(error)
cursor.close()
return None
tupples = cursor.fetchall()
cursor.close()
df = pd.DataFrame(tupples, columns=columns)
return df
def searchDataOneRow(self, query: str):
cursor = self.Conn.cursor()
try:
cursor.execute(query)
except (Exception, psycopg2.DatabaseError) as error:
print(error)
cursor.close()
return None
row = cursor.fetchone()
cursor.close()
return row[0]
def close(self):
self.Conn.close()
\ No newline at end of file
from Investment.Strategy.StrategyBase import StrategyBase
from Investment.Strategy.FinancialStatementsStrategyBase import FinancialStatementsStrategyBase
from datetime import date
class Strategy(FinancialStatementsStrategyBase):
def __init__(self):
super().__init__()
def __repr__(self):
return self.Name
def setStrategy(self, per=None, pbr_up=None, pbr_down=None, roe=None, order='PER'):
super().setStrategy()
self.Name = 'PER_ROE_V1.0'
self.NumberOfStocks = 10
self.AdditionalFinancialStatementsItem = ['PER', 'PBR', 'ROE']
# self.FinancialStatementsCondition = '(PER > 6) and (ROE > 10) and (PBR > 0.5) and (PBR < 1)'
self.setFinancialStatementsCondition(per, pbr_up, pbr_down, roe)
print(self.FinancialStatementsCondition)
# self.FinancialStatementsCondition = '(PER > 0) and (PER < 20) and (ROE > 10)'
# self.FinancialStatementsCondition = '(PBR < 1)'
self.FinancialStatementsYear = 2016
self.FinancialStatementsQuater = 4
self.FinancialStatementsDiv = 'CFS'
self.StockDate = date(2017, 4, 10)
self.FinancialStatementsSearchTarget = ['StockCode', 'Equity', 'ProfitLoss']
self.StockSearchTarget = ['MarketCapitalization']
self.FinancialStatementsOrderBy = [order]
if order == 'PER':
self.FinancialStatementsOrderMethod = 'asc'
else:
self.FinancialStatementsOrderMethod = 'desc'
# self.FinancialStatementsOrderBy.append('ROE')
# self.FinancialStatementsOrderMethod = 'desc'
def setFinancialStatementsCondition(self, per, pbr_up, pbr_down, roe):
self.FinancialStatementsCondition = ''
if per is not None:
self.FinancialStatementsCondition += f'(PER > {per})'
if pbr_up:
if len(self.FinancialStatementsCondition) == 0:
self.FinancialStatementsCondition += f'(PBR > {pbr_up})'
else:
self.FinancialStatementsCondition += f' and (PBR > {pbr_up})'
if pbr_down:
if len(self.FinancialStatementsCondition) == 0:
self.FinancialStatementsCondition += f'(PBR < {pbr_down})'
else:
self.FinancialStatementsCondition += f' and (PBR < {pbr_down})'
if roe:
if len(self.FinancialStatementsCondition) == 0:
self.FinancialStatementsCondition += f'(ROE > {roe})'
else:
self.FinancialStatementsCondition += f' and (ROE > {roe})'
def searchData(self):
return FinancialStatementsStrategyBase.searchData(self)
def setAdditionalData(self):
return FinancialStatementsStrategyBase.setAdditionalData(self)
from Investment.Trading.TradingBase import TradingBase
from datetime import date
class Trading(TradingBase):
def __init__(self):
super().__init__
def __repr__(self):
return self.Name
def setTrading(self):
super().setTrading()
self.Name = 'Split evenly'
self.TotalInvestmentAmount = 100000000
self.Method = 1 # 1 : "Split evenly",
self.BuyingMethod = 1 # 1 : at once
self.BuyingDateTime = [date(2017, 4, 10)]
self.SellDateTime = [date(2018, 4, 16)]
self.NumberOfStocks = 10
self.PriceDiv = 'Open'
self.StockBuyingSearchTarget = ['Open']
self.StockSellSearchTarget = ['Open']
def doTrading(self):
return super().doTrading()
\ No newline at end of file
from Investment.Verification.VerificationBase import VerificationBase
from datetime import date
class Verification(VerificationBase):
def __init__(self):
super().__init__
def __repr__(self):
return self.Name
def setVerification(self):
super().setVerification()
def doVerification(self):
return super().doVerification()
def saveResult(self):
return super().saveResult()
def saveResulToJSON(self):
return super().saveResulToJSON()
def saveSummary(self, record, num):
return super().saveSummary(record, num)
import datetime
import Strategy
import Trading
import Verification
import sys
import DataProvider
def single():
record = [0]
# record = [18.91309, 17.8967, 17.14154, 16.07653, 16.03074]
strategy_record = [[3, 0.7000000000000001, 10, 18.91309], [3, 0.7000000000000001, 11, 17.8967],
[3, 0.8, 11, 17.14154], [4, 0.7000000000000001, 11, 16.07653],
[3, 0.7000000000000001, 5, 16.03074]]
st = Strategy.Strategy()
tr = Trading.Trading()
ve = Verification.Verification()
db = DataProvider.DataProvider()
if db.initialize():
print('db connection')
# print(db.findSP(['StockDate','Open'], '004990', '2019-04-11', '2019-12-31'))
st.db = db
st.setStrategy(10, 0, 1.5, 0)
if (st.searchData() == False):
print("st.searchData error")
sys.exit(-1)
if (st.setAdditionalData() == False):
print("st.setAdditionalData error")
sys.exit(-1)
tr.df_all = st.df_all
tr.db = db
tr.setTrading()
if (tr.doTrading() == False):
print("tr.doTrading error")
sys.exit(-1)
ve.TotalInvestmentAmount = tr.TotalInvestmentAmount
ve.df_all = tr.df_all
ve.setVerification()
ve.doVerification()
ve.saveResult()
# ve.saveResulToJSON()
r, Yield = ve.saveSummary(record, 0)
else:
print("db error")
db.close()
def multi():
start = datetime.datetime.now()
record = [0]
strategy_record = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
num = 0
st = Strategy.Strategy()
tr = Trading.Trading()
ve = Verification.Verification()
db = DataProvider.DataProvider()
for per in range(8):
pbr = 1
while pbr > 0.3:
for roe in range(10, 20):
if db.initialize():
print('db connection')
# print(db.findSP(['StockDate','Open'], '004990', '2019-04-11', '2019-12-31'))
st.db = db
else:
print("db error")
st.setStrategy(per, pbr, 1.2, roe)
if (st.searchData() == False):
print("st.searchData error")
sys.exit(-1)
if (st.setAdditionalData() == False):
print("st.setAdditionalData error")
sys.exit(-1)
tr.df_all = st.df_all
tr.db = db
tr.setTrading()
if (tr.doTrading() == False):
print("tr.doTrading error")
sys.exit(-1)
ve.TotalInvestmentAmount = tr.TotalInvestmentAmount
ve.df_all = tr.df_all
ve.setVerification()
ve.doVerification()
ve.saveResult()
# ve.saveResulToJSON()
r, Yield = ve.saveSummary(record, num)
if r:
for i in range(5):
if strategy_record[i][3] < Yield:
strategy_record.insert(i, [per, pbr, roe, Yield])
break
strategy_record.pop()
print(record, strategy_record)
num += 1
pbr -= 0.1
db.close()
end = datetime.datetime.now()
print('time: ', end - start)
print(strategy_record)
if __name__ == '__main__':
single()
# multi()
,StockCode,StockName,Equity,ProfitLoss,PER,MarketCapitalization,PBR,BuyingPrice,SellPrice,BuyingAmount,ProfitLossByStock,InvestmentAmount,Balance,Yield
0,002030,아세아,1225090202229.0,67565442549.0,3.171475522336699,214282147200.0,0.17491132229294026,97800.0,125000.0,102.0,27200.0,9975600.0,12750000.0,27.811860940695297
1,058650,세아홀딩스,2924149208280.0,161892654956.0,3.1872971639154417,516000000000.0,0.17646158360828446,126000.0,133500.0,79.0,7500.0,9954000.0,10546500.0,5.952380952380952
2,001940,KISCO홀딩스,1273968329992.0,77864434261.0,2.956621941518533,230215694800.0,0.18070754930104554,63000.0,65300.0,158.0,2300.0,9954000.0,10317400.0,3.650793650793651
3,000880,한화,14227936000000.0,1288691000000.0,2.0445549284118534,2634799535250.0,0.1851849442709048,35700.0,38350.0,280.0,2650.0,9996000.0,10738000.0,7.42296918767507
4,007860,서연,1072030023657.0,132366474007.0,1.7827205413624674,235972432200.0,0.22011737264132844,10150.0,6480.0,985.0,-3670.0,9997750.0,6382800.0,-36.1576354679803
5,019010,베뉴지,236756098347.0,12783309005.0,4.769735283419287,60973000000.0,0.25753507692391236,12850.0,12800.0,778.0,-50.0,9997300.0,9958400.0,-0.38910505836575876
6,092230,KPX홀딩스,936238978408.0,53425479418.0,4.894772873332309,261505587400.0,0.2793149969516004,63000.0,63000.0,158.0,0.0,9954000.0,9954000.0,0.0
7,023600,삼보판지,329937058742.0,40288485800.0,2.380332695452158,95900000000.0,0.29066149878904834,6860.0,9790.0,1457.0,2930.0,9995020.0,14264030.0,42.711370262390666
8,033160,엠케이전자,593852198159.0,74507668124.0,2.391281644105155,178168819130.0,0.30002215986122605,8360.0,10250.0,1196.0,1890.0,9998560.0,12259000.0,22.607655502392344
9,021820,세원정공,569620475934.0,56809840064.0,3.309285852384124,188000000000.0,0.3300443153693494,18350.0,13700.0,544.0,-4650.0,9982400.0,7452800.0,-25.340599455040874
10,,,,,,,,,,,,,104622930.0,4.8183
,StockCode,StockName,Equity,ProfitLoss,PER,MarketCapitalization,PBR,ROE,BuyingPrice,SellPrice,BuyingAmount,ProfitLossByStock,InvestmentAmount,Balance,Yield
0,008370,원풍,75070172618.0,5235935528.0,10.049779971240318,52620000000.0,0.7009441721648979,6.974721577694294,4505.0,4050.0,2219.0,-455.0,9996595.0,8986950.0,-10.099889012208656
1,119860,다나와,65170505380.0,8935066130.0,10.052978437217229,89824027140.0,1.378292628179708,13.71029130110453,6930.0,17950.0,1443.0,11020.0,9999990.0,25901850.0,159.01875901875903
2,014970,삼륭물산,65649138867.0,9219435245.0,10.073013968004718,92867500000.0,1.4146034754262697,14.043497605776448,6470.0,5500.0,1545.0,-970.0,9996150.0,8497500.0,-14.992272024729521
3,004430,송원산업,354189000000.0,42244000000.0,10.084272322696714,426000000000.0,1.2027476855577106,11.926965546643178,18500.0,29150.0,540.0,10650.0,9990000.0,15741000.0,57.567567567567565
4,017040,광명전기,98063359627.0,11593891042.0,10.111208407111059,117228248575.0,1.1954337381555842,11.822857269115863,2800.0,3620.0,3571.0,820.0,9998800.0,12927020.0,29.28571428571429
5,027710,팜스토리,166916854808.0,12896142588.0,10.173269575747343,131195935035.0,0.7859957293462735,7.726087699671845,1515.0,1300.0,6600.0,-215.0,9999000.0,8580000.0,-14.19141914191419
6,069510,에스텍,124146823459.0,14748421661.0,10.208414395835193,150558000000.0,1.2127414605152778,11.879822012418003,14150.0,10800.0,706.0,-3350.0,9989900.0,7624800.0,-23.674911660777383
7,012200,계양전기,179133111299.0,17233731189.0,10.214851216454122,176040000000.0,0.9827328890981124,9.620628516988308,5500.0,4140.0,1818.0,-1360.0,9999000.0,7526520.0,-24.727272727272727
8,204320,만도,1515053750297.0,210079641643.0,10.237241834478636,2150636096000.0,1.4195114170559329,13.866151059117046,231500.0,231000.0,43.0,-500.0,9954500.0,9933000.0,-0.21598272138228944
9,098660,에스티오,33858491829.0,3213669838.0,10.254857832723014,32955727310.0,0.9733371313890958,9.491473672927961,3865.0,2820.0,2587.0,-1045.0,9998755.0,7295340.0,-27.037516170763258
10,,,,,,,,,,,,,,113013980.0,13.09129
{
"TotalInvestmentAmount": "100000000",
"Balance": "103082220",
"Yield": "3.100435"
}
\ No newline at end of file