之前写的模拟交易程序,把整个过程放到一个函数里,好几百行,全是if else,导致有问题我也很难找出来。现在打算重写。看了一些网上的资料和开源框架,模拟交易主要有for循环模式和事件驱动模式两种方式,前者速度较快,实现简单,但移植到实盘交易系统里需要重新修改很多。后者速度慢,实现复杂,但可以很方便的用于实盘交易。由于我不是搞高频交易,只是研究,就用for循环模式吧。画了个流程图。
从图里可以分出这么几个模块:市值计算模块,止盈判断模块,止盈操作模块,退出止盈模块,正常交易模块,数据更新模块,计算回测数据模块。其中会变动的主要是止盈判断,止盈操作,退出止盈模块,其它的变动较小。写一个类吧。
新建了一个simulate分支,建立模拟程序框架。
# -*- coding:utf-8 -*-
# 模拟交易程序
class simulate(object):
def __init__(self, totalTimes):
self.tradeTimes = 0 #已经交易次数
self.totalTimes = totalTimes
pass
# 计算持仓股票市值
def getValue(self):
pass
# 判断是否进行止盈操作
def isStopProfit(self):
pass
# 进行止盈操作
def doStopProfit(self):
pass
# 进行交易
def doTrade(self):
pass
# 判断是否需要重新购买
def isReturnBuy(self):
pass
# 用止盈的钱重新购买etf
def doReturnBuy(self):
pass
# 更新相关数据
def updateData(self):
pass
#计算回测指标
def getIndex(self):
pass
# 执行交易循环
def run(self):
while self.tradeTimes < self.totalTimes:
self.getValue()
if self.isStopProfit():
self.doStopProfit()
else:
if self.isReturnBuy():
self.doReturnBuy()
else:
self.doTrade()
self.updateData()
self.tradeTimes += 1
self.getIndex()
if __name__ == "__main__":
test = simulate(10)
test.run()
现在就往里面填东西吧。
先把不带止盈操作的交易程序给写出来,然后画收益率的图看看。
跟之前的差不多了,接下来就是难点,进行止盈操作,和回测数据计算了。
距离上次发博文过了很长时间,一方面是我去参加华南口腔展,另一方面是我被卡主了,程序老也调不对。我还在知乎上提问,有大神建议我不要用收益率做止盈止损指标,用股价做指标比较好。又大改程序,主要是止盈和停止止盈的程序,以及计算收益率等数据的程序。
# 执行交易循环
def run(self):
for days in range(self.totalTimes):
if days % self.freq == 0: #进行交易
self.doTrade(days)
else:
for code in range(2):
self.update(code, days)
# print("位置a", days, self.value[0][days], self.cost[0][days], self.rate[0][days], self.value[1][days], self.cost[1][days], self.rate[1][days], self.totalrate[days])
if days == 0: