• pyalgotrade量化回测框架简单试用


    持续行动1期 40/100,“AI技术应用于量化投资研资”之可转债投资。

    今天要讲一个量化的传统“科目”——回测。

    很多人一提及量化,第一个想到的就是回测系统,写一个strategy,搞两个技术指标跑起来看看。

    前面的时间我们一直在聊数据,因为数据和因子才是量化的灵魂,回测系统仅是工具,而且成熟的开源项目大把,还是很多带数据源的类似quantopian的平台。

    我打算分享4个量化回测引擎:pyalgotradebacktrader ,我自研的以及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()
    
    1. 声明一个新的策略。

    2. 只有 onBars 方法是必须要定义的,此方法会在每次推送 bar 数据时执行。

    3. 从 CSV 文件加载数据。

    4. 基于 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技术做量化投资;以投资视角观历史,解时事;专注个人成长与财富自由。

  • 相关阅读:
    易点易动RFID固定资产管理系统:实现极速盘点与全生命周期管理
    微信小程序列表渲染
    Java中如何执行多条shell/bat命令 2023年验证通过
    什么是协程?
    【macOS】Win通过VNC远程控制Macbook
    小程序的自定义组件
    知到测试---大学生心理健康教育
    【LeetCode】每日一题 2023_11_21 美化数组的最少删除数(贪心/模拟)
    剑指Offer 07 重建二叉树 -- 从中序与后序遍历序列构造二叉树
    全面整理!机器学习常用的回归预测模型
  • 原文地址:https://blog.csdn.net/weixin_38175458/article/details/126779181