当前位置: 首页 > news >正文

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

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

相关文章:

  • 设计模式:工厂模式
  • 基于Python实现的英文文本信息检索系统
  • java语言入门(一)之JAVA语言基础入门
  • Redis缓存数据库
  • Arm64 linux Virtual memory分析
  • std::cout、printf 和 RCLCPP_INFO的对比
  • 人工智能导论笔记
  • 基于ODBTC有序抖动块截断编码和DCT域数字水印嵌入提取算法matlab仿真
  • 场景文字检测DBnet论文解读
  • 【 失踪人口回归】新·学期
  • Win10安装TensorRT
  • 3、TypeScript高级数据类型
  • Vue-Router入门-掌握基础知识
  • OCR - 关于OCR技术体系的发展的了解
  • 《uni-app》表单组件-Picker组件
  • [ JavaScript ] 数据结构与算法 —— 链表
  • CAP理论的例子讲解
  • JSONP原理
  • nodejs实现webservice问题总结
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Python_OOP
  • Python学习之路16-使用API
  • Redux系列x:源码分析
  • zookeeper系列(七)实战分布式命名服务
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 设计模式 开闭原则
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 《天龙八部3D》Unity技术方案揭秘
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • ​configparser --- 配置文件解析器​
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (27)4.8 习题课
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (多级缓存)多级缓存
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (十三)Maven插件解析运行机制
  • (四) 虚拟摄像头vivi体验
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)创业的注意事项
  • (转)甲方乙方——赵民谈找工作
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • ./configure,make,make install的作用
  • .NET 5种线程安全集合
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .net Stream篇(六)
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .net反编译的九款神器
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • /var/log/cvslog 太大
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [20170705]diff比较执行结果的内容.txt