回測框架pybacktest簡介(二)

pybacktest 的疑點python

第(一)節「教程」原文,是用 ipython notebook 寫成,程序代碼是一些片斷組成。函數

爲了閱讀方便,合併在一塊兒。ui

 

本文轉載於:http://blog.csdn.net/lawme/article/details/51773744spa

 

[python]  view plain  copy
 
  1. import pybacktest      
  2. import pandas as pd  
  3.   
  4. ohlc = pybacktest.load_from_yahoo('SPY')  
  5. ohlc.tail()  
  6.   
  7. short_ma = 50    
  8. long_ma = 200    
  9.     
  10. ms = pandas.rolling_mean(ohlc.C, short_ma)    
  11. ml = pandas.rolling_mean(ohlc.C, long_ma)    
  12.         
  13. buy = cover = (ms > ml) & (ms.shift() < ml.shift())  # ma cross up    
  14. sell = short = (ms < ml) & (ms.shift() > ml.shift())  # ma cross down    
  15.     
  16. print '>  Short MA\n%s\n' % ms.tail()    
  17. print '>  Long MA\n%s\n' % ml.tail()    
  18. print '>  Buy/Cover signals\n%s\n' % buy.tail()    
  19. print '>  Short/Sell signals\n%s\n' % sell.tail()  
  20.   
  21. bt = pybacktest.Backtest(locals(), 'ma_cross')  
  22.   
  23. print filter(lambda x: not x.startswith('_'), dir(bt))    
  24. print '\n>  bt.signals\n%s' % bt.signals.tail()    
  25. print '\n>  bt.trades\n%s' % bt.trades.tail()    
  26. print '\n>  bt.positions\n%s' % bt.positions.tail()    
  27. print '\n>  bt.equity\n%s' % bt.equity.tail()    
  28. print '\n>  bt.trade_price\n%s' % bt.trade_price.tail()    
  29.   
  30. bt.summary()  
  31.   
  32. figsize(10, 5)    
  33. bt.plot_equity()    
  34.   
  35. bt.plot_trades()    
  36. pandas.rolling_mean(ohlc.C, short_ma).plot(c='green')    
  37. pandas.rolling_mean(ohlc.C, long_ma).plot(c='blue')    
  38. legend(loc='upper left')    
  39.   
  40. bt.trdplot['2004':'2007']    
  41. pandas.rolling_mean(ohlc.C['2004':'2007'], short_ma).plot(c='green')    
  42. pandas.rolling_mean(ohlc.C['2004':'2007'], long_ma).plot(c='blue')    


從源碼和教程來看,pybacktest 用法的確簡單。.net

 

但教程中有幾句,沒有看懂。例如如下2句:orm

 

[python]  view plain  copy
 
  1. figsize(10, 5)    
  2. legend(loc='upper left')  

 

不知道這兩個函數出自何處,且有時能經過「編譯」,有時卻不行。blog

緣由後來找到了。由於代碼是在ipython notebook中,教程

如有「魔術命令」%pylab inline 這兩個函數能夠直接調用。ip

該例程雖未顯式使用%pylab inline,但可能notebook對它有默認設置。內存

更有趣的是,數據源只能直接取自yahoo,如:

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

若是把ohlc存成csv文件,而後再讀入內存,並進行格式規整,如:

[python]  view plain  copy
 
  1. ohlc.to_csv('SPY.csv')  
  2. ohlc = pd.read_csv('SPY.csv')  
  3. ohlc.index = ohlc['Date']  
  4. del ohlc['Date']  

這時,雖然數據格式徹底一致,但程序會出錯,運行失敗。

問題的緣由多是,yahoo直接傳回的DataFrame,包含屬性tz,即time zone,

pybacktest的運算邏輯,須要處理tz這個屬性。可是,從csv文件讀出的DataFrame

沒有tz這個屬性,所以形成程序異常中斷。

還有,程序運行得出的回測結果,是什麼含意,沒看懂。

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
相關文章
相關標籤/搜索