扫地僧教程中的多股操作定期再平衡案例,是一种多因子选股策略,它是在backtrader内部,定期选股,确定各股权重(采用的是等权法)。
另外一个思路是,将选股和确定权重的逻辑在backtrader外部做,形成类似如下的调仓表,该表按月调仓(再平衡),并给出了各选定股票的权重:
然后再将调仓表传给 Backtrader ,让 Backtrader 读取调仓表上的信息,进行策略回测。调仓表上存的选股结果,其实就是每个调仓日应该持有哪些股票以及对应的持仓权重。
以下给出策略源码,核心思想是:
- 在 __init__() 中一次性读入调仓表,从调仓表中提取出调仓日期;
- 在 next() 中判断当前回测时间点是否为调仓日:如果是调仓日,对被剔除的标的进行平仓,买入新增的标的;如果是非调仓日,不触发下单操作。
import backtrader as bt
import pandas as pd
import datetime
# 回测策略
class StockSelectStrategy(bt.Strategy):
'''多因子选股 - 基于调仓表'''
def __init__(self):
# 读取调仓表,表结构如下所示:
# trade_date sec_code weight
# 0 2019-01-31 000006.SZ 0.007282
# 1 2019-01-31 000008.SZ 0.009783
# ... ... ... ...
# 2494 2021-01-28 688088.SH 0.007600
self.buy_stock = pd.read_csv("./data/trade_info.csv", parse_dates=['trade_date'])
# 读取调仓日期,即每月的最后一个交易日,回测时,会在这一天下单,然后在下一个交易日,以开盘价买入
se