20200114写了份作业,以下是需要作业需要完成的功能:
采用面向对象程序设计的思想,设计并完成证券量化策略回测平台的模拟交易功能:
设计交易账户,在创建之初指定初始资产;
根据策略产生的交易指令(见指令文档)和当天的市场行情数据,进行买入、卖出操作,
记录每条交易记录的详细信息
(交易日期、交易类型、标的、价格、数量、佣金、契税、总费用),
能以一个文件形式进行输出;
能记录并输出账户每日证券市值、剩余现金、总资产。
pandas库、numpy库、csv库。
读入文件就用了pandas库的read_csv函数,pd.read_csv(‘文件路径’)就可以读取文件:
dt = pd.read_csv('../ldays/2016-01-04.csv')
要输出文件我是在其他大佬的博客上面学到的:
具体格式如下,其中writerow的意思是输出的时候有四列(ABCD),第一个open函数里面newline=""的意思就是输出的时候不要多输出一行新的行,删掉这个就会发现你输出的东西是间隔一行写的。而且有时候需要在open里面加一个参数(encoding=“utf8”,具体的解码方式按照具体情况,用不用也要看当时的电脑环境,我用了输出的东西反倒是乱码)
f = open('x.csv', 'w', newline="")
mr = csv.writer(f)
mr.writerow(["A", "B", "C", "D"])
在python类里面新建一个对象初始化要用固定的__init__()函数:
def __init__(self, num): # 初始化账户金额
self.remainingCash = num
而且类里面的所有函数如果用到了类里面的成员变量,都必须加一个self变量,就跟上面的初始化一样,写在最前面,不过最后每个函数都这么写叭,免得忘记了又不知道哪里出了问题。
上学期学了c++,里面的this指针感觉跟这个self有一些共同之处,有兴趣的可以去了解一下。
按照功能的不同,我设计了三个类:
class taccount:
remainingCash = 1000000
def __init__(self, num): # 初始化账户金额
self.remainingCash = num
def buy(self, day, code, amount): # 买入
def sell(self, day, code): # 卖出
def marketvalue(self, day):
def total(self, day):
买卖的函数都在account类里面,day就是买入的时间,code就股票代码,amount就是数量。具体函数如下:
def buy(self, day, code, amount):
for iNum in range(self.numLen):
if (self.code[iNum] == code):
shares = findprice(day, code)
turnover = shares * amount
commission = max(5, turnover * 0.0003)
self.rCash -= (turnover + commission)
self.num[iNum] += amount
information.writerow \
([day, "BUY", code, shares, amount, commission, 0, commission])
break
return
def sell(self, day, code):
for iNum in range(self.numLen):
if self.code[iNum] == code:
if self.num[iNum] == 0:
return
shares = findprice(day, code)
turnover = self.num[iNum] * shares
commission = max(5, turnover * 0.0003)
stampDuty = 0.001 * turnover
self.rCash += (turnover - commission - stampDuty)
self.num[iNum] = 0
information.writerow([day, "SELL", code, shares, amount, commission, stampDuty, commission + stampDuty])
break
return
emmm还有一个就是我在读取每日股票价格的时候用到的方法:
#查询当日股价的函数
def findprice(self, day, name1):
filename = '../ldays/' + day + '.csv'
#先把文件名用python自带的字符串拼接方式拼好然后再读取
info = pd.read_csv(filename)
for i in range(info.__len__()):
if info['ts_code'][i] == name1:
return info['close_adj'][i]
想到什么再补充什么把
有问题可以发送邮件交流讨论
[email protected]