Python 算法交易实验75 QTV200后续想法梳理

news2025/1/20 10:55:56

说明

在第一步获取数据源,然后进入Mongo(第一个数据节点)开始,QTV200的数据流体系就开始动了。后续用多少时间完成不太好确定,短则数周,长则数月。毕竟有过第一版实验的基础,应该还是可以做到的。

下面就是天马行空,简单的想想,梳理一下,后续会更清楚写。

内容

1 第一版做了什么?

第一版只在很有限的几个标的上实验,主要就是沪深300、中证500、券商和医药,还有就是很早之前(甚至早到研究生论文)关注过的军工ETF。

在获取数据后,我快速做了两个版本。一个版本完全是基于惯性(回归),另一个版本是基于动量做的。后来证明,惯性的方法甚至不一定比动量的差。大概是因为ETF本身已经形成了较为稳定的分布。

后来进行了回测,以及通过短信通知的操作方式进行实盘实验。最初我认为,模型的决策能力比人强,这个本身没有错;差别点在于,人类的操盘手,他们进行交易决策时所依赖的数据与模型的并不相同。很多时候是在模式的状态下工作的。所以,即使模型的决策能力比人强,但是由于数据维度的“不公平”,所以很难说模型一定超过人类。

但是anyway,在去年到今年一年的时间里,模型一直以回测状态在运行,虽然没有很高的收益,但是没亏钱,在这个行情下说不定超额收益蛮高的(沪深300亏了20个点吧)。当然,我觉得qtv本身有很大的提升空间,即使在过去一年这样的行情下,我认为仍然应当取得稳定收益。从实盘的观测上看,这是存在可能性的。这也是qtv200的目标和意义。

第一版的意义在于真正意义上开始了这件事

其实从我的眼光来看,第一版从技术上讲是不及格的。其中既包括了当时所用的技术架构,也包括了从业务上看不具备足够的单量和盈亏比表现。自我批判和自我否定是必要的,但绝对不是去抹掉第一版的成果 ,而是要充分吸收当时做的好的地方,然后利用现在新的工具,以及实际操作之后的经验,来更上一层楼。

架构上,当时用了所谓的ADBS方法,也就是队列+mongo+apifunc的方式。这种方式从表现上看,IO上过于低效了,在流程上也比较冗杂,是基于标的一个个的建立mongo数据库和stream来进行的。现在通过flask-celery提供异步worker,会完全解决掉IO问题,至少支持60~100个标的没有问题。这肯定会解决掉单量不足的问题。

无可以持续改进的数据基础。这可能是较为隐性的问题,当我有灵感,想要再次给这个系统加buff的时候,突然发现是无从下手的。这体现了在数据流设计上的缺失 ,没法进行扩展和修改。现在通过UCS,从机制上,所有的工作已经被统一了。另外,基于flask-celery-aps形成的数据流体系,也使得改造变得尤其简单。(刚刚做完从clickhouse - mongo的转变,丝滑的不可思议) 基于新的数据流系统,持续改善以及分布式执行都将得到大幅提升。

模型的机制缺陷。最初我只是简单的做判别模型,一个潜在的风险是什么呢? 具备大涨可能性的同时,也具备大跌的可能性。所以最终策略还能不亏钱,已经算是还蛮厉害了。(毕竟每个订单都存在0.5%的费率损失) 这个将在qtv200得到很大的改善,但有很多更高级的方法,现在我尚无工程结论。

没有区分模式。最初我是想寻找一个子空间,让模型处在更高的概率区间运行的,但是失败了。我记得主要的原因是一旦筛选了概率,那么数据支持度就会不够。现在想想,我建模的时候是基于空间的,但模式并不一定非得基于空间啊,应该可以基于时间,或者时空。

回测机制效率低。具体的细节我没有再去查探了,应该是这样的。而且很多同质的信号。但是,这种类似与随机优化的方式,也还是值得在精神上肯定一下的。

交易机制有bug。发现的时候已经太晚了,而且很不好改,所以也就放弃了。主要是在最大持有和卖出的时间上有问题,要么周期未到,要么连消息都漏了,要么就是收盘后给我发一个当前3:00平仓的信号,简直无语。主要是自己做的,没其他人可抱怨,都怨我,哈哈。

以上是我觉得不及格原因,没有夸张。但反过来想,这样都能在这种行情下不亏钱(甚至还略有盈余),所以这事靠谱啊。

第一版并不是一无是处的,除了勇气之外,技术有一些地方可以肯定,并且我也打算复用。

变量的特征处理标准化。 当时时间紧任务急,我最担心的是开发和生产时的特征处理不一致,所以使用了VV(Var & VFrame)对象来确保特征的统一生成。最终确实是一种不错的方法,即使操作稍显冗余,但也是workable的,并且这种模式很容易向智能(Agent)方法发展,因为中间的过程都是参数化操作。

模型标准对象。 我将模型的预测和使用封装为一个基类对象,可以更好的流水线生产模型。我觉得这次可以稍微先用一下,看有没有机会用更好的方式进行封装,或者进行改造(例如和MLR方法对接)

2 现在又有了什么

马斯克说,创新并不总是创造出全新的东西,在新的环境下,即使是把老的东西用新的方法再做一次,也是创新。我深以为然。

我一直是在遵循第一性理论,基于我对一件事(比如量化)的想象,不断的去学习、实验,来找到那个第一性答案。实际能看到的变化是,我的工具、方法一直在按一种线性的方式前进。这还是挺让我感到欣慰的,毕竟目标还是0,过程中能看到一些实证还是挺好的。

在过去的一年里,肉眼可见的变化还是很多的:

  • 1 异步任务系统。简单点说就是flask-celery-aps, 过去定位有问题,想用这个来进行通用的分布式,这是不太行的。但是作为IO的worker,这个是非常合适的。这个系统可以帮助我更有效的构建数据流(大幅减少时间),使得在当前硬件下,可以支持足够etf的吞吐。同时,这使得分布式工作变得自然。
  • 2 算力租用机。在过去的一年里,算力租用这件事对我变得非常自然,我也至少对3个平台的租用和部署比较熟悉了。这对我之后进行超大规模计算提供了算力基础。
  • 3 clickhouse。这个很有用,至少有两方面:块读取和统计分析。这个数据库可以提供近乎内存的读取和计算速度。
  • 4 pydantic。 过去没有重视,随着大模型的研究,这个浮出水面。这可以大幅简化配置、数据规范化传递、数据节点定义等工作。既有编程上的帮助(简单),也有结构上的帮助(数据流中数据节点的具象描述)。
  • 5 GlobalFuncs & GFGoLite & Basefuncs: 最初是全局函数,后来因为怕概念太大没等设计好就荒废了,所以迅速弄了GFGoLite,一个轻一点但是马上能用的服务,后来又觉得本地包也需要(和GFGoLite几乎同源),所以有了这么几个形态。这些工具既能提供编程帮助,也蕴含了规范约束(UCS),还有想未来智能演化的潜质(间接使用、参数化调用、Agent)
  • 6 GlobalBuffer。这个可以作为worker的元数据缓存,确保每次的运行是可以有状态的。
  • 7 强化学习。这块强行粗浅的入了门,算是战略部署。最后在业务上体现的系统效果是通过强化学习来完成的。
  • 8 关于模型和策略的方面的新想法。一个想法是模式优先。一个想法是模型目标,以盈利而非赢单为目标。
  • 9 简单有限状态机(SFSM)。一种可以更明确和有效定义运行状态的方法。
  • 10 Streamlit & Gradio。后端到前端的快速投射,一个使用与做快速的web展示,一个可以做更复杂的后端操作。
  • 11 异步请求与异步服务。异步请求将可以使对多个微服务系统的数据请求同步完成。
  • 12 Nginx的反向代理与负载均衡。这块经过更多的测试和调整,减少开放的web端口,并真正实现有效的负载均衡。

虽然还感觉有无数的东西要完善,感觉自己做的还不够好,不过回头过一看,还是有不少收获的。毕竟我算是偏笨一些的,只能靠长期堆量来找到正确的方式。这么一想,心理就平衡了。

3 接下来怎么做

首先是数据规划。明确每个数据节点的作用与形态,which should/could be pydantical。

下面是之前画的一个草图。由于异步任务系统的存在,可以认为当前本地资源可以确保60~100个标的的流转不会有任何问题。绿色的都是队列:队列的一端必然连接worker,worker是绝对灵活的。

上次修改是的[行情数据Out] --(s2ch)-->[行情数据], 取消了s2ch,而是用一个临时的worker(xxx s2mongo.py)替代了,解决了数据可能存在的重复问题。
在这里插入图片描述
在第一步完成了之后,可以将历史数据补全,然后下一步有三个分支。

  • 1 【实时数据保持】将所需的block在内存中进行实时保留。
  • 2 【特征生成】【数据分析】【模式识别】形成一套方案,根据前N个block数据形成一套特征。即时间转空间特征。对应的工具是VV。本次在进入特征生成之前,先进行基础的数据分析。需要形成描述性的技术指标,供分析和思考。需要得到的成果是,可以根据技术指标,快速的获得总体态势感知、策略表现等。另外,要能够形成 一套模式识别方法。
  • 3 【回测】回测时将预先生成好所有可生成的数据,然后按照时间轴向前推进。使用的对象包括TimeTraveller,执行的方式将通过RabbitMQ任务方式。

这里要注意,结构化数据将从mongo出提取出,然后存入clickhouse。这个机制需要补上,而且后续形成的可解释、结构化的结果,应该都存入clickhouse:这样方便block读取,也可以快速统计。

这部分要学习一下在 ClickHouse 中处理更新和删除, ch支持块级删除让我觉得太适合UCS了,UCS本身就强调以块为单位操作。

再下一步就是指定具体的策略,以及通过强化学习来进行挑选,并和操作进行集成,暂且不提。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1880772.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【TB作品】玩具电子琴,ATMEGA128单片机,Proteus仿真

题目 7 :玩具电子琴 基于单片机设计一能够发出中音八个音阶的音乐信号的电子琴,能够实现弹奏和音符显示功 能。 具有 8 个音阶按键,每按下一个按键时,所对应的 LED 点亮,音符进行显示。 具体要求如下: &…

zabbix server client 安装配置

Zabbix Server 采用源码包部署,数据库采用 MySQL8.0 版本,zabbix-web 使用 nginxphp 来实现。具体信息如下: 软件名 版本 安装方式 Zabbix Server 6.0.3 源码安装 Zabbix Agent 6.0.3 源码安装 MySQL 8.0.28 yum安装 Nginx 1.20…

淀山湖之行随笔

我们仰望清新,但又不得不被世俗所伴。 近日上海开始进入梅雨季节,每天大大小小的雨水不断,整个环境也格外的潮湿,不过已经逐渐习惯这种气候,所谓的见怪不怪。 今日是周日,思绪好久,准备去淀山湖…

贪心问题(POJ1700/1017/1065)(C++)

一、贪心问题 贪心算法 贪心算法(greedy algorithm),是用计算机来模拟一个「贪心」的人做出决策的过程。这个人十分贪婪,每一步行动总是按某种指标选取最优的操作。而且他目光短浅,总是只看眼前,并不考虑…

【mysql死锁】示例 和讨论 “SHOW ENGINE INNODB STATUS“

文章目录 mysql 死锁死锁演示表结构如下 死锁查询mysql 详情命令行 SHOW ENGINE INNODB STATUS 如果 两个事务都是按照先更新1 再更新2的顺序去做更新 会发生死锁么?验证一下所以 如果顺序是一致的 不会产生死锁 只会进行等待 防止mysql 死锁的方式优化sql 自行顺序…

(2024,DDPM,DDIM,流匹配,SDE,ODE)扩散:基础教程

Step-by-Step Diffusion: An Elementary Tutorial 公和众与号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0 前言 1 扩散的基础知识 1.1 高斯扩散 1.2 抽象中的扩散 1.3 离散化 2 随机采样…

React 打包时如何关闭源代码混淆

React 开发中,使用 npm build 命令进行生产代码打包,为了压缩代码并尽量保证代码的安全性,React 打包时会代码进行压缩和混淆,但是有时我们需要 debug 生产环境的源代码,例如当我们调试 SSR 的项目时,需要禁…

业务模型扩展字段存储

构建业务模型时,通常模型会设置扩展信息,存储上一般使用JSON格式存储到db中。JSON虽然有较好的扩展性,但并没有结构化存储的类型和非空等约束,且强依赖代码中写入/读取时进行序列化/反序列化操作, 当扩展信息结构简单且…

SpringMVC(1)——入门程序+流程分析

MVC都是哪三层?在Spring里面分别对应什么?SpringMVC的架构是什么? 我们使用Spring开发JavaWeb项目,一般都是BS架构,也就是Browser(浏览器)-Server(服务器)架构 这种架构…

JVM(12):虚拟机性能分析和故障解决工具之JConsole

1 JConsole作用 查看Java应用程序的运行概况,监视垃圾收集器管理的虚拟机内存(堆和元空间)的变化趋势,以及监控程序内的线程。 2 使用说明 代码如下: package com.example.demo;import java.io.IOException; import java.util.ArrayList; …

AliyunOS安装Node.js

方法1:dnf软件包安装工具自动安装 最方便的安装方式是通过系统的dnf工具,我测试使用的AliyunOS的版本是Alibaba Cloud Linux 3.2104,具体流程如下: dnf module list nodejs #列出服务器中可以使用的所有nodejs版本确定下来希望安…

[Ant Design Vue 树控件Tree]内存溢出报错

使用ant design vue控件时发现报错,但是数据展示时没有问题的; 具体报错信息:Maximum call stack size exceeded 经排查,是我的目录下数据过多,差不多有小一万的数据; 查看官方文档,使用虚拟滚…

50-4 内网信息收集 - 本机信息收集

一、内网信息收集 内网信息收集可以从以下几个方面进行:本机信息收集、域内信息收集、内网资源探测等。通过这些步骤,我们可以全面了解当前主机的角色和所处内网的拓扑结构,从而选择更合适、更精准的渗透方案。 二、本机基础信息收集 在本机基础信息收集阶段,可以执行以下…

vue+canvas画布实现网页签名效果

1、签名自定义组件代码示例&#xff1a; qianMing.vue <template><!-- 容器&#xff0c;包含画布和清除按钮 --><div class"signature-pad-container"><!-- 画布元素&#xff0c;用于用户签名 --><canvasref"canvas" <!--…

后劳动经济学(PLE):AI时代的工作未来

引言 随着人工智能&#xff08;AI&#xff09;和自动化技术的飞速发展&#xff0c;我们迎来了一个新的经济范式——后劳动经济学&#xff08;PLE&#xff09;。这一概念主要讨论在AI和自动化技术超越人类能力的关键领域后&#xff0c;机器将不可避免地在许多经济活动中取代人类…

昇思25天学习打卡营第12天|ShuffleNet图像分类

1. 学习内容复盘 ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操作&a…

恢复策略(上)-撤销事务(UNDO)、重做事务(REDO)

一、引言 利用前面所建立的冗余数据&#xff0c;即日志和数据库备份&#xff0c;要将数据库从一个不一致的错误状态恢复到一个一致性状态&#xff0c;还需要相关的恢复策略&#xff0c;不同DBMS的事务处理机制所采用的缓冲区管理策略可能不同&#xff0c;发生故障后的数据库不…

LeetCode刷题之HOT100之最大正方形

今天下起了暴雨&#xff0c;本以为下午就可以结束的答辩又因为老师开会被推迟。研三的学长走了后我们开始了0元购&#xff0c;收获颇丰哈哈&#xff0c;做个题 1、题目描述 2、算法分析 给定一个矩形&#xff0c;要求最大正方形。第一次见这种题目哈 2024 6/30 嘿嘿&#xff…

一区算法MPA|海洋捕食者算法原理及其代码实现(Matlab/Python))

Matlab/Python&#xff1a; 本文KAU将介绍一个2020年发表在1区期刊ESWA上的优化算法——海洋捕食者算法 (Marine Predators Algorithm&#xff0c;MPA)[1] 该算法由Faramarzi等于2020年提出&#xff0c;其灵感来源于海洋捕食者之间不同的觅食策略、最佳相遇概率策略、海洋记…

C++异常智能指针

目录 异常 异常的定义 异常的抛出和捕获 异常安全问题 异常的规范 智能指针 RAII思想 使用RAII的例子 智能指针 文件资源 在linux中管理锁资源 智能指针发展历程 auto_ptr unique_ptr shared_ptr 异常 异常的定义 异常是一种处理运行时错误的机制&#xff0c;它…