当前位置:首页 > 技术前沿 > 正文

手把手教你用Python搭建自己的量化回测框架「均值回归策略」

引言策略思想均值回归策略的思想在引言中已有所介绍,此处不详细展开。其实,大家熟知的巴菲特价值投资策略和索罗斯的“反身”交易策略,从本质上来看都是均值回归理论的应用,所不同的是前者是基于价值低点向高点回归做多获得收益,后者则是通过泡沫破灭价值从高点向低点回归时做空进行投机获利。均值回归策略的思想很容易...

引言策略思想均值回归策略的思想在引言中已有所介绍,此处不详细展开。其实,大家熟知的巴菲特价值投资策略和索罗斯的“反身”交易策略,从本质上来看都是均值回归理论的应用,所不同的是前者是基于价值低点向高点回......

引言策略思想

均值回归策略的思想在引言中已有所介绍,此处不详细展开。其实,大家熟知的巴菲特价值投资策略和索罗斯的“反身”交易策略,从本质上来看都是均值回归理论的应用,所不同的是前者是基于价值低点向高点回归做多获得收益,后者则是通过泡沫破灭价值从高点向低点回归时做空进行投机获利。均值回归策略的思想很容易理解,实际操作中有很多构建的方法,比较常见的利用股价收益率偏离某段期间均值的若干个标准为阈值作为均值回归策略的买入卖出信号。下面将基于该原理,计算股价收益率的Zscore值,即以标准差为单位来衡量某一日收益率与平均收益率之间的离差情况。Talkischeap,showyourcode!下面直接给出使用Python构建量化回测框架的过程和回测结果。

使用Python进行策略回测

01数据准备与探索分析

正常显示画图时出现的中文和负号['']=['SimHei']['_minus']=False设置tokenimporttushareaststoken='输入在上获取的token'_token(token)pro=_api(token)获取当前交易的股票代码和名称defget_code():df=_basic(exchange='',list_status='L')codes=_==dict(zip(names,codes))获取行情数据defget_data(stock,start='20151009',=''):否则取的是个股数据else:df=_bar(ts_code=code,adj='qfq',start_date=start,_date=)()returns=_change().dropna()(figsize=(14,6),label='日收益率')('中国平安日收益图',fontsize=15)my_ticks=_range('2015-10-1','2019-10-11',freq='q')(my_ticks,fontsize=12)(fontsize=12)('',fontsize=12)获取数据defdata_feed(stock,start='20151009',=''):指数数据,作为参照指标df['hs300']=get_data('沪深300',start,)._change()计算均值回归策略的Zscore值ret_lb=(lookback).mean()std_lb=(lookback).std()df['score']=(_lb)/std_(inplace=True)当Zscore值小于-1.5且第二天开盘没有涨停发出买入信号设置为1[(_threshold)(df['open']df['close'].shift(1)*1.097),'signal']=1根据交易信号和仓位计算策略的每日收益率[[0],'capital_ret']=0卖出同理[df['position']df['position'].shift(1),'capital_ret']=\(df['open']/df['close'].shift(1)-1)*(1-cost)计算标的、策略、指数的累计收益率df['capital_line']=(_ret+1.0).cumprod()df['rets_line']=(+1.0).cumprod()df['hs300_line']=(+1.0).cumprod()returndf

计算策略的评价指标

完整代码只在知识星球上分享,可扫描最下方二维码加入。

df为策略返回的数据框,包含策略的收益率记录买入或者加仓时的日期和初始资产df为策略返回的数据框,包含策略的收益率计算策略的年(月,周)胜率对策略和标的股票累计收益率进行可视化defplot_performance(df,stock):由于篇幅所限,此处代码省略stock为回测的股票简称defplot_strategy_signal(df,trade,stock):由于篇幅所限,此处代码省略使用版本对中国平安股票进行策略回测stock='中国平安'd1,trade=main(stock,'20151009','20191011')plot_strategy_signal(d1,trade,stock)

输出回测结果

回测标的:中国平安

回测期间:20151009—20191011

==============每笔交易收益率及同期股票涨跌幅===============

start_date_datetrade_returnstock_return

162015-11-302015-12-030.0546170.062943

212015-12-072015-12-150.0142860.008871

372015-12-292016-02-01-0.155182-0.172830

742016-02-262016-03-030.0313700.049032

1232016-05-092016-05-130.0050990.010190

1562016-06-272016-07-130.0461940.040052

1802016-07-292016-08-100.0018480.002772

1932016-08-172016-09-200.0330130.033413

2202016-09-272016-10-310.0049650.006689

2422016-11-032016-11-220.0352700.043629

2622016-12-012017-01-17-0.007703-0.009634

3032017-02-062017-02-210.0304970.032285

3462017-04-102017-04-260.0002730.024861

3652017-05-082017-05-110.0681690.067365

3912017-06-152017-07-060.0684470.088540

4182017-07-242017-08-020.0524180.040032

5022017-11-242017-12-11-0.039784-0.014396

5262017-12-282018-01-160.1049790.106040

5482018-01-302018-02-14-0.074074-0.060932

5822018-03-262018-04-11-0.013005-0.037411

6042018-04-272018-05-09-0.007082-0.002692

6262018-05-312018-06-010.0130920.016323

6392018-06-202018-07-02-0.058481-0.110647

6482018-07-032018-07-100.0611500.053605

6702018-08-022018-08-080.002356-0.022110

6802018-08-162018-09-050.1424260.101175

6952018-09-062018-09-250.0772940.080475

7122018-10-092018-10-220.0213540.048627

7272018-10-302018-11-050.1083340.073872

7992019-02-182019-02-190.0262910.038420

8062019-02-272019-04-010.1095300.122698

8512019-05-072019-05-13-0.030937-0.031403

9122019-08-012019-08-13-0.017714-0.034963

9302019-08-272019-09-160.0570580.052755

====================账户交易的各项指标=====================

交易次数为:34最长持有天数为:47

每次平均涨幅为:0.022540

单次最大盈利为:0.142426单次最大亏损为:-0.155182

年均买卖次数为:8.953824

最大连续盈利次数为:8最大连续亏损次数为:3

策略年胜率为:80.0%

策略月胜率为:77.5%

策略周胜率为:59.26%

总收益率:策略102.33%,股票177.87%,指数5.55%

年化收益率:策略20.19%,股票30.56%,指数1.42%

最大回撤:策略19.17%,股票28.54%,指数32.46%

策略Alpha:0.2,Beta:0.43,夏普比率:1.92

stock='奥马电器'd1,trade=main(stock,'20151009','20191011')plot_strategy_signal(d1,trade,stock)回测标的:奥马电器回测期间:20151009—20191011==============每笔交易收益率及同期股票涨跌幅===============略====================账户交易的各项指标=====================交易次数为:24最长持有天数为:65每次平均涨幅为:0.014195单次最大盈利为:0.491054单次最大亏损为:-0.452403年均买卖次数为:6.522710最大连续盈利次数为:4最大连续亏损次数为:2策略年胜率为:40.0%策略月胜率为:65.0%策略周胜率为:51.89%总收益率:策略8.18%,股票-68.03%,指数22.43%年化收益率:策略2.46%,股票-29.7%,指数6.45%最大回撤:策略56.72%,股票86.1%,指数26.39%策略Alpha:-0.01,Beta:0.59,夏普比率:0.37

stock='九州通'd1,trade=main(stock,'20151009','20191011')plot_strategy_signal(d1,trade,stock)回测标的:九州通回测期间:20151009—20191011==============每笔交易收益率及同期股票涨跌幅===============略====================账户交易的各项指标=====================交易次数为:33最长持有天数为:50每次平均涨幅为:0.006272单次最大盈利为:0.103585单次最大亏损为:-0.142085年均买卖次数为:8.665468最大连续盈利次数为:6最大连续亏损次数为:3策略年胜率为:60.0%策略月胜率为:58.54%策略周胜率为:51.69%总收益率:策略16.93%,股票-27.96%,指数1.57%年化收益率:策略4.21%,股票-8.28%,指数0.41%最大回撤:策略25.56%,股票49.51%,指数32.46%策略Alpha:0.04,Beta:0.39,夏普比率:0.31

结语

本文主要介绍了均值回测策略的基本思想,以及使用Pandas构建基于研究的量化回测框架对策略进行回测,回测结果比较直观(感兴趣的朋友可以把交易费用和滑点价差考虑进去,文中设置为0了)。当然,上述回测框架还存在一些细节问题需要完善,而且基于研究的回测框架和基于pandas的向量式编程存在一定的局限性,尽管容易理解,但不适合用于处理更复杂的交易情形。以后有机会将为大家介绍使用面向对象编程(Class类)的方法构建基于事件驱动的量化回测框架,可以借鉴backtrader、zipline等开源框架。尽管均值回归非常普遍,但要准确回测一个盈利的均值回归策略却存在很多陷阱。比如,许多历史金融数据库中都包含报价错误,而这些错误可能会抬高均值回归策略的业绩。另外,存活偏差也会影响均值回归策略的回测,即那些股价一直下跌最后退市而没有出现均值回归的股票早已从数据库中剔除。对于均值回归策略而言,典型的结果就是套利机会的逐步消失,从而使得收益率逐渐降低至零。当套利机会消失殆尽时,均值回归策略就变得没那么有效,因为越来越多的交易信号来自于股票估值的基本面变化,而这并不会均值回归。

关于Python金融量化

最新文章