持续行动1期 40/100,“AI技术应用于量化投资研资”之可转债投资。
今天要讲一个量化的传统“科目”——回测。
很多人一提及量化,第一个想到的就是回测系统,写一个strategy,搞两个技术指标跑起来看看。
前面的时间我们一直在聊数据,因为数据和因子才是量化的灵魂,回测系统仅是工具,而且成熟的开源项目大把,还是很多带数据源的类似quantopian的平台。
我打算分享4个量化回测引擎:pyalgotrade, backtrader ,我自研的以及qlib内置的。
特别说明一下,qlib内置的回测系统,适合机器模型驱动的,当然你非得改造成传统事件驱动的,自己实现也可以。我会考虑把我自己的回测系统,往qlib的框架里靠一靠,如果有必要的话。
今天先看一个简单的:pyalgotrade。
安装很简单:pip install PyAlgoTrade
它的版本停留在0.2,后面应该不维护了,但基本也够用了。
https://github.com/gbeced/pyalgotrade
文档地址:
http://gbeced.github.io/pyalgotrade/
https://pyalgotrade-docs-zh-cn.readthedocs.io/zh_CN/latest/tutorial.html
有人改进了国内市场的版本,开源地址如下:
https://github.com/Yam-cn/pyalgotrade-cn
01 hello pyalgotrade
from pyalgotrade import strategy from pyalgotrade.barfeed import yahoofeed class MyStrategy(strategy.BacktestingStrategy): def __init__(self, feed, instrument): super(MyStrategy, self).__init__(feed) self.__instrument = instrument def onBars(self, bars): bar = bars[self.__instrument] self.info(bar.getClose()) # Load the yahoo feed from the CSV file feed = yahoofeed.Feed() feed.addBarsFromCSV("orcl", "orcl-2000.csv") # Evaluate the strategy with the feed's bars. myStrategy = MyStrategy(feed, "orcl") myStrategy.run()
-
声明一个新的策略。
-
只有 onBars 方法是必须要定义的,此方法会在每次推送 bar 数据时执行。
-
从 CSV 文件加载数据。
-
基于 feed 提供的 bar 数据运行策略。
这个csv通过yahoofinance已经不好使了,我们使用自己的格式下载来回即可。
我们使用茅台的股票数据。
pyalgotrade的数据column是大写字母开头,而且必须有复权价。
把收盘价打印出来:
plt = plotter.StrategyPlotter(myStrategy) myStrategy.run() # Evaluate the strategy with the feed. print("Final portfolio value: $%.2f" % myStrategy.getBroker().getEquity())
plt.plot()
02 参数优化
如下是本地参数集回测的代码。
import itertools from pyalgotrade.optimizer import local from pyalgotrade.barfeed import yahoofeed import rsi2 def parameters_generator(): instrument = ["dia"] entrySMA = range(150, 251) exitSMA = range(5, 16) rsiPeriod = range(2, 11) overBoughtThreshold = range(75, 96) overSoldThreshold = range(5, 26) return itertools.product(instrument, entrySMA, exitSMA, rsiPeriod, overBoughtThreshold, overSoldThreshold) # The if __name__ == '__main__' part is necessary if running on Windows. if __name__ == '__main__': # Load the feed from the CSV files. feed = yahoofeed.Feed() feed.addBarsFromCSV("dia", "dia-2009.csv") feed.addBarsFromCSV("dia", "dia-2010.csv") feed.addBarsFromCSV("dia", "dia-2011.csv") local.run(rsi2.RSI2, feed, parameters_generator())
pyalgotrade怎么说呢,麻雀虽小,无脏俱全。
尤其是写传统技术面相关的策略,比如均线,MACD,动量这种策略,特别合适。交易的股票支数不多,因子不太,买卖规则清晰。
03 多支股票轮动
这个场景是我们最需要的。
另外我们的数据格式是dataframe计算好了指标。但pyalgotrade只能从csv添加,这个就比较麻烦了。
它的买卖状态的可视化部分的代码我们可以参考下。
backtrader同样存在这样的缺陷,传统这些量化框架,都更加适合技术分析的量化,加载的数据量比较少,因子比较少。
后续我们来讲讲自主研发的量化框架。
飞狐,科技公司CTO,用AI技术做量化投资;以投资视角观历史,解时事;专注个人成长与财富自由。