Python 算法交易实验67 第一次迭代总结

说明

在这里对第一次迭代(2023.7~ 2024.1)进行一些回顾和总结:

回顾:

  • 1 实现了0~1的变化
  • 2 在信息隔绝的条件下,无控制的操作,导致被套

总结:

思路可行,在春暖花开的时候,迭代完一版,应该可以取得不错的结果。

内容

1 失败分析

第一次迭代最后的失败的主因还是因为急功近利的心理,然后不受约束的开始买入,导致被套。我认为市场大跌并不会有这种后果:因为模型分已经知道市场不是一个很好的状态。

主要是主观的想象力,认为要出现V字反转,抱有侥幸心理的操作,从而导致被套的局面。

客观上一个很大的原因是因为在项目中不允许使用电脑和手机,本质上已经脱离了数据决策的基本环境(目前V1的系统,没有自动化的决策支持)。正是孙子兵法说的:乱军引胜。

故君之所以患于军者三:不知军之不可可以进而谓之进,不知军之不可以退而谓之退,是谓縻军;不知三军之事,而同军之政者,则军士惑矣;不知三军之权,而同三军之任,则军士疑矣。三军既惑且疑,则诸侯之难至矣,是谓乱军引胜。

主观上有两个错误,第一个错误是最根本的错误,无限放大了主观决策的权力;第二个错误没有将交易当成一个严肃的business,没有全局的资金计划和风控。

2 改进计划

要避免再次犯错误,必须立规矩,并约定好流程,形成习惯。

虽然我不太喜欢走流程,但是不得不承认,对于关键的决策,遵循流程(尽量短)是必要的。

假设我自己就是一家公司,有一定的原始资金,作为公司的CEO会怎么决定,站在股东的角度又会怎样挑刺,从而形成一套具有约束性的规范。

在寻求利益的稳定和最大化之前具有矛盾,在控制运行风险与利益最大化之间也有矛盾,可以先设置一些合理的规范,然后程序化,设置一个顶层的控制对象,来确保公司的整体运营平稳。

业务的核心逻辑很简单,具有资金,根据实时数据进行判断,作出投资决策。业务的本质类似于信贷:市场行情作为一个虚拟人,在每个时刻向公司申请(无抵押)贷款,公司根据其信用评分作出放贷决定。一笔成功的放贷会在指定的一段时间内获取一定的收益,可能是半个点到十几个点,试不同的类型决定;一旦失败,本金将会损失流动性,或者输掉几个点到几十个点。总体上,一个单子的损失是远大于收益的。

所以,获益的核心是尽量提升成功率,同时也尽量的提前识别并避免损失(减少错误,止损)。

就市场本身而言,其状态是复杂的。最简单的维度是大盘整体的指数点位,所以在不同的点位应当留有准备金。投资最大的风险是在一个区间段发生剧变,所以可以按时段,例如每个自然月限制允许投资的最大值。

如果机械的按照大盘点位和时间划分成网格的话,风险虽然绝对控制了,但是由于资金的使用率过低,就会造成盈利效率过低的问题。

Topic1: 根据历史数据进行分析,明确是否可以简单的按月进行风险控制,例如,假设总资金60万,每个月投资上限是10万。

Assumption 1:市场行情的变化不会太持久,按较大的时隙(月)错开之后,资金不会被套。

平摊的周期越长,抗风险的能力越长,但是资金的盈利效率相应的也就降低了。等于只使用10万运营,每月如果盈利2%,年盈利则是24% ,按60万本金摊,那么才4%的年化。如果分为3股,那么就是8%,利益翻倍,风险也随之翻倍。

【月目标】低风险(6个月)的参考基准(无风险利率)是2%,中风险(3个月)的参考基准是1%

Topic2: 宏观判断,次月是否下跌。

每个月有投资授信上限,但是没有投资下限。这意味着,如果识别投资月处于下跌可能,可以减少投资额,甚至不投资。

从数学上考虑,这样是合理的。当下跌可能变大时,通常也会有上涨的可能,这些幅度通常都会比较大的。当这种剧变的概率高,那么降低投资额,从风险上显然是会有规避作用;即便从收益上看,也可以取得较为平均的结果。即:损失超额(下跌/上涨)而取其平均。

这样做是符合理想Business的设定的:一个稳定收益,随时间不断增长的的业务。这个稳定业务,年化收益是以无风险收益作为下限参考,20%作为及格线参考,50%作为风险控制的上限参考的。
也就是说,当收益超过50%时,会采取策略提高安全性,而不是继续追高收益。

【抓手】还得是报表。

同样地,我也不喜欢报表,但看起来在初期阶段,还是需要开发报表来完成管理职能。报表将用于宏观的决策:是否对策略、投资标的进行增删改?是否扩大或者缩小经营规模等。

临时分析:

  • 1 获取数据,按月计算统计
    在这里插入图片描述
  • 2 计算月均值的差

比较让人意外的是,月均值上涨的月份数竟然更多
在这里插入图片描述
最好是根据变号的方式来统计连续值的个数,所以从统计上看,最近连跌6个月是比较罕见的。所以,大概率月底会翻红,或者2月份。
在这里插入图片描述
按月来看,指数显示出了更好的统计特性:围绕均值为0上下波动。
在这里插入图片描述
从变异系数来看, 月波动一般都是1个点以上。
在这里插入图片描述
最近6个月的最大回撤约为14%,历史上的最大回撤约为38%,所以现在的行情也算是毛毛雨了。

回答最初的猜想:将资金分散到3个月投资是否可行。
在这里插入图片描述
总体的rolling,6个月风险会小很多:
在这里插入图片描述
最近24个月的rolling(所以恶劣情况下还是不太行的)
在这里插入图片描述
所以看起来,如果是简单投资,那么6个月的rolling是一个较好的选择。随之而来的问题是,有没有规律可以改善不同情况下的资金利用状态:是不均分的分布方式。

例如,在回撤已经特别大的时候,加大投资的授信额度,反之如果已经正向盈利较多,就减少最大授信额度(当月)。通过这种动态的授信方法,可以从宏观上控制风险。

当然,在具体的授信环节,模型本身也会具有风险识别的功能,这是一种自发的,业务性质的风控:当判断较为悲观时,交易会自发减少,这就会进一步避免错误的交易。

【结论】 初期还是以6个月为限比较合适,根据月最大回撤或最大升幅来动态调整月授信额度,最大可达50%。

所以,理论上2024.2可以是1.5倍月授信。

另外,可以约定每个标的每月的敞口不得大于当月授信总额的1/3。

每个月的收益及格线是5个点,良好得10个点。所以这个就有点难了,不过由于宏观控制了风险,所以单月的策略可以更激进。

单月额度 * 单月利润率 * 月份数 ÷ 2 ÷ 总额度

【估算】如果单月是5个点,那么一年大约是5个点,如果单月是10个点,那么一年大约就是10个点。

3 细节分析

3.1 回测对象的Bug

回测对象在运行时,其时隙的计算是错误的,虽然临时魔改修正了,但似乎还是有问题。这导致了持有周期的评估偏差。

这直接导致了最后信息传导时失效,前面所有的工作在这一步失败了,所以第一次迭代,最大的意义是打通关键环节,但并不足以作为生产。

3.2 信息缺失

之前主要考虑了短信通知的模板/字数限制,在大量的信息涌入时,已经完全分不清楚这个信息代表的交易,到底效果如何了。只能知道模型提出的买卖时点是否合理。

这起到了部分模型验证的作用,但也没有达到生产级。

3.3 建模方法

最初的模型只考虑盈利,这是不对的,至少不完全对。盈利模型更可能是双刃剑,但是也存在帕累托的可能。前者对于稳定运营的意义不大,所以一迭真是做了个寂寞。

追寻帕累托,至少是避险模型才是对的。

4 第二次迭代的推进目标

4.1 新BT(BackTesting)

这将是控制力更强,更可靠的工具。

设计上的改变:

  • 1 记录级对象(Rec Class )。这会确保控制的灵活性,特别是在debug上,非常精细。另外,未来这些将与数据库结合,仍然可以并行处理(群啸)。
  • 2 FlipFlop。对象的执行将分为计算元数据与数据两个固定步骤,元数据将决定状态,状态将影响数据的执行。
  • 3 Block吞吐。所有的数据执行将以Block作为单位进行吞吐,这个或许是影响最大的程序改变。

首先,原来的UCS设计是面向空间,或者说是日志型的。一个空间下,或者没有数据时间,或者有度量单位不一的多个标的的数据时间。现在将按照时间轴进行主数据合并,称为TBDB(Time-Based DataBase)。这意味着按照时间轴优先,然后去合并不同空间下的数据。每个空间在时间轴上的数据都是唯一的。TBDB是时序数据库的概念,其空间维度的拓展可以由其他的UCS而来。UCS由shard, part和block三个层级,以及项目名称构成唯一识别标志。例如, project_000.part_000.block_000 ~ task_id ,这个规范足以支撑千亿级别的数据。

Note: TBDB在存储格式上实际上也是UCS的,只不过task_id是时隙,block就是时间块了。

其次,每个worker将不直接从数据库请求数据,而是向Block Manager发出取数请求,BM会根据请求进行取数,这将带来很多好处。

  • a 减少不必要的数据库压力或磁盘吞吐。如果有n个worker在请求同样数据时,不会重复从数据库/磁盘取,而是从内存中取。多个worker是几乎一定会发生的事。
  • b 预取数。当worker处于历史回测状态时,BM可以预先将需要的后续block取好放在内存中,这样worker就不需要停等。
  • c 增强了数据规范,便于更大规模协同。由于数据的需求变成了离散化的块需求,即使通过文件系统也很容易进行协同。这将为使用拓展算力提供良好的基础。

4.2 前端

情况更清晰,辅助操作的能力更强

通过表格和其他前端技术实现:

  • 1 实现每月的资金使用、利润及订单报表。这样可以贯彻宏观的资金控制,并对交易进行细致的控制,用于迭代。
  • 2 订单的交易明细表设计。务求信息简洁且完整,足以让我第一时间信赖它,作出交易决定。
  • 3 消息列表设计。SMS将不提供明细,而是提供一个id号,在 前端提供完整的交易信息。

回测对象会生成Order对象

Order对象会在前端显示,从订单开始,手机用户的反馈。如果用户没有在合适的机会响应订单,订单将会关闭。

订单对象负责收集用户的反馈和交互,所以会在前端进行合理的展示。具有总分的特质,在外层显示基本信息,点进去可以显示详细信息。

特征将处理到若干表,所以在提取这些特征进行建模和分析时,需要async请求,要观察这些async是否会错乱。

要按时间建立主表,基于这些主表建立报表

4.3 建模方法

采用风险模型 + 固定利率的交易

在能够有效控制双刃剑/帕累托模型之前,将使用风险模型,以传统信贷模型的方式给出交易信号。并按照固定利率的交易方式触发交易。

以每单毛利 1%, 2% 建立日频的交易策略进行实验(A卡),之后在交易过程中进行追踪(B卡 ),最后对失败的订单进行清算(C卡)。

初期可以简化为A卡买入,在指定周期达标抛售,或者到期强制卖出。

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

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

相关文章

企业Oracle1 数据库管理

Oracle的安装 一、基础表的创建 1.1 切换到scott用户 用sys 账户 登录 解锁scott账户 alter user scott account unlock;conn scott/tiger;发现并不存在scott账户,自己创建一个? 查找资料后发现,scott用户的脚本需要自己执行一下 C:\ap…

三、MySQL库表操作

3.1 SQL语句基础(SQL命令) 3.1.1 SQL简介 SQL:结构化查询语言(Structured Query Language),在关系型数据库上执行数据操作,数据检索以及数据维护的标准化语言。使用SQL语句,程序员和数据库管理员可以完成…

Opncv模板匹配 单模板匹配 多模板匹配

目录 问题引入 单模板匹配 ①模板匹配函数: ②查找最值和极值的坐标和值: 整体流程原理介绍 实例代码介绍: 多模板匹配 ①定义阈值 ②zip函数 整体流程原理介绍 实例代码: 问题引入 下面有请我们的陶大郎登场 这张图片是我们的陶大郎,我们接下来将利用陶大郎来介绍…

stm32h7中RTC的BCD模式与BIN模式

RTC的BCD格式与BIN格式 BCD(Binary-Coded Decimal)和BIN(Binary)是两种不同的数字表示格式。 BCD格式: BCD是一种用二进制编码表示十进制数字的格式。在BCD格式中,每个十进制数位使用4位二进制数来表示&am…

c++程序的内存模型,new操作符详解

目录 内存四区 程序运行前 代码区 全局区 程序运行后 栈区 堆区 new操作符 创建一个数 创建一个数组 内存四区 不同区域存放不同的数据,赋予不同的生命周期,让我们更加灵活的编程 程序运行前 程序运行前就有代码区和全局区 代码区 程序编…

Windows系统下使用docker-compose安装mysql8和mysql5.7

windows环境搭建专栏🔗点击跳转 win系统环境搭建(十四)——Windows系统下使用docker安装mysql8和mysql5.7 文章目录 win系统环境搭建(十四)——Windows系统下使用docker安装mysql8和mysql5.7MySQL81.新建文件夹2.创建…

从0开始学习C++ 第十二课:指针强化

第十二课:指针强化 学习目标: 理解常量指针与指针常量的区别。学习如何使用函数指针。掌握指针与数组的高级使用技巧。 学习内容: 常量指针与指针常量 概念: 常量指针是一个指向常量的指针,这意味着不能通过这个指针…

Centos系统上安装PostgreSQL和常用PostgreSQL功能

安装环境 软件版本CentOSCentOS 7.xPostgreSQL9.x-12.x PostgreSQL安装 1、导入yum源 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm2、安装PostgreSQL服务 sudo yum install -y postgres…

【笔记】Helm-3 主题-12 Helm插件指南

Helm插件指南 Helm插件是一个可以通过helm CLI访问的工具,但不是Helm的内置代码。 已有插件可以搜索GitHub。 https://github.com/search?qtopic%3Ahelm-plugin&typeRepositories 该指南描述如何使用和创建插件。 概述 Helm插件是与Helm无缝集成的附加工具…

《Linux C编程实战》笔记:信号处理函数的返回

信号处理函数可以正常返回&#xff0c;也可以调用其他函数返回到程序的主函数中&#xff0c;而不是从处理程序返回。 setjmp/longjmp 使用longjmp可以跳转到setjmp设置的位置 这两个函数原型如下 #include<setjmp.h> int setjmp(jmp_buf env); void longjmp(jmp_buf …

Android 10.0 系统Settings修改底部导航栏和设置菜单项的分割线高度大小

1.前言 在10.0的系统定制化开发中,在进行Settings的开发中,在导航栏和设置菜单项布局中,会有一条分割线但是白色的,高度太小一般是 不注意看不出来的,产品开发需要要求设置分割线高度大一些修改分割线的高度,接下来就分析下相关功能实现流程 2.系统Settings修改底部导航…

QQ数据包解密

Windows版qq数据包格式&#xff1a; android版qq数据包格式&#xff1a; 密钥&#xff1a;16个0 算法&#xff1a;tea_crypt算法 pc版qq 0825数据包解密源码&#xff1a; #include "qq.h" #include "qqcrypt.h" #include <WinSock2.h> #include…

构建库函数雏形(以GPIO为例)

构建库函数雏形 进行外设结构体定义构建置位和复位函数进行库函数的自定义 step I&#xff1a; \textbf{step I&#xff1a;} step I&#xff1a; 对端口进行输出数据类型枚举 step II&#xff1a; \textbf{step II&#xff1a;} step II&#xff1a;对端口进行结构化描述 step…

线性代数的学习和整理23:用EXCEL和python 计算向量/矩阵的:内积/点积,外积/叉积

目录 1 乘法 1.1 标量乘法(中小学乘法) 1.1.1 乘法的定义 1.1.2 乘法符合的规律 1.2 向量乘法 1.2.1 向量&#xff1a;有方向和大小的对象 1.2.2 向量的标量乘法 1.2.3 常见的向量乘法及结果 1.2.4 向量的其他乘法及结果 1.2.5 向量的模长&#xff08;长度&#xff0…

第三篇【传奇开心果系列】Vant开发移动应用:财务管理应用

传奇开心果博文系列 系列博文目录Vant开发移动应用系列博文 博文目录一、项目目标二、编程思路三、初步实现示例代码四、扩展思路五、使用Firebase等后端服务来实现用户认证和数据存储示例代码六、用Vant组件库实现收入和支出分类管理的示例代码七、用Vant组件库实现收入和支出…

Redis经典五大类型源码及底层实现

Redis经典五大类型源码及底层实现分析 1、一些题目 redis的zset底层实现&#xff1f;redis的跳表和压缩列表说一下&#xff0c;解决了哪些问题&#xff0c;时间复杂度和空间复杂度如何&#xff1f;redis的zset使用的是什么数据结构&#xff1f; Redis数据类型的底层数据结构…

《WebKit 技术内幕》之五(1): HTML解释器和DOM 模型

第五章 HTML 解释器和 DOM 模型 1.DOM 模型 1.1 DOM标准 DOM &#xff08;Document Object Model&#xff09;的全称是文档对象模型&#xff0c;它可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构。这里的文档可以是 HTML 文档、XML 文档或者 XHTML 文档。D…

python基本数据类型 - 字典集合

引入 在内存中存储的数据可以是不同的数据类型。比如名字可以使用字符串存储&#xff0c;年龄可以使用数字存储&#xff0c;python有6种基本数据类型&#xff0c;用于各种数据的存储&#xff0c;分别是&#xff1a;numbers(数字类型)、string(字符串)、List(列表)、Tuple(元组…

【笔记】Blender4.0建模入门-3物体的基本操作

Blender入门 ——邵发 3.1 物体的移动 演示&#xff1a; 1、选中一个物体 2、选中移动工具 3、移动 - 沿坐标轴移动 - 在坐标平面内移动 - 自由移动&#xff08;不好控制&#xff09; 选中物体&#xff1a;右上的大纲窗口&#xff0c;点击物体名称&#xff0c;物体的轮…

文件操作(上)

目录 文件的必要性&#xff1a; 文件分类&#xff1a; 程序文件&#xff1a; 数据文件&#xff1a; 文件的打开与关闭&#xff1a; fopen函数分析: ​编辑 FILE*: char*filename: char*mode: fclose函数&#xff1a; 应用&#xff1a; 文件编译 Fgetc Fputc 应用…