引入bt框架作为回测新引擎基础,附带A股核心指数历史数据(全回测系统+数据下载)

今天继续bt框架之应用、改造与解读,目前看,把bt框架融合进来,是一个正确的选择。

原因:

1、我们之前的“积木式”模块化,本身与bt理念就是一下的,学习成本与改造代价很低,很多拿过来可以直接用。

2、bt本身比较成熟,交易手续,滑点,它的报表,可视化,指标都比较完善,这一块之前打算自研,还是有不少细节要处理。

3、亮点功能:多策略,得益于它的树形结构,它可以同时跑多个策略,性能很多(cython加持)。

如下代码,一次定义并运行三个策略效果对比一目了然(之前我的做法是把三个策略运行后,结果保存起来综合对比,这是无奈之举,bt框架完美的解决了这个诉求):

图片

df_factor = df[['symbol', factor_name]]print(df_factor)stra_name = '大小盘动量轮动'strat = engine.Strategy(stra_name,                        [                            #RunMonthly(),                            SelectTopK(df_factor=df_factor, factor_name=factor_name,K=1, b_ascending=False),                            WeighEqually(),                            Rebalance()                        ]                        )s2 = engine.Strategy('等权买入-再平衡',    [        RunMonthly(),        SelectAll(),        WeighEqually(),        Rebalance()    ])s_bench = engine.Strategy('基准-沪深300000300',    [        SelectThese(tickers=['000300.SH']),        WeighEqually(),        Rebalance()    ])bkt = engine.Backtest(strat, df_close,integer_positions=False)bkt2 = engine.Backtest(s2, df_close,integer_positions=False)bkt_bench = engine.Backtest(s_bench, df_close,integer_positions=False)res = engine.run(bkt,bkt2,bkt_bench)

 

图片

algos_extend.py是我扩展的模块,主要是把topK算子,这个我们在轮动策略里用得很多的,迁移过来了。

代码在如下位置,大小盘轮动的notebook里,有上述多策略的演示:

图片

吾日三省吾身

昨天睡得不错,因为一个工作中一个纠结好久的项目,终于有人来帮忙。尽管看起来仅算是帮忙,但终归有不小的进展。

有因此小事而困扰,格局还是需要提升。

人生之意义是自己赋予了。

有人觉得城市喧嚣好,有人认为田园风光好。

自己舒服就好。

一个好的状态是“做时间的朋友”。就是你做的事情,你布的局,时间对你是有利的,你就是时间的朋友。

好看的皮囊就不是时间的朋友,因为容颜终会老去。

读过的书,走过的路,经历过后的反思。

时间会解决很多问题,或者说是一切问题。

如果你是时间的朋友,一切就会越来越好。

成功是多因素的综合态,成长是自己可以努力的变量。

投资理财能力、阅读与深度思考,健康的生活习惯,写作沉淀有价值的内容,这些都是时间的朋友

格局大了,就不必也不会在意蝇营狗苟,之于烂人烂事,最好的方法,莫过于无视。

时间的朋友会解决一切。

原先的计算是把系统开发的差不多,再写专栏。

随着星球小伙伴越来越多,对于系统构建思路,代码讲解,系统的可运行性,包括向后兼容提出更高的要求。

因此今天开始,把专栏这个事情提上日程,尽量更新吧。

说实话,这个写完差不多是一本书了。

图片

不一定会按照顺序写,一开始肯定是围绕一个可以跑起来,但扩展性要好的回测系统。然后数据模块,因子模块,机器学习模型,最后是策略实战。

昨天我们提及的bt。http://pmorissette.github.io/bt/

特点:

1. 矩阵模式回测

2. 结构简单,只三个文件,再引用了ffn库,也是三个文件

3. 可以绘图,生成权重、持仓、交易清单等。

另外:

1. 支持策略树,可以将多个策略进行叠加、嵌套,组合成复杂策略

2. 支持大类资产配置,内置了等权、波动率倒数,均值方法、风险平价四种方法

3. 模块化,可以对模块进行组合定制。如定时运行、指定权重等等

咱们之类的框架,实现了它的大类资产配置和模块化,策略树这个有点意思。

因为它只有三个文件,而且backtest.py和algos我们都比较熟悉了,只需要熟悉一下bt这个树结构,在core.py中。

图片

上述就是我们的传统策略,SPY和AGG做股债平衡,但我们可能需要这样的策略,债券是被动操作,但权益类的需要主动管理,比如动量策略,那么策略树可以改成这样:

图片

在我们自己用的“绝对型收益”组合策略构建上,这个很有多,通常策略有择时、轮动,大类资产配置,还是就是策略组合,多策略组合在一起,可以有效降低回撤,提升夏普比。

node是这个树结构里的重要节点,它即是策略的基类,也是证券的基类,我们可以把多策略组合,策略与证券也做组合等等。

class Node(object):
    _capital = cy.declare(cy.double)
    _price = cy.declare(cy.double)
    _value = cy.declare(cy.double)
    _notl_value = cy.declare(cy.double)
    _weight = cy.declare(cy.double)
    _issec = cy.declare(cy.bint)
    _has_strat_children = cy.declare(cy.bint)
    _fixed_income = cy.declare(cy.bint)
    _bidoffer_set = cy.declare(cy.bint)
    _bidoffer_paid = cy.declare(cy.double)

    def __init__(self, name, parent=None, children=None):
        self.name = name

        # children helpers
        self.children = {}
        self._lazy_children = {}
        self._universe_tickers = []
        self._childrenv = []  # Shortcut to self.children.values()
        self._original_children_are_present = (children is not None) and (
            len(children) >= 1
        )

        # strategy children helpers
        self._has_strat_children = False
        self._strat_children = []

        if parent is None:
            self.parent = self
            self.root = self
            # by default all positions are integer
            self.integer_positions = True
        else:
            self.parent = parent
            parent._add_children([self], dc=False)

        self._add_children(children, dc=True)

        # set default value for now
        self.now = 0
        # make sure root has stale flag
        # used to avoid unnecessary update
        # sometimes we change values in the tree and we know that we will need
        # to update if another node tries to access a given value (say weight).
        # This avoid calling the update until it is actually needed.
        self.root.stale = False

由于bt有一个bug,我看了它的issue,似乎没有复现与解决:

因此我把代码拉出来自己改进:

图片

核心指数数据:

图片

数据加载及表达式引擎示例,

图片

最新的“大小盘月度再平衡”的例子:

图片

图片

图片

重构后的引擎及策略代码均已在星球发布,请自行更新。

本次属于从零重构,改动很大,请大家知晓。

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/103964
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 2024 年 7 月 29 日
下一篇 2024 年 7 月 29 日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注