持续行动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同样存在这样的缺陷,传统这些量化框架,都更加适合技术分析的量化,加载的数据量比较少,因子比较少。
后续我们来讲讲自主研发的量化框架。