回测中使用的模块
QAStrategy
示例
Quantaxis
版本为 1.10.19。仍以 MACD_JCSC
策略进行回测。
创建 Strategy 类回测
在原 QAStrategy
回测文档中,多使用在 on_bar
函数中处理每一条 bar
数据,生成指标或回测信号。如下例代码所示的回测。
1 | from QAStrategy.qastockbase import QAStrategyStockBase |
但对于像MACD
这类指标,会使用前N天(比如26天)的数据进行计算,在生成market_data
时,该数据在回测时即提取的历史数据源,在模拟/实盘时为行情数据。根据它的定义 1
2
3
4
5
6
7
def market_data(self):
if self.running_mode == 'sim':
return self._market_data
elif self.running_mode == 'backtest':
return pd.concat(self._market_data[-100:], axis=1, sort=False).TMACD
时,指标会随着数据的更新发生一些变化。
- 但数据不足100条时的计算情况
1 | DIFF DEA MACD CROSS_JC CROSS_SC ZERO |
- 数据大于100条后的计算情况
1 | DIFF DEA MACD CROSS_JC CROSS_SC ZERO |
而且每次调用on_bar
,都需要对指标进行一次计算。 所以考虑在QAStragety
类自带的user_init
中先统一根据所有数据计算完并生成信号后,再在on_bar
中判断信号出现与否,再完成下单动作。修改代码如下:
1 | from QAStrategy.qastockbase import QAStrategyStockBase |
修改前完成单只股票5年半的回测需要 33.95秒, 而修改后仅需 25.71秒。
回测结果
回测的结果可以直接在终端上可见,也可以能过 Web
方式(http://127.0.0.1:81/) 查询。
风险分析
1 | { |
绩效分析
1 | { |
回测中遇到的问题
回测使用的 pandas
版本为 2.2以上,比 Quantaxis
发布时使用的版本要高得多,所以在回测时会遇到大量用法未来会舍弃的告警。如:
①FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use
ser.iloc[pos]
②FutureWarning: 'M' is deprecated and will be removed in a future version, please use 'ME' instead.
③Removed deprecated Series.iteritems(), DataFrame.iteritems() and HDFStore.iteritems() use obj.items instead (GH 45321)
④FutureWarning: Series.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
⑤FutureWarning: The 'axis' keyword in DataFrame.groupby is deprecated and will be removed in a future version.
可以有两种办法解决。
屏蔽告警
1
2import warnings
warnings.filterwarnings('ignore')根据告警中的提示修改源代码以符合未来版本的要求。 我在所修改的部分,都加注了详细的文档注解,方便以后回溯。具体改动在 [[Quantaxis适配pandas2.x的修改]]。