回测框架pybacktest简介(一)

来源:互联网 发布:星星知多少视频 编辑:程序博客网 时间:2024/05/16 10:56

pybacktest 教程

本教程让你快速了解 pybacktest's 的功能。为此,我们回测精典交易策略移动平均线MA交叉。

  • MA快线上穿慢线时,买进做多
  • MA快线下穿慢线时,卖出做空
  • 进场规则,也是退场规则,交易策略相反相成

软件包在此下载 https://github.com/ematvey/pybacktest

[python] view plain copy 在CODE上查看代码片派生到我的代码片
  1. import pybacktest    
  2. import pandas as pd  

pybacktest 要求的 k 线数据格式为 pandas.DataFrame ,以时间戳为索引,各列字段名称为 OHLC。实际上,目前只检查字段O的值是否为空。

从yahoo下载数据。

[python] view plain copy 在CODE上查看代码片派生到我的代码片
  1. ohlc = pybacktest.load_from_yahoo('SPY')  
[python] view plain copy 在CODE上查看代码片派生到我的代码片
  1. ohlc.tail()  

 OHLCVACDate      2013-04-22155.78156.54154.75156.17106501600156.172013-04-23156.95157.93156.17157.78165950600157.782013-04-24157.83158.30157.54157.8896724000157.882013-04-25158.34159.27158.10158.52130916000158.522013-04-26158.33158.60157.73158.2495904500158.24

定义交易策略。要创建以 True和False 表示交易信号的 Series ,和以浮点数表示交易价格的 Series。

够简单的吧?


[python] view plain copy 在CODE上查看代码片派生到我的代码片
  1. short_ma = 50  
  2. long_ma = 200  
  3.   
  4. ms = pandas.rolling_mean(ohlc.C, short_ma)  
  5. ml = pandas.rolling_mean(ohlc.C, long_ma)  
  6.       
  7. buy = cover = (ms > ml) & (ms.shift() < ml.shift())  # ma cross up  
  8. sell = short = (ms < ml) & (ms.shift() > ml.shift())  # ma cross down  
  9.   
  10. print '>  Short MA\n%s\n' % ms.tail()  
  11. print '>  Long MA\n%s\n' % ml.tail()  
  12. print '>  Buy/Cover signals\n%s\n' % buy.tail()  
  13. print '>  Short/Sell signals\n%s\n' % sell.tail()  
>  Short MADate2013-04-22    154.54382013-04-23    154.66342013-04-24    154.78562013-04-25    154.91562013-04-26    155.0374>  Long MADate2013-04-22    145.507252013-04-23    145.609102013-04-24    145.714552013-04-25    145.829702013-04-26    145.94430>  Buy/Cover signalsDate2013-04-22    False2013-04-23    False2013-04-24    False2013-04-25    False2013-04-26    False>  Short/Sell signalsDate2013-04-22    False2013-04-23    False2013-04-24    False2013-04-25    False2013-04-26    False

开始回测吧。访问类对象 Backtest 的第一个参数,是从字典式的对象中剥离出的交易信号、价格等。可以是字典、pandas.DataFrame 或者其他任何东西。

为了简化编程,把局部命名空间用函数 locals()传递过去。命名空间的内容,是至今你所创建的全部变量

[python] view plain copy 在CODE上查看代码片派生到我的代码片
  1. bt = pybacktest.Backtest(locals(), 'ma_cross')  

Backtest 工作懒惰,只有在你访问它的属性时,它才会进行运算。它所运算的属性包括:


[python] view plain copy 在CODE上查看代码片派生到我的代码片
  1. print filter(lambda x: not x.startswith('_'), dir(bt))  
  2. print '\n>  bt.signals\n%s' % bt.signals.tail()  
  3. print '\n>  bt.trades\n%s' % bt.trades.tail()  
  4. print '\n>  bt.positions\n%s' % bt.positions.tail()  
  5. print '\n>  bt.equity\n%s' % bt.equity.tail()  
  6. print '\n>  bt.trade_price\n%s' % bt.trade_price.tail()  

['dataobj', 'default_price', 'eqplot', 'equity', 'name', 'ohlc', 'plot_equity', 'plot_trades', 'positions', 'prices', 'report', 'run_time', 'signals', 'sigplot', 'summary', 'trade_price', 'trades', 'trdplot']

>  bt.signals              Buy  Cover   Sell  ShortDate                                  2013-04-22  False  False  False  False2013-04-23  False  False  False  False2013-04-24  False  False  False  False2013-04-25  False  False  False  False2013-04-26  False  False  False  False>  bt.trades            pos   price  volDate                        2009-06-23    1   90.16    22010-07-06   -1  103.13   -22010-10-22    1  119.14    22011-08-12   -1  119.19   -22012-01-31    1  132.29    2>  bt.positionsDate2009-06-23    12010-07-06   -12010-10-22    12011-08-12   -12012-01-31    1>  bt.equityDate2009-06-23    58.662010-07-06    12.972010-10-22   -16.012011-08-12     0.052012-01-31   -13.10>  bt.trade_priceDate2013-04-22    156.952013-04-23    157.832013-04-24    158.342013-04-25    158.332013-04-26       NaNName: O

调用 Backtest 的函数summary ,可以得知常用的运算和运行数据


[python] view plain copy 在CODE上查看代码片派生到我的代码片
  1. bt.summary()  

Backtest('ma_cross', 2013-28-04 23:14:15 MSK) performance summary

=================================================================backtest:  days: 6348  from: '1994-09-14 00:00:00'  to: '2012-01-31 00:00:00'  trades: 17exposure:  holding periods:    max: 1476 days, 0:00:00    median: 354 days, 0:00:00    min: 7 days, 0:00:00  trades/month: 1.0625performance:  PF: 4.017  RF: 6.1555  averages:    gain: 23.817    loss: -8.47    trade: 10.5224  payoff: 2.8119  profit: 178.88  winrate: 0.5882risk/return profile:  UPI: 1.0656  WCDD (monte-carlo 0.99 quantile): 52.09  maxdd: 74.67  sharpe: 0.4485  sortino: 1.6792-----------------------------------------------------------------

看看净资产曲线吧。


[python] view plain copy 在CODE上查看代码片派生到我的代码片
  1. figsize(105)  
  2. bt.plot_equity()  


回测运行过程中的精确图形,Backtest 可以为你画出。图中的说明 Legend 省略了,以节省空间。


[python] view plain copy 在CODE上查看代码片派生到我的代码片
  1. bt.plot_trades()  
  2. pandas.rolling_mean(ohlc.C, short_ma).plot(c='green')  
  3. pandas.rolling_mean(ohlc.C, long_ma).plot(c='blue')  
  4. legend(loc='upper left')  

<matplotlib.legend.Legend at 0x49eea10>



你能完全看清吗?我不行。因此,有个特别属性 trdplot ,让你用pandas的索引机制,指定你要画出的期间。而用属性 eqplot,可以画出净资产曲线。


[python] view plain copy 在CODE上查看代码片派生到我的代码片
  1. bt.trdplot['2004':'2007']  
  2. pandas.rolling_mean(ohlc.C['2004':'2007'], short_ma).plot(c='green')  
  3. pandas.rolling_mean(ohlc.C['2004':'2007'], long_ma).plot(c='blue')  

<matplotlib.axes.AxesSubplot at 0x7f7f38c09e50>



以上是pybacktest的大部分内容。下一个教程,会涉及更多高级功能。


原文地址:http://blog.csdn.net/lawme/article/details/51767787

0 0
原创粉丝点击