• 从零开始实现一个量化回测系统(二)


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

    今天继续“从零实现一个量化回测系统”系列。

    前篇把骨架搭建起来了,现在要实现量化之核心要策略。

    策略就是根据输入的市场数据,设定的规则发出买或卖的指令。

    01 积木式写策略

    我的策略写法与传统不太一样,传统上来就是给一个on_bar函数,自己写策略吧,如同我们在pyalgotrade里看到的例子那样。

    pyalgotrade量化回测框架简单试用

    我把常用的策略变成策略块,然后只需要组合起来,就可以实现一个策略。

    比如“买入并持有”,我们拆解成三个子策略,这些子策略是可以复用的:

    一、只在第一天运行一次

    class RunOnce:
        def __init__(self):
            super(RunOnce, self).__init__()
            self.done = False
     
        # 返回True表示后续的策略都不执行了,相当于是一个开关
        def __call__(self, context):
           done = self.done
           self.done = True
           return done

    二、股票池里所有的股票

    当天的bar的index,写到context['selected']里

    class SelectAll:
        def __init__(self):
            pass
        def __call__(self, context):
            df_bar = context['bar']
            context['selected'] = list(df_bar.index)
            return False

    三、等权买入

    等权分配是比较常见的策略,从上一步得到的“selected”列表,来生成权重weights=[code: 比例]。

    class WeightEqually:
        def __init__(self):
            pass
        def __call__(self, context):
            selected = context["selected"]
            n = len(selected)
            if n > 0:
                context['weights'] = {code: 1 / n for code in selected}
            else:
                context['weights'] = {}
            return False

    我们engine的step函数需要加上算子的执行:

    def step(self, index, date):
        df_bar = self.df.loc[date]
        if type(df_bar) is pd.Series:
            df_bar = df_bar.to_frame().T
    
        df_bar.index = df_bar['code']
        df_bar.sort_index(ascending=True, inplace=True)
        self.acc.update_bar(date, df_bar)
    
        #收盘后,再执行交易(近似模拟)
        context = {
            'bar': df_bar
        }
        for algo in self.algo_list:
            done = algo(context)
            if done:
                break

    如此,我们把三个算子整合起来,就实现了“买入并持有”的策略:

    e = Engine(init_cash=100000, datafeed=feed)
    e.run(algo_list=[RunOnce(), SelectAll(), WeightEqually()])

    积木式的好处多多,可以复用,可以积累。

    明天可以把买卖交易落地到Account里,并且可以对回测的风险、收益策略进行分析,并且可视化呈现出来。

    关于投资的思考

    投资也是门派林立,正统的如价值投资派,有点像武林中的名门正牌,基金经理多与少都号称自己的是价值投资。价值投资的心法是公司价值为锚,在价格低于其内在价值里买入,并在价格高估时卖出。另外一派是技术面派,所有信息都反应在价格里了,所以,只管看价格趋势,高估还可以更高,只要市场疯狂;低估还可以更低,恐慌情绪一旦形成。

    其实都有道理,这是周期的不同阶段。

    价格围绕价值如钟摆,群体的不理性把这个过程放大。技术派赌的是往右摆的过程,指望有高点退场;而基本面牌买在左边,越低越买,然后在市场回归时卖出。

    量化派则吸收前两者心法中一切可以量化的信息。

    量化派更接近科学,可以积累可以传承,可以优化,可以迭代。

    最近文章:

    从零开始实现一个量化回测系统(一)

    pyalgotrade量化回测框架简单试用

    飞狐,科技公司CTO,用AI技术做量化投资;以投资视角观历史,解时事;专注个人成长与财富自由。

  • 相关阅读:
    java毕业生设计高校共享机房管理系统的设计与实现计算机源码+系统+mysql+调试部署+lw
    C语言之:函数的声明和定义必备练习题
    Emmet语法
    正态分布的概率密度函数|正态分布检验|Q-Q图
    NLP入门——数据预处理:子词切分及应用
    全网最全斗音短视频新老账号起号技巧
    步进电机实验
    SpringBoot前端后端分离之Nginx服务器
    shell脚本常用命令(三)
    在springboot工程中修改使用quartz创建的定时任务
  • 原文地址:https://blog.csdn.net/weixin_38175458/article/details/126804736