之前写的模拟交易程序,把整个过程放到一个函数里,好几百行,全是if else,导致有问题我也很难找出来。现在打算重写。看了一些网上的资料和开源框架,模拟交易主要有for循环模式和事件驱动模式两种方式,前者速度较快,实现简单,但移植到实盘交易系统里需要重新修改很多。后者速度慢,实现复杂,但可以很方便的用于实盘交易。由于我不是搞高频交易,只是研究,就用for循环模式吧。画了个流程图。
从图里可以分出这么几个模块:市值计算模块,止盈判断模块,止盈操作模块,退出止盈模块,正常交易模块,数据更新模块,计算回测数据模块。其中会变动的主要是止盈判断,止盈操作,退出止盈模块,其它的变动较小。写一个类吧。
新建了一个simulate分支,建立模拟程序框架。
1 | # -*- coding:utf-8 -*- |
现在就往里面填东西吧。
先把不带止盈操作的交易程序给写出来,然后画收益率的图看看。
跟之前的差不多了,接下来就是难点,进行止盈操作,和回测数据计算了。
距离上次发博文过了很长时间,一方面是我去参加华南口腔展,另一方面是我被卡主了,程序老也调不对。我还在知乎上提问,有大神建议我不要用收益率做止盈止损指标,用股价做指标比较好。又大改程序,主要是止盈和停止止盈的程序,以及计算收益率等数据的程序。
1 | # 执行交易循环 |
先说下我止盈和停止止盈的策略:当股价从最高点下跌10%,卖出存量股票的一半,再下跌10%,再卖剩下的一半,直到股票数量不足一手的时候停止。当进行了止盈操作,股价从最低点上涨10%,用之前止盈累计剩下的钱中的一半以现价买入股票,再涨10%,再买一半,直到剩下的钱不够买一手时停止。止盈操作不影响正常按期定投。止盈点和停止止盈点(在上面是10%)可以自行设定。
1 | # 判断是否进行止盈操作,根据days前的交易情况,code为0或1 |
再看计算收益率,一开始我还是用市值/成本的方法,结果一止盈收益率就急降,后来把计算方法改成(市值+止盈得到的钱-手续费)/成本,看起来就差不多了。但画出图来感觉还是有问题,跟完全不止盈效果也差不多啊。
这是单独看两个etf的股价和收益率变化情况。
尤其纳指etf,怎么低那么多?
总的收益率
感觉还有问题,再仔细看看。另外可以开始写计算回测指标的程序了。之前写的感觉有问题,打算重来。
完整代码:https://github.com/zwdnet/etfdata/blob/simulate/simulate.py
我发文章的三个地方,欢迎大家在朋友圈等地方分享,欢迎点“好看”。谢谢。
我的个人博客地址:https://zwdnet.github.io
我的CSDN博客地址:https://blog.csdn.net/zwdnet
我的微信个人订阅号:赵瑜敏的口腔医学学习园地