backtrader换手率筛选策略回测

Oliver xu

知乎上看到一个量化策略,一直没时间,现在回测一下看看效果,是基于换手率,量比等数据进行的筛选股票的策略

买入策略

  1. 1.0<涨跌幅<5.0
  2. 量比>1.0
  3. 5.0<换手率<10.0
  4. 50e8<流通市值<200e8

卖出策略

  1. 当前价格大于买入价格的10%

构造数据

因为backtrader默认只有6列数据,不能自动扩展源数据(还没深入学习,不知道这样设计的好处),所以添加数据必须使用元编程的方式,修改backtrader.feeds.PandasData类中的属性,创建出一个新的类。

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
# 扩展数据元编程-类
class Addmoredata(PandasData):
lines = ('amountofincrease','turnoverrate')
params = (('amountofincrease',6),('turnoverrate',7))#值得注意的是,这个序号一定要写对,默认从index6开始

# 构造akshare数据获取函数,包括换手率,量比的计算
def akshare_data_get(code, adjust, start_date, end_date):
# 构造akshare数据获取函数,包括换手率,量比的计算
stock_hfq_df = ak.stock_zh_a_hist(symbol=code, adjust=adjust, start_date=start_date, end_date=end_date).iloc[:, [0, 1, 2, 3, 4, 5, 8, 10]]
stock_hfq_df.columns = [
'date',
'open',
'close',
'high',
'low',
'volume', # 成交量
# 'turnover', # 成交额
# 'quantityrelativeratio', #量比
'amountofincrease', # 涨跌幅
'turnoverrate' #换手率
]
# 把 date 作为日期索引,以符合 Backtrader 的要求
stock_hfq_df.index = pd.to_datetime(stock_hfq_df['date'])
# pdb.set_trace()
stock_hfq_df.to_csv(code+'.csv')
start_date = datetime(int(start_date[0:4]), int(start_date[4:6]), int(start_date[6:8])) # 回测开始时间
end_date = datetime(int(end_date[0:4]), int(end_date[4:6]), int(end_date[6:8])) # 回测结束时间
data = Addmoredata(dataname=stock_hfq_df, fromdate=start_date, todate=end_date) # 规范化数据格式
print("下载并构造好了数据")
return data, start_date, end_date

设置买入卖出策略

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# 定义策略       
class MyStrategy(bt.Strategy):
"""
主策略程序
"""
params = (("n_days_before", 12),
('printlog', True),) # 全局设定交易策略的参数, maperiod是 MA 均值的长度

def __init__(self):
"""
初始化函数
"""
self.data_close = self.datas[0].close # 指定价格序列
self.data_turnoverrate = self.datas[0].turnoverrate
self.data_amountofincrease = self.datas[0].amountofincrease
self.data_low = self.datas[0].low
# 初始化交易指令、买卖价格和手续费
self.order = None
self.buy_price = None
self.buy_comm = None
# 添加移动均线指标
# self.sma = bt.indicators.SimpleMovingAverage(
# self.datas[0], period=self.params.maperiod
# )

def next(self):
"""
主逻辑
"""

# self.log(f'收盘价, {data_close[0]}') # 记录收盘价
if self.order: # 检查是否有指令等待执行,
return
# 检查是否持仓
if not self.position: # 没有持仓
# pdb.set_trace()
# print(self.datas[0].datetime.date(0))
# 获取当前的资金
sizer = self.broker.get_cash() / self.datas[0].close[0]
# print("sizer: ", sizer)
# print("当前现金为:", sizer * self.datas[0].close[0])
# print("当前收盘价为:", self.datas[0].close[0])
# print("计算出来的sizer为:", sizer)
# 执行买入条件判断:收盘价格上涨突破15日均线
if self.data_close[0] > self.data_low[0] and 1<self.data_amountofincrease[0]<5 and 5<self.data_turnoverrate[0]<10:
# 执行买入
self.order = self.buy(size=sizer // 100 * 100, price=self.datas[0].close[0])
print("######", self.datas[0].datetime.date(0))
# pdb.set_trace()
else:
# print(self.datas[0].datetime.date(0))
sizer = self.broker.getposition(data = self.datas[0]).size
# 获取当前持仓的手股数
# print("当前持仓为:", sizer)
# print(50*'#')
# pdb.set_trace()
# print(self.data_close[0])
# print(self.broker.getposition(data = self.datas[0]).size)
# print(self.datas[0])
# 当前价格大于买入价格的10%则卖出
if self.data_close[0] > (1.0+0.01) * self.buyprice:
# 这里buyprice需要检查一下是否是购买的价格
# print("买入价格", self.buyprice)
# print(50*'#')
# self.log("SELL CREATE, %.2f" % self.data_close[0])
# 执行卖出
self.order = self.sell(size=sizer, price=self.datas[0].close[0])
# self.order = self.order_target_percent(target=0.9)

回测结果

002212这个股票进行回测,利用其2010010120221031的数据,初始资金10万元。

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
下载并构造好了数据
期初总资金: 100000.00
###### 2010-01-12
2010-01-13, 买入价格:8.78
2010-01-13, 买入股数:11300.00
2010-01-13, 买入成本:-99214.00
2010-01-13, 手续费:-49.61
2010-01-14, 卖出价格:9.07
2010-01-14, 卖出股数:-11300.00
2010-01-14, 卖出成本:102491.00
2010-01-14, 手续费:-153.74
2010-01-14, 策略收益:
毛收益 3277.00, 净收益 3073.66
2010-01-14, ##################################################
###### 2010-01-22
2010-01-25, 买入价格:9.49
2010-01-25, 买入股数:10800.00
2010-01-25, 买入成本:-102492.00
2010-01-25, 手续费:-51.25
2010-11-22, 卖出价格:9.79
2010-11-22, 卖出股数:-10800.00
2010-11-22, 卖出成本:105732.00
2010-11-22, 手续费:-158.60
2010-11-22, 策略收益:
毛收益 3240.00, 净收益 3030.16
2010-11-22, ##################################################
###### 2010-12-01
2010-12-02, 买入价格:10.79
2010-12-02, 买入股数:9800.00
2010-12-02, 买入成本:-105742.00
2010-12-02, 手续费:-52.87
2010-12-16, 卖出价格:10.99
2010-12-16, 卖出股数:-9800.00
2010-12-16, 卖出成本:107702.00
2010-12-16, 手续费:-161.55
2010-12-16, 策略收益:
毛收益 1960.00, 净收益 1745.58
2010-12-16, ##################################################
###### 2010-12-16
2010-12-17, 买入价格:11.24
2010-12-17, 买入股数:9500.00
2010-12-17, 买入成本:-106780.00
2010-12-17, 手续费:-53.39
2010-12-21, 卖出价格:11.39
2010-12-21, 卖出股数:-9500.00
2010-12-21, 卖出成本:108205.00
2010-12-21, 手续费:-162.31
2010-12-21, 策略收益:
毛收益 1425.00, 净收益 1209.30
2010-12-21, ##################################################
###### 2011-02-24
2011-02-25, 买入价格:10.98
2011-02-25, 买入股数:9900.00
2011-02-25, 买入成本:-108702.00
2011-02-25, 手续费:-54.35
2011-03-15, 卖出价格:11.14
2011-03-15, 卖出股数:-9900.00
2011-03-15, 卖出成本:110286.00
2011-03-15, 手续费:-165.43
2011-03-15, 策略收益:
毛收益 1584.00, 净收益 1364.22
2011-03-15, ##################################################
###### 2011-04-21
2011-04-22, 买入价格:11.02
2011-04-22, 买入股数:10000.00
2011-04-22, 买入成本:-110200.00
2011-04-22, 手续费:-55.10
2015-04-20, 卖出价格:11.40
2015-04-20, 卖出股数:-10000.00
2015-04-20, 卖出成本:114000.00
2015-04-20, 手续费:-171.00
2015-04-20, 策略收益:
毛收益 3800.00, 净收益 3573.90
2015-04-20, ##################################################
###### 2015-04-21
2015-04-22, 买入价格:10.90
2015-04-22, 买入股数:10400.00
2015-04-22, 买入成本:-113360.00
2015-04-22, 手续费:-56.68
2015-04-23, 卖出价格:11.25
2015-04-23, 卖出股数:-10400.00
2015-04-23, 卖出成本:117000.00
2015-04-23, 手续费:-175.50
2015-04-23, 策略收益:
毛收益 3640.00, 净收益 3407.82
2015-04-23, ##################################################
###### 2015-12-03
2015-12-04, 买入价格:12.56
2015-12-04, 买入股数:9300.00
2015-12-04, 买入成本:-116808.00
2015-12-04, 手续费:-58.40
2015-12-08, 卖出价格:13.23
2015-12-08, 卖出股数:-9300.00
2015-12-08, 卖出成本:123039.00
2015-12-08, 手续费:-184.56
2015-12-08, 策略收益:
毛收益 6231.00, 净收益 5988.04
2015-12-08, ##################################################
###### 2015-12-18
2015-12-21, 买入价格:13.45
2015-12-21, 买入股数:9100.00
2015-12-21, 买入成本:-122395.00
2015-12-21, 手续费:-61.20
2015-12-22, 卖出价格:13.76
2015-12-22, 卖出股数:-9100.00
2015-12-22, 卖出成本:125216.00
2015-12-22, 手续费:-187.82
2015-12-22, 策略收益:
毛收益 2821.00, 净收益 2571.98
2015-12-22, ##################################################
###### 2015-12-22
2015-12-23, 买入价格:13.92
2015-12-23, 买入股数:9000.00
2015-12-23, 买入成本:-125280.00
2015-12-23, 手续费:-62.64
2015-12-31, 卖出价格:14.40
2015-12-31, 卖出股数:-9000.00
2015-12-31, 卖出成本:129600.00
2015-12-31, 手续费:-194.40
2015-12-31, 策略收益:
毛收益 4320.00, 净收益 4062.96
2015-12-31, ##################################################
###### 2016-02-22
2016-02-23, 买入价格:8.96
2016-02-23, 买入股数:14500.00
2016-02-23, 买入成本:-129920.00
2016-02-23, 手续费:-64.96
2016-03-22, 卖出价格:9.08
2016-03-22, 卖出股数:-14500.00
2016-03-22, 卖出成本:131660.00
2016-03-22, 手续费:-197.49
2016-03-22, 策略收益:
毛收益 1740.00, 净收益 1477.55
2016-03-22, ##################################################
###### 2016-04-11
2016-04-12, 买入价格:11.15
2016-04-12, 买入股数:11700.00
2016-04-12, 买入成本:-130455.00
2016-04-12, 手续费:-65.23
2016-08-18, 卖出价格:12.29
2016-08-18, 卖出股数:-11700.00
2016-08-18, 卖出成本:143793.00
2016-08-18, 手续费:-215.69
2016-08-18, 策略收益:
毛收益 13338.00, 净收益 13057.08
2016-08-18, ##################################################
###### 2016-09-06
2016-09-07, 买入价格:15.40
2016-09-07, 买入股数:9300.00
2016-09-07, 买入成本:-143220.00
2016-09-07, 手续费:-71.61
2016-09-08, 卖出价格:15.72
2016-09-08, 卖出股数:-9300.00
2016-09-08, 卖出成本:146196.00
2016-09-08, 手续费:-219.29
2016-09-08, 策略收益:
毛收益 2976.00, 净收益 2685.10
2016-09-08, ##################################################
###### 2016-09-22
2016-09-23, 买入价格:15.52
2016-09-23, 买入股数:9400.00
2016-09-23, 买入成本:-145888.00
2016-09-23, 手续费:-72.94
2016-09-26, 卖出价格:15.83
2016-09-26, 卖出股数:-9400.00
2016-09-26, 卖出成本:148802.00
2016-09-26, 手续费:-223.20
2016-09-26, 策略收益:
毛收益 2914.00, 净收益 2617.85
2016-09-26, ##################################################
###### 2016-10-25
2016-10-26, 买入价格:17.01
2016-10-26, 买入股数:8800.00
2016-10-26, 买入成本:-149688.00
2016-10-26, 手续费:-74.84
2016-11-07, 卖出价格:18.90
2016-11-07, 卖出股数:-8800.00
2016-11-07, 卖出成本:166320.00
2016-11-07, 手续费:-249.48
2016-11-07, 策略收益:
毛收益 16632.00, 净收益 16307.68
2016-11-07, ##################################################
###### 2016-11-14
2016-11-15, 买入价格:19.50
2016-11-15, 买入股数:8500.00
2016-11-15, 买入成本:-165750.00
2016-11-15, 手续费:-82.88
2017-11-02, 卖出价格:20.39
2017-11-02, 卖出股数:-8500.00
2017-11-02, 卖出成本:173315.00
2017-11-02, 手续费:-259.97
2017-11-02, 策略收益:
毛收益 7565.00, 净收益 7222.15
2017-11-02, ##################################################
###### 2017-12-01
2017-12-04, 买入价格:22.40
2017-12-04, 买入股数:7700.00
2017-12-04, 买入成本:-172480.00
2017-12-04, 手续费:-86.24
2020-01-23, 卖出价格:22.74
2020-01-23, 卖出股数:-7700.00
2020-01-23, 卖出成本:175098.00
2020-01-23, 手续费:-262.65
2020-01-23, 策略收益:
毛收益 2618.00, 净收益 2269.11
2020-01-23, ##################################################
###### 2022-10-14
2022-10-17, 买入价格:10.48
2022-10-17, 买入股数:16700.00
2022-10-17, 买入成本:-175016.00
2022-10-17, 手续费:-87.51
2022-10-18, 卖出价格:10.94
2022-10-18, 卖出股数:-16700.00
2022-10-18, 卖出成本:182698.00
2022-10-18, 手续费:-274.05
2022-10-18, 策略收益:
毛收益 7682.00, 净收益 7320.44
2022-10-18, ##################################################
###### 2022-10-31
2022-10-31, (与前12日数据对比) 期末总资金 182984.58
期末总资金: 182984.58

分析

12年内80%的收益率,看来效果并不是很好,但是本策略是短线策略。

后续计划

  1. 输出每一笔的持仓时间,因为是做短线策略,所以持仓时间很重要,将参数设置为1%,则持仓时间都不是很高
  2. 对所有股票进行回测分析
  • 标题: backtrader换手率筛选策略回测
  • 作者: Oliver xu
  • 创建于 : 2022-11-03 22:09:48
  • 更新于 : 2024-11-20 21:07:04
  • 链接: https://blog.oliverxu.cn/2022/11/03/换手率筛选策略回测/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论