ETF定投数据分析7——模拟交易系统开发

之前写的模拟交易程序,把整个过程放到一个函数里,好几百行,全是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:
       
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值