回測框架pybacktest簡介(一)

pybacktest 教程

本教程讓你快速瞭解 pybacktest's 的功能。爲此,咱們回測精典交易策略移動平均線MA交叉。python

  • MA快線上穿慢線時,買進作多
  • MA快線下穿慢線時,賣出作空
  • 進場規則,也是退場規則,交易策略相反相成

軟件包在此下載 https://github.com/ematvey/pybacktestgit

 

[python]  view plain  copy
 
  1. import pybacktest    
  2. import pandas as pd  

 

pybacktest 要求的 k 線數據格式爲 pandas.DataFrame ,以時間戳爲索引,各列字段名稱爲 OHLC。實際上,目前只檢查字段O的值是否爲空。

 

從yahoo下載數據。github

 

[python]  view plain  copy
 
  1. ohlc = pybacktest.load_from_yahoo('SPY')  
[python]  view plain  copy
 
  1. ohlc.tail()  

 

 

  O H L C V AC
Date            
2013-04-22 155.78 156.54 154.75 156.17 106501600 156.17
2013-04-23 156.95 157.93 156.17 157.78 165950600 157.78
2013-04-24 157.83 158.30 157.54 157.88 96724000 157.88
2013-04-25 158.34 159.27 158.10 158.52 130916000 158.52
2013-04-26 158.33 158.60 157.73 158.24 95904500 158.24

 

定義交易策略。要建立以 True和False 表示交易信號的 Series ,和以浮點數表示交易價格的 Series。編程

夠簡單的吧?函數

 

[python]  view plain  copy
 
  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 MA
Date
2013-04-22    154.5438
2013-04-23    154.6634
2013-04-24    154.7856
2013-04-25    154.9156
2013-04-26    155.0374

>  Long MA
Date
2013-04-22    145.50725
2013-04-23    145.60910
2013-04-24    145.71455
2013-04-25    145.82970
2013-04-26    145.94430

>  Buy/Cover signals
Date
2013-04-22    False
2013-04-23    False
2013-04-24    False
2013-04-25    False
2013-04-26    False

>  Short/Sell signals
Date
2013-04-22    False
2013-04-23    False
2013-04-24    False
2013-04-25    False
2013-04-26    False

 

開始回測吧。訪問類對象 Backtest 的第一個參數,是從字典式的對象中剝離出的交易信號、價格等。能夠是字典、pandas.DataFrame 或者其餘任何東西。ui

爲了簡化編程,把局部命名空間用函數 locals()傳遞過去。命名空間的內容,是至今你所建立的所有變量spa

 

[python]  view plain  copy
 
  1. bt = pybacktest.Backtest(locals(), 'ma_cross')  

 

Backtest 工做懶惰,只有在你訪問它的屬性時,它纔會進行運算。它所運算的屬性包括:

 
[python]  view plain  copy
 
  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  Short
Date                                  
2013-04-22  False  False  False  False
2013-04-23  False  False  False  False
2013-04-24  False  False  False  False
2013-04-25  False  False  False  False
2013-04-26  False  False  False  False

>  bt.trades
            pos   price  vol
Date                        
2009-06-23    1   90.16    2
2010-07-06   -1  103.13   -2
2010-10-22    1  119.14    2
2011-08-12   -1  119.19   -2
2012-01-31    1  132.29    2

>  bt.positions
Date
2009-06-23    1
2010-07-06   -1
2010-10-22    1
2011-08-12   -1
2012-01-31    1

>  bt.equity
Date
2009-06-23    58.66
2010-07-06    12.97
2010-10-22   -16.01
2011-08-12     0.05
2012-01-31   -13.10

>  bt.trade_price
Date
2013-04-22    156.95
2013-04-23    157.83
2013-04-24    158.34
2013-04-25    158.33
2013-04-26       NaN
Name: O

 

調用 Backtest 的函數summary ,能夠得知經常使用的運算和運行數據

 
[python]  view plain  copy
 
  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: 17
exposure:
  holding periods:
    max: 1476 days, 0:00:00
    median: 354 days, 0:00:00
    min: 7 days, 0:00:00
  trades/month: 1.0625
performance:
  PF: 4.017
  RF: 6.1555
  averages:
    gain: 23.817
    loss: -8.47
    trade: 10.5224
  payoff: 2.8119
  profit: 178.88
  winrate: 0.5882
risk/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
 
  1. figsize(10, 5)  
  2. bt.plot_equity()  


回測運行過程當中的精確圖形,Backtest 能夠爲你畫出。圖中的說明 Legend 省略了,以節省空間。

 
[python]  view plain  copy
 
  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
 
  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的大部份內容。下一個教程,會涉及更多高級功能。
相關文章
相關標籤/搜索