以下策略来自我们编写的教程和视频课程。
多股组合操作,是一种高级的操作模式。多股组合操作通常有两种模式,一种是定期调仓,即定期再平衡,比如每周1调仓,或每月1号调仓等。另一种是非定期调仓,比如每日判断,进行调仓,或者每隔n天进行调仓。
定期调仓(再平衡)通常通过定时器timer来进入调仓逻辑,而非定期调仓通常通过传统的策略next方法进入调仓逻辑。当然,这并非绝对。
这两种多股调仓操作,都不能用backtrader内置的自动确定最小期的方法来做(比如为了求20日均线,自动跳过前20个bar),因为有些股票有交易的日期很靠后,它的最小期很大,其他股票也会采用这个最小期,这会导致其他股票浪费最小期前的数据,因此,必须自己控制最小期,也就是prenext方法里必须写上self.next()直接跳转到next。然后如果用到了比如5日均线这样的指标,你要自己判断数据对象线长度是否够长。下面的案例策略没有用到此类技术指标,因此没有判断线长,理论上从第一根bar就可执行逻辑。
尽管网上有一个用backtrader执行多股组合回测的案例,但并未很好地处理好多股回测中的一些问题。本文将给出完善的处理方案。
(基于next的非定期再平衡的策略实现请参考我们编写的教程和视频课程)
本文介绍基于定时器timer的多股定期再平衡策略的实现.
本案例的目的是介绍使用backtrader进行组合管理时,要注意的一些技术要点,策略本身仅供参考。策略的大致逻辑如下:每年5月1日,9月1日,11月1日进行组合再平衡操作(若该日休市,则顺延到开市日进行再平衡操作)。
首先加载一组股票(股票池),在再平衡日,从股票池挑出至少上市3年,且净资产收益率roe>0.1,市盈率 pe在0到100间的股票,这组选出的股票再按成交量从大到小排序,选出前100只股票(如果选出的股票少于100只,则按实际来),将全部账户价值按等比例分配买入这些股票。
该策略反应了如下几个技术要点,把这些要点整明白,基本上就可用于实战了,代码更详细的解读特别是定时器timer的用法参考我们编写的教程和视频课程:
1 扩展PandasData类
2 第一个数据应该对应指数,作为时间基准
3 数据预处理:删除原始数据中无交易的及缺指标的记录
4 先平仓再执行后续买卖
5 下单量的计算方法
6 如何保证先卖后买以空出资金
7 怎样按明日开盘价计算下单数量
8 为行情数据对象提供名字
9 买卖数量如何设为100的整数倍
10 设置符合中国股市的佣金模式,考虑印花税
11 涨跌停板的处理
# 考虑中国佣金,下单量100的整数倍,涨跌停板,滑点
# 考虑一个技术指标,展示怎样处理最小期问题
from datetime import datetime, time
from datetime import timedelta
import pandas as pd
import numpy as np
import backtrader as bt
import os.path # 管理路径
import sys # 发现脚本名字(in argv[0])
import glob
from backtrader.feeds import PandasData # 用于扩展DataFeed
# 创建新的data feed类
class PandasDataExtend(PandasData):
# 增加线
lines = ('pe', 'roe', 'marketdays')
params = (('pe', 15),
('