回测框架pybacktest简介(二)

pybacktest 的疑点

第(一)节“教程”原文,是用 ipython notebook 写成,程序代码是一些片段组成。

为了阅读方便,合并在一起。

 

本文转载于:http://blog.csdn.net/lawme/article/details/51773744

 

[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 用法的确简单。

 

但教程中有几句,没有看懂。例如以下2句:

 

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

 

不知道这两个函数出自何处,且有时能通过“编译”,有时却不行。

原因后来找到了。因为代码是在ipython notebook中,

若有“魔术命令”%pylab inline 这两个函数可以直接调用。

该例程虽未显式使用%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
posted @ 2017-09-21 16:18  zl306222525  阅读(794)  评论(0编辑  收藏  举报