对应https://vectorbt.dev/getting-started/resources/的第一篇文章
Performance analysis of Moving Average Crossover,比特币,双均线,参数探测和可视化
需要对python工具包,pandas的series和dataframe有大致了解,否则代码的阅读会比较吃力。
文章概述
一共四部分
第一部分:数据查询和可视化
第二部分:Single window combination,单窗口组合
第三部分:Multiple window combinations,多参数组合测试
第四部分:Strategy comparison,策略比较
第一部分:数据查询和可视化
主要用来验证,数据查询没问题,需要关注复权情况,避免数据没做复权处理,避免分红,配股引入的回测偏差。
1 | 数据查询: |
第二部分:Single window combination,单窗口组合
观察指标的计算和信号的计算,触发等是否符合自己的设计思路,以及那些行情表现好,那些表现差,表现差的能否屏蔽或识别,过滤掉。
1 | 确保无任何空值: |
1 | 信号评估:dmac_entries.vbt.signals.stats(settings=dict(other=dmac_exits)) |
1 | 买卖信号图:(上图所示) |
1 | 多组绩效同列比对 |
1 | 可视化动态dashboard调参: |
第三部分:Multiple window combinations,多参数组合测试
对策略涉及的参数进行提取,并测试这些参数组合,获得最佳的参数组合。
1 | 组合测试: |
交互式图表,以及gif动图的生成,有点复杂了,感觉用处不大,不深究
第四部分:Strategy comparison,策略比较
这一部分不是很懂干嘛用的,这个步骤的目标是什么,多个滚动时间窗口平均更能说明策略好坏?
规避起始-结束时间区间,引入的回测误差,将策略运行周期也看做策略参数,比如,fast-slow-range,5-10-40,就是5日10日的双均线策略,在40日为一个单元情况下的收益分布。
但个人感觉类似40日这样可比性不强,由于波动性随着时间大概率有变化的,所以震荡市向单边市场靠近时,必然导致统计数据不准的情况。所以我也不是非常肯定,这种测试是用来说明什么的。
简单来说,这种策略测试,有意义,但意义不大,只能笼统看做是对策略开始看时间的敏感性测试。或是策略对单笔交易鲁棒性体现指标。
1 | 时间区间回测: |

查看特定fast-slow windows参数组合的收益分布
1 | # Or for example, compare a pair of window combinations using a histogram |

由于每个参数对应50个不同的时间range,所以直方图列取值sum=50,可以近似看做特定参数组合的收益分布情况。
todo:补充,可以绘制各个参数的收益分布情况,可能更明显,选择高均值,低方差的参数组合,只是数据可能较多,100*100个组合。
可以笼统-》细化的思路处理,比如slow:1-》100,分成10个区间,1-》10,10-》20,fast也是类似的,这样可以找出平均收益最大的格子,锁定slow-fast区间,比如slow[10,20],fast:[20-30],之后再二次探测,类似迭代找局部最优解的思路。
用双均线策略和单纯的持有,以及随机买卖策略回测结果比对
1 | pd.DataFrame({ |
首先纵轴的250k是什么?
1 | print(rand_roll_perf.shape) |
其次累积图,有点让人看不懂,不妨改为非累积
1 | pd.DataFrame({ |

颜色上会有遮挡,hold策略收益分布较极端,dmac绿色部分,random对应绿色内部的深色部分。
这个能体现什么呢?也不是很懂,怎么评估优劣?,目前我也没看太懂。
时间维度绘制三种策略的收益变化图(平均收益)
1 | pd.DataFrame({ |

能体现什么信息呢?
大致体现随着时间窗口移动,策略整体有效性(由于上面用的mean平均收益,dmac_roll_perf.groupby(‘split_idx’).mean(),所以可以认为双均线策略的综合有效性)。
不过,由于不同参数的策略其实是完全不同的策略,所以感觉这组数据用来评估策略-时间关联性的说服力并不强。
下面是特定参数组合的例子。大致看出各参数组合策略收益稳定性。这个还是有一定说服力的。
这个重点观察
先选定一组fast-slow windows参数
首先,思考下,本周一启动策略和下周一启动策略,那么策略执行结果相同么?肯定不同,如果本周触发交易信号,则由于交易序列不同,所以形成trads历史不同,最终收益自然也不同(策略对起始时间的敏感性,策略对单笔收益的鲁棒性,是否依靠某一笔收益取得正向结果)。由于我们不能乐观的估计,目前启动策略就一定位于高点上,所以需要采用窗口回测(windows=n)方法,得到一组收益数据。那么这组收益数据,就可以看做,是策略运行一个windows单位的最终收益分布。最优收益,最差收益,平均收益,以及收益稳定性。
所以重点关注这组fast-slow windows参数下:
01,理想的曲线时,都在0轴上方,越向上越好,均值大,波动小
02,是否稳定0轴上方, 如果0附近随机波动,说明类似掷筛子,如果有正均值还行,负均值就不理想了。
03,最高,最低点距离,希望波动小,波动大了,很可能今天进去,恰好赶上最差的周期,windows天后,悲提最差收益。
04,收益权限最高点,对应windows时间区间行情长相,说明策略对这一类行情有偏好。想办法筛选出。
同理,收益最低点,对应windows时间区间行情长相,说明策略对这一类行情有排斥。想办法过滤掉。