生活小技能:科学地股票选股策略

多种选股策略介绍

1.1 彼得林奇PEG价值选股策略

策略思路:

1.选择PEG < 0.5, 即稳定成长且价值被低估的股票
其中PEG = PE / growth_rate
2.使用ES风险平价配权
3.根据组合的日内波动小于3%的条件, 与货币基金组合配资
4.最大持仓5只股票和1只货币基金, 优先买入市值小的, 15天调仓一次
5.剔除了周期性和项目类行业(该部分对改善回撤有明显的效果)

1.2 詹姆斯.奥肖内西价值投资法

策略选股

A. 股票的市值大于市场的中位数
B. 股票的股本大于市场的中位数
C. 股票的市现率大于0,从小到大排列,取前400只股票
D. 股票的市销率大于0,从小到大排列,取前400只股票
E. 股票的股息率从大到小排列,取前400只股票
F. 取上述5个条件满足下的前30只股票

交易方式:
按月调仓

止损方式
A. 当个股价格低于成本价的7%时,卖出该股票
B. 当5日内大盘下跌13%时,卖出所有股票

1.3 阿梅特·欧卡莫斯集中投资法则

A 三年平均营业收入成长率大于市场平均值的60%
B.三年平均税后利润成长率大于市场平均值的60%
C 三年平均自由现金流量成长率大于市场平均值的60%
D ROE 大于市场平均值的60%
E 管理层持股比例增加或者高于市场平均值的60%(缺少数据)
F 市净率小于4.0 倍
G 市盈率小于30 倍
H 满足上述条件下股票池中前30只股票

交易方式:
按月调仓

止损方式:
A. 当个股价格低于成本价的7%时,卖出该股票
B. 当5日内大盘下跌13%时,卖出所有股票

1.4 本杰明格雷厄姆企业主投资法

策略选股:

A.股票的市盈率大于0,且选取市盈率最低的400只股票
B.股票的市净率大于0且小于2.5,且选取市净率最低的400只股票
C.企业的流动资产至少是流动负债的1.2 倍
D.企业的总借款不超过净流动资产的1.5 倍
E.企业净利润大于0
F.最近一期现金股利大于0
G.净利润增长率从大到小排序,选取前400只股票
H. 满足于上述7个条件下的前30只股票

交易方式:
按月调仓

止损方式:
A. 当个股价格低于成本价的7%时,卖出该股票
B. 当5日内大盘下跌13%时,卖出所有股票

1.5 史蒂夫·路佛价值选股法则

策略选股:

A 市净率大于0且低于全市场平均值,股票按市净率从小到大排列
B.市盈率大于0且低于全市场平均值,股票按市盈率从小到大排列
C 流动资产至少是总市值的30%
D 股价现金流量比大于0且低于全市场平均值,股票按股价现金流量从小到大排列
E 长期借款占总资本比率低于50%
F 流动比率高于全市场平均值,股票按流动比率从大到小排列
G 满足上述条件下股票池中前30只股票

交易方式:
按月调仓

止损方式:
A. 当个股价格低于成本价的7%时,卖出该股票
B. 当5日内大盘下跌13%时,卖出所有股票

1.6戴维•波伦价值型系统评价投资法

策略选股:

1) 总市值 > 市场平均值;
2) 产权比率(负债/股东权益) < 市场平均值;
3) 每股企业自由现金流量 > 市场平均值;
4) 股价/每股自由现金流量 < 市场平均值;
5)(ROE)均大于市场平均值
6) 净利润同比增长率均大于市场平均值

7) 投入资本回报率 > 市场平均值;
8) 投入资本回报率 > 市场基准利率。(3.5%)
9) 选取符合以上条件的前30只股票

交易方式:
按月调仓

止损方式:
A. 当个股价格低于成本价的7%时,卖出该股票
B. 当5日内大盘下跌13%时,卖出所有股票

1.7 三一投资管理公司价值选股策略

具体策略

一、每月作为调仓周期,选取符合以下条件的股票进入投资组合:
选取本益比最低的前400公司
股价账面价值比最低的前400公司
股利收益率最高的前400公司 为了控制每期选出的股票数,我们增加如下条件:
若选出股票超过30 个,选取前30个进入组合。

二、止损方式
当个股价格低于成本价的8%时,卖出该股票
当5日内大盘下跌13%时,卖出所有股票

1.8 查尔斯.布兰德价值投资策略

策略选股

A. 股票负债净值比小于80%
B. 股票的市盈率不高于市场平均值1.5 倍
C. 股票的股价/近四季现金流量(市现率)不高于市场平均值的1.5 倍
D. 股票的市净率不高于市场平均值的1.5 倍
E. 股票的市净率小于2.0 倍
F. 满足于上述条件下的前30只股票

交易方式:
按月调仓

止损方式
A. 当个股价格低于成本价的7%时,卖出该股票
B. 当5日内大盘下跌13%时,卖出所有股票

1.9 迈克尔•普莱斯低估价值选股策略

策略选股:

A 股价与每股净值比小于2,且选取市净率最低的400只股票
B 董监事持股比例大于市场平均值(缺失该数据)
C 负债比例低于市场平均值
D. 满足于上述条件下的前30只股票

交易方式:
按月调仓

止损方式:
A. 当个股价格低于成本价的7%时,卖出该股票
B. 当5日内大盘下跌13%时,卖出所有股票

爬虫

爬虫数据:

(1)采集沪股通及深股通持股纪录,存入数据库中,每天更新
http://sc.hkexnews.hk/TuniS/www.hkexnews.hk/sdw/search/mutualmarket_c.aspx?t=sh

(2)同花顺里面的龙虎榜名单
http://data.10jqka.com.cn/market/longhu/#refCountId=data_55f13c7e_426

(3)同花顺里面的公司财报信息。
http://stockpage.10jqka.com.cn/000807/finance/#finance?qq-pf-to=pcqq.c2c

(4)采集公司的融资融券及其历史信息
http://stockpage.10jqka.com.cn/000807/#lhb?qq-pf-to=pcqq.c2c

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
#coding:utf-8
import scrapy, json,io
from scrapy.selector import Selector
from scrapy.http import Request, FormRequest
from StockRecord.items import StockrecordItem
import datetime, re, requests
import collections
from urllib.parse import urlencode, quote_plus
class Scrapy(scrapy.Spider):
name = 'stockrecord'
allow_domain = ['http://sc.hkexnews.hk/']
start_urls =['http://sc.hkexnews.hk/TuniS/www.hkexnews.hk/sdw/search/mutualmarket_c.aspx?t=sh']

def parse(self,response):
with open('index.html','wb')as f:
f.write(response.body)
url = 'http://sc.hkexnews.hk/TuniS/www.hkexnews.hk/sdw/search/mutualmarket_c.aspx?t=sh'
EVENTVALIDATION = response.xpath("//*[@id='__EVENTVALIDATION']/@value").extract()
VIEWSTATE = response.xpath("//*[@id='__VIEWSTATE']/@value").extract()
VIEWSTATEGENERATOR = response.xpath("//*[@id='__VIEWSTATEGENERATOR']/@value").extract()
today = response.xpath("//*[@id='today']/@value").extract()
sortBy = response.xpath("//*[@id='sortBy']/@value").extract()
alertMsg = response.xpath("//*[@id='alertMsg']/@value").extract()
formdata ={}
for i in range(1):
# formdata['__VIEWSTATE'] =re.findall(r'<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="(.*?)" />',sourepage.text)[0]
# formdata['__EVENTVALIDATION'] = re.findall(r'<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="(.*?)" />',sourepage.text)[0]
# formdata['__VIEWSTATEGENERATOR'] = 'EC4ACD6F'
formdata['__VIEWSTATE'] =VIEWSTATE[0]
formdata['__EVENTVALIDATION'] = EVENTVALIDATION[0]
formdata['__VIEWSTATEGENERATOR'] = VIEWSTATEGENERATOR[0]
formdata['today'] = today[0]
formdata['sortBy']= ''
formdata['alertMsg']= ''
start_time = datetime.date(2017, 3, 17) + datetime.timedelta(i)
formdata['ddlShareholdingDay'] = str(start_time.day)
formdata['ddlShareholdingMonth'] = str(start_time.month)
formdata['ddlShareholdingYear'] = str(start_time.year)
formdata['btnSearch.x'] = '32'
formdata['btnSearch.y'] = '11'
# print (formdata)
data = urlencode(formdata,quote_via=quote_plus)
print (data)
# formdata = {'ddlShareholdingDay':'17','ddlShareholdingMonth':'03','ddlShareholdingYear':'2017'}
return Request(url,self.parse_result, method="POST",headers={'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'},body=json.dumps(data))
# yield FormRequest.from_response(response,method='POST',formdata=formdata, callback=self.parse_result)
# print ('result',result)
# return result

def parse_result(self, response):
items = []
# print('页面',response.text)
with open('test.html','wb')as f:
f.write(response.body)
sel = Selector(response=response).css('#pnlResult > table')
table_date = Selector(response=response).css('#pnlResult > div:nth-child(1)::text').extract()[0].strip().split(':')[-1]
table = sel.css('td::text').extract()
all_data = list(map(lambda x: x.strip(), table))
every_line_data = [all_data[i:i + 4] for i in range(0, len(all_data), 4)]
items=[]
for every_line in every_line_data:
item = StockrecordItem()
item['date']= table_date
item['code'] = every_line[0]
item['name'] = every_line[1]
item['shareholding'] = every_line[2]
item['percentage'] = every_line[3]
items.append(item)
# print('结果:{}'.format(items))
print (items)
# return items

abupy策略代码

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
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485

# coding: utf-8

# In[1]:


import abupy
from abupy import EMarketDataFetchMode
from abupy import AbuMetricsBase
from abupy import EDataCacheType
from abupy import EMarketTargetType
from abupy import AbuDoubleMaBuy, AbuDoubleMaSell
from abupy import AbuPositionBase
from abupy import abu


# In[2]:


# **AbuFactorBuyBreak**(N日趋势突破策略)趋势突破定义为当天收盘价格超过N天内的最高价或最低价,超过最高价格作为买入信号买入股票持有,超过最低价格作为卖出信号。
#
# **AbuFactorAtrNStop**(止盈止损策略)真实波幅atr作为最大止盈和最大止损的常数值,当stop_loss_n 乘以 当日atr > 买入价格 - 当日收盘价格:止损卖出;当stop_win_n 乘以 当日atr < 当日收盘价格 -买入价格:止盈卖出
#
# **AbuFactorPreAtrNStop**(风险控制止损策略)使用真实波幅atr作为常数值: 当今日价格下跌幅度 > 当日atr 乘以 pre_atr_n(下跌止损倍数)卖出股票
#
# **AbuFactorCloseAtrNStop**(利润保护止盈策略) atr移动止盈策略,当买入股票有一定收益后,如果股价下跌幅度超过close_atr_n乘以当日atr:则保护止盈卖出

# In[2]:


from abupy import AbuFactorBuyBreak, AbuFactorAtrNStop, AbuFactorPreAtrNStop, AbuFactorCloseAtrNStop


# In[3]:


# 初始化资金20万
read_cash = 200000

# 买入因子使用60日向上和42日突破因子
buy_factors = [{'xd': 60, 'class': AbuFactorBuyBreak},
{'xd': 42, 'class': AbuFactorBuyBreak}]

# 趋势跟踪策略止盈要大于止损设置值,这里1.0,3.0
# 卖出因子并行生效
sell_factors = [
{'stop_loss_n': 1.0, 'stop_win_n': 3.0,
'class': AbuFactorAtrNStop},
{'class': AbuFactorPreAtrNStop, 'pre_atr_n': 1.5},
{'class': AbuFactorCloseAtrNStop, 'close_atr_n': 1.5}
]


# In[4]:


# 回测生成买入时刻特征
abupy.env.g_enable_ml_feature = True
# 回测开始时将symbols切割分为训练集数据和测试集两份,使用训练集进行回测
#abupy.env.g_enable_train_test_split = True


# In[5]:


# 很多交易细节还是使用的默认设置中的美股交易模式,因此需要将环境设置为A股
abupy.env.g_market_target = EMarketTargetType.E_MARKET_TARGET_CN


# In[6]:


# 择时股票池
choice_symbols = ['002230', '000725', '300059', '601766', '600085', '600036', '600809', '000002', '002594', '002739',
'601388', '601919', '600307', '000725', '601880', '000100','601168']


# **针对A股涨停和跌停的特殊设置打开**

# In[7]:


from abupy import slippage
# 开启针对非集合竞价阶段的涨停,滑点买入价格以高概率在接近涨停的价格买入
slippage.sbb.g_enable_limit_up = True
# 将集合竞价阶段的涨停买入成功概率设置为0,如果设置为0.2即20%概率成功买入
slippage.sbb.g_pre_limit_up_rate = 0
# 开启针对非集合竞价阶段的跌停,滑点卖出价格以高概率在接近跌停的价格卖出
slippage.ssb.g_enable_limit_down = True
# 将集合竞价阶段的跌停卖出成功概率设置为0, 如果设置为0.2即20%概率成功卖出
slippage.ssb.g_pre_limit_down_rate = 0


# **自定义手续费**

# In[8]:


def buy_commission_ch(trade_cnt, price):
"""
计算交易费用:每股0.001块,,最低消费1块;交易佣金:最高收费为3‰,最低收费5元;印花税:1‰
:param trade_cnt: 交易的股数
:param price: 每股的价格
:return: 计算结果手续费
"""
# 每股手续费0.01
transfer_fees = trade_cnt * 0.001
commission = price*trade_cnt*0.0003
if transfer_fees < 1:
transfer_fees = 1
if commission < 5:
# 最低消费2.99
commission = 5
return transfer_fees+commission

def sell_commission_ch(trade_cnt, price):
"""
计算交易费用:每股0.001块,,最低消费1块;交易佣金:最高收费为3‰,最低收费5元;印花税:1‰
:param trade_cnt: 交易的股数
:param price: 每股的价格
:return: 计算结果手续费
"""
# 每股手续费0.01
transfer_fees = trade_cnt * 0.001
commission = price*trade_cnt*0.0003
stamp_duty = price*trade_cnt*0.001#算一半,因为只有卖出才收
if transfer_fees < 1:
transfer_fees = 1
if commission < 5:
commission = 5
return transfer_fees+commission+stamp_duty


# In[9]:


# 卖出字典key='sell_commission_func', 指向同一个手续费方法,当然也可以定义不同的方法
commission_dict = {'buy_commission_func': buy_commission_ch, 'sell_commission_func': sell_commission_ch}


# In[13]:


# 使用run_loop_back运行策略
abu_result_tuple, kl_pd_manger = abu.run_loop_back(read_cash,
buy_factors,
sell_factors,
n_folds=8,
commission_dict=commission_dict,
choice_symbols=choice_symbols)


# In[14]:


AbuMetricsBase.show_general(*abu_result_tuple, only_show_returns=True)


# **仓位管理**
#
# 应用kelly公式来做仓位控制

# In[15]:


metrics = AbuMetricsBase(*abu_result_tuple)


# In[16]:


metrics.fit_metrics()


# In[17]:


metrics.win_rate


# In[10]:


class AbuKellyPosition(AbuPositionBase):
"""示例kelly仓位管理类"""

def fit_position(self, factor_object):
"""
fit_position计算的结果是买入多少个单位(股,手,顿,合约)
需要factor_object策略因子对象通过历史回测统计胜率,期望收益,期望亏损,
并设置构造当前factor_object对象,通过kelly公司计算仓位
:param factor_object: ABuFactorBuyBases子类实例对象
:return:买入多少个单位(股,手,顿,合约)
"""
# 败率
loss_rate = 1 - self.win_rate
# kelly计算出仓位比例
kelly_pos = self.win_rate - loss_rate / (self.gains_mean / self.losses_mean)
# 最大仓位限制,依然受上层最大仓位控制限制,eg:如果kelly计算出全仓,依然会减少到75%,如修改需要修改最大仓位值
kelly_pos = self.pos_max if kelly_pos > self.pos_max else kelly_pos
# 结果是买入多少个单位(股,手,顿,合约)
return self.read_cash * kelly_pos / self.bp * self.deposit_rate

def _init_self(self, **kwargs):
"""kelly仓位控制管理类初始化设置"""

# 默认kelly仓位胜率0.445
self.win_rate = kwargs.pop('win_rate', 0.445)
# 默认平均获利期望0.1338
self.gains_mean = kwargs.pop('gains_mean', 0.1338)
# 默认平均亏损期望0.06959
self.losses_mean = kwargs.pop('losses_mean', 0.06959)


# In[20]:


# 买入因子使用60日向上和42日突破因子
buy_factors_sec = [{'xd': 60, 'class': AbuFactorBuyBreak},
{'xd': 42, 'class': AbuFactorBuyBreak,
'position': {'class': AbuKellyPosition, 'win_rate': metrics.win_rate,
'gains_mean': metrics.gains_mean, 'losses_mean': -metrics.losses_mean},}]


# In[21]:


# 使用run_loop_back运行策略
abu_result_tuple, kl_pd_manger = abu.run_loop_back(read_cash,
buy_factors_sec,
sell_factors,
n_folds=8,
commission_dict=commission_dict,
choice_symbols=choice_symbols)


# In[22]:


AbuMetricsBase.show_general(*abu_result_tuple, only_show_returns=True)


# In[23]:


metrics = AbuMetricsBase(*abu_result_tuple)
metrics.plot_max_draw_down()


# ## 当天行为动作

# In[24]:


action_result_pd = abu_result_tuple.action_pd
action_result_pd[action_result_pd['Date']==20180124]


# In[25]:


result_orders_pd = abu_result_tuple.orders_pd
result_orders_pd[result_orders_pd['buy_date']==20180124]


# **买入动作重写**
#
# 构建一个保守买入算法,以开盘价和最高价的平均值作为买入,而不是两者均值

# In[26]:


from abupy import AbuSlippageBuyBase, slippage
import numpy as np
class AbuSlippageBuyMean2(AbuSlippageBuyBase):
"""示例日内滑点均价买入类"""

@slippage.sbb.slippage_limit_up
def fit_price(self):
"""
取当天交易日的最高最低均价做为决策价格
:return: 最终决策的当前交易买入价格
"""
g_open_down_rate = 0.02
# TODO 基类提取作为装饰器函数,子类根据需要选择是否装饰,并且添加上根据order的call,put明确细节逻辑
if self.kl_pd_buy.pre_close == 0 or (self.kl_pd_buy.open / self.kl_pd_buy.pre_close) < (1 - g_open_down_rate):
# 开盘就下跌一定比例阀值,放弃单子
return np.inf
# 买入价格为当天均价,即最高,最低的平均,也可使用高开低收平均等方式计算
self.buy_price = np.mean([self.kl_pd_buy['open'], self.kl_pd_buy['high']])
# 返回最终的决策价格
return self.buy_price


# In[27]:


# 买入因子使用60日向上和42日突破因子
buy_factors_sec = [{'xd': 60, 'class': AbuFactorBuyBreak,'slippage': AbuSlippageBuyMean2},
{'xd': 42, 'class': AbuFactorBuyBreak, 'slippage': AbuSlippageBuyMean2,
'position': {'class': AbuKellyPosition, 'win_rate': metrics.win_rate,
'gains_mean': metrics.gains_mean, 'losses_mean': -metrics.losses_mean},}]


# In[43]:


# 使用run_loop_back运行策略
abu_result_tuple, kl_pd_manger = abu.run_loop_back(read_cash,
buy_factors_sec,
sell_factors,
n_folds=8,
commission_dict=commission_dict,
choice_symbols=choice_symbols)


# In[44]:


AbuMetricsBase.show_general(*abu_result_tuple, only_show_returns=True)


# In[41]:


action_result_pd = abu_result_tuple.action_pd
action_result_pd[action_result_pd['Date']==20180124]


# **双均线策略**

# In[45]:


# 买入双均线策略AbuDoubleMaBuy寻找金叉买入信号:ma快线=5,ma慢线=20
buy_factors = [{'fast': 5, 'slow': 20, 'class': AbuDoubleMaBuy}]
# 卖出双均线策略AbuDoubleMaSell寻找死叉卖出信号:ma快线=5,ma慢线=20,并行继续使用止盈止损基础策略
sell_factors = [{'fast': 5, 'slow': 20, 'class': AbuDoubleMaSell},
{'stop_loss_n': 1.0, 'stop_win_n': 3.0,
'class': AbuFactorAtrNStop},
{'class': AbuFactorPreAtrNStop, 'pre_atr_n': 1.5},
{'class': AbuFactorCloseAtrNStop, 'close_atr_n': 1.5}]


# In[46]:


abu_result_tuple, kl_pd_manger = abu.run_loop_back(read_cash,
buy_factors,
sell_factors,
n_folds=8,
commission_dict=commission_dict,
choice_symbols=choice_symbols)


# In[47]:


AbuMetricsBase.show_general(*abu_result_tuple, only_show_returns=True)


# In[23]:


action_result_pd = abu_result_tuple.action_pd
action_result_pd[action_result_pd['Date']==20180124]


# In[49]:


metrics = AbuMetricsBase(*abu_result_tuple)
metrics.plot_max_draw_down()


# In[12]:


buy_factors = [{'fast': 5, 'slow': 20, 'class': AbuDoubleMaBuy},{'xd': 60, 'class': AbuFactorBuyBreak},
{'xd': 42, 'class': AbuFactorBuyBreak,
'position': {'class': AbuKellyPosition},}]

sell_factors = [{'stop_loss_n': 1.0, 'stop_win_n': 3.0,'class': AbuFactorAtrNStop},
{'class': AbuFactorPreAtrNStop, 'pre_atr_n': 1.5},
{'class': AbuFactorCloseAtrNStop, 'close_atr_n': 1.5}]


# In[13]:


abu_result_tuple, kl_pd_manger = abu.run_loop_back(read_cash,
buy_factors,
sell_factors,
n_folds=8,
commission_dict=commission_dict,
choice_symbols=choice_symbols)


# In[14]:


AbuMetricsBase.show_general(*abu_result_tuple, only_show_returns=True)


# In[15]:


metrics = AbuMetricsBase(*abu_result_tuple)
metrics.plot_max_draw_down()


# In[16]:


buy_factors = [{'fast': 5, 'slow': 20, 'class': AbuDoubleMaBuy},{'xd': 60, 'class': AbuFactorBuyBreak},
{'xd': 42, 'class': AbuFactorBuyBreak,
'position': {'class': AbuKellyPosition},}]

sell_factors = [{'class': AbuDoubleMaSell},
{'stop_loss_n': 1.0, 'stop_win_n': 3.0,'class': AbuFactorAtrNStop},
{'class': AbuFactorPreAtrNStop, 'pre_atr_n': 1.5},
{'class': AbuFactorCloseAtrNStop, 'close_atr_n': 1.5}]


# In[17]:


abu_result_tuple, kl_pd_manger = abu.run_loop_back(read_cash,
buy_factors,
sell_factors,
n_folds=8,
commission_dict=commission_dict,
choice_symbols=choice_symbols)


# In[18]:


AbuMetricsBase.show_general(*abu_result_tuple, only_show_returns=True)


# In[19]:


metrics = AbuMetricsBase(*abu_result_tuple)
metrics.plot_max_draw_down()


# In[20]:


action_result_pd = abu_result_tuple.action_pd
action_result_pd[action_result_pd['Date']==20180124]


# In[28]:


result_orders_pd = abu_result_tuple.orders_pd


# In[44]:


result_orders_pd[result_orders_pd['symbol']=='600797']


# In[43]:


result_orders_pd['symbol'].unique()


# In[11]:


from abupy import AbuBenchmark, AbuCapital, AbuKLManager


# In[ ]:


benchmark = AbuBenchmark()
capital = AbuCapital(1000000, benchmark)
kl_pd_manger = AbuKLManager(benchmark, capital)
shikanon wechat
欢迎您扫一扫,订阅我滴↑↑↑的微信公众号!