量化投资学习笔记04——回测实盘策略

首先来个免责声明:本文所有策略均不构成投资建议!
这次我们来回测一下一个实盘策略看看。这是我自己的实盘策略,执行了一年半了:每个月定投三次,每次1000元。定投标的有两个:300ETF(510300)和纳指ETF(513100)。资金平分。我从去年2月开始实盘执行该策略。实盘之前并没有执行很完善的回测,只是下载了两个etf的历史数据,然后计算了二者的相关系数,发现二者相关性很低。想着可以互相对冲。这就是这个策略的基本逻辑。执行的过程中很不严格,开始时是每月定投一次,买的时候也不是严格的平分资金,最后,当A股涨了一段时间后开始回撤,我有点担心了,分批”止盈”了300etf持仓的3/4,只留了1/4。定投继续。事实证明我是跑早了。这也是我学量化投资的原因之一。

300ETF的收益率计算有问题,可能没把我止盈退出的钱计算在内。
现在开始用pyalgotrade框架来回测这个策略,用上次封装好的类。有一个问题是之前的策略包括文档教程里的策略都是只有一个标的物,而我这次要回测的策略有两个标的。
搜了一下,找到答案(https://stackoverflow.com/questions/40728678/pyalgotrade-multiple-tickers
https://groups.google.com/forum/m/#!topic/pyalgotrade/s45Dy39vimk
后一个可能需要科学上网)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def onBars(self, bars):
# 每八个交易日交易一次
if self.__t < 8:
self.__t += 1
return
self.__t = 0
brk = self.getBroker()
shares = 100
# 策略买入
if len(self.__instrument) == 2:
for inst in self.__instrument:
price = bars[inst].getPrice()
if brk.getCash() < price*shares:
self.info("现金不足")
return
self.__position = self.enterLong(inst, shares, True)
self.__cost += brk.getCommission().calculate(brk, price, shares)

然后在主程序里这么创建并运行回测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
if __name__ == '__main__':
bt = Backtesting(["510300", "513100"], 2018, 2019, MyStrategy, cash = 100000)
strategy = bt.getStrategy()
strategy[0].run()
strategy[1].run()
result = bt.getResult()
bt.outputResult()
print("期末总资产%.2f" % strategy[0].getResult())
bt.drawResult("test.png")
​```
回测结果
![](https://zymblog-1258069789.cos.ap-chengdu.myqcloud.com/blog0178-QTLearn/04/02.jpg)
![](https://zymblog-1258069789.cos.ap-chengdu.myqcloud.com/blog0178-QTLearn/04/03.png)
还是不放心,再到聚宽里回测一下看看
​```python
def initialize(context):
run_daily(period,time='every_bar')
g.security = ['510300.XSHG','513100.XSHG']
set_option('use_real_price', True)
set_order_cost(OrderCost(open_tax=0, close_tax=0.000, open_commission=0.0003, close_commission=0.0003, close_today_commission=0, min_commission=0), type='stock')
set_slippage(FixedSlippage(0.0))
set_benchmark("510300.XSHG")
#set_benchmark("513100.XSHG")
g.t = 0
def period(context):
if g.t >= 8:
for stock in g.security:
print(stock)
order(stock, 100)
g.t = 0
g.t = g.t + 1

回测结果:

可以看到策略收益率,最大回测等指标还是近似的,但是夏普比例,阿尔法、贝塔,信息比率等数据就差别很大了。咋办?再找本书用上面的原始数据回测一下看看吧。
本次程序的代码:
https://github.com/zwdnet/MyQuant/tree/master/04

我发文章的三个地方,欢迎大家在朋友圈等地方分享,欢迎点“在看”。
我的个人博客地址:https://zwdnet.github.io
我的知乎文章首页: https://www.zhihu.com/people/zhao-you-min/posts
我的博客园博客地址: https://www.cnblogs.com/zwdnet/
我的微信个人订阅号:赵瑜敏的口腔医学学习园地

欢迎打赏!感谢支持!