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

news2024/12/23 1:10:26

说明

在这里对第一次迭代(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.coloradmin.cn/o/1403356.html

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

相关文章

设备对象(DEVICE_OBJECT)

设备对象(DEVICE_OBJECT) 每个驱动程序会创建一个或多个设备对象,用DEVICE_OBJECT数据结构表示。每个设备对象都会有一个指针指向下一个设备对象,因此就形成一个设备链。设备对象链的第一个设备是由DRIVER_OBJECT结构体中指明的。设备对象保存设…

C++ 之LeetCode刷题记录(十五)

😄😊😆😃😄😊😆😃 开始cpp刷题之旅。 依旧是追求耗时0s的一天。 94. 二叉树的中序遍历 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: …

C#,入门教程(28)——文件夹(目录)、文件读(Read)与写(Write)的基础知识

上一篇: C#,入门教程(27)——应用程序(Application)的基础知识https://blog.csdn.net/beijinghorn/article/details/125094837 C#知识比你的预期简单的多,但也远远超乎你的想象! 与文件相关的知识&#xf…

跟着我学Python进阶篇:03. 面向对象(下)

往期文章 跟着我学Python基础篇:01.初露端倪 跟着我学Python基础篇:02.数字与字符串编程 跟着我学Python基础篇:03.选择结构 跟着我学Python基础篇:04.循环 跟着我学Python基础篇:05.函数 跟着我学Python基础篇&#…

# Jenkins:一键部署与备份的终极解决方案

Jenkins:一键部署与备份的终极解决方案 引言 在持续集成和持续部署(CI/CD)的世界中,Jenkins 作为一个开源自动化服务器,扮演着至关重要的角色。但是,部署和维护 Jenkins 服务往往需要一定的技术知识和时间…

卷积和滤波对图像操作的区别

目录 问题引入 解释 卷积 滤波 问题引入 卷积和滤波是很相似的,都是利用了卷积核进行操作 那么他们之间有什么区别呢? 卷积:会影响原图大小 滤波:不会影响原图大小 解释 卷积 我们用这样一段代码来看 import torch.nn as …

【C++】入门(一)

前言&#xff1a; 本篇博客将带大家认识C&#xff0c;熟悉基本语法 文章目录 认识CC的诞生与发展C 在行业中的运用 一、命名空间1.1 命名空间的定义1.2 命名空间的使用1.3 命名空间的访问 二、C输入&输出输出操作符 <<输入操作符 >>换行符和刷新输出缓冲区关键…

C++入门学习(十二)字符串类型

上一节&#xff08;C入门学习&#xff08;十一&#xff09;字符型-CSDN博客&#xff09;中我们学到如何表示和使用一个字符串&#xff0c;本篇文章是字符串&#xff08;多个字符&#xff09;。 定义字符串主要有两种方式&#xff1a; 第一种&#xff1a; char str[] "…

openGauss学习笔记-203 openGauss 数据库运维-常见故障定位案例-修改索引时只调用索引名提示索引不存在

文章目录 openGauss学习笔记-203 openGauss 数据库运维-常见故障定位案例-修改索引时只调用索引名提示索引不存在203.1 修改索引时只调用索引名提示索引不存在203.1.1 问题现象203.1.2 原因分析203.1.3 处理办法 openGauss学习笔记-203 openGauss 数据库运维-常见故障定位案例-…

28、web攻防——通用漏洞SQL注入HTTP头XFFCOOKIEPOST请求

文章目录 $_GET&#xff1a;接收get请求&#xff0c;传输少量数据&#xff0c;URL是有长度限制的&#xff1b; $_POST&#xff1a;接收post请求&#xff1b; $_COOKIE&#xff1a;接收cookie&#xff0c;用于身份验证&#xff1b; $_REQUEST&#xff1a;收集通过 GET 、POST和C…

Web开发3:数据库使用

欢迎来到Web开发系列的第三篇&#xff01;今天我们将探讨如何在Web开发中使用数据库。数据库是存储和管理数据的重要工具&#xff0c;它在现代应用程序中起着至关重要的作用。无论是社交媒体应用、电子商务平台还是博客网站&#xff0c;数据库都是不可或缺的一部分。 什么是数…

基于DUP的网络聊天室

基于UDP的网络聊天室的使用&#xff08;select&#xff09;完成的服务器端 #include<head.h> typedef struct de {char name[10];struct sockaddr_in cin;struct de* next; }*linklist; //创建节点 linklist a_creat() {linklist p(linklist)malloc(sizeof(struct de));…

C++:基于C的语法优化

C&#xff1a;基于C的语法优化 命名空间命名空间域域作用限定符展开命名空间域 输入输出缺省参数全缺省参数半缺省参数 函数重载参数类型不同参数个数不同参数类型的顺序不同 引用基本语法按引用传递返回引用引用与指针的区别 内联函数autoauto与指针和引用结合 范围for循环nul…

统计灰度图像的灰度值分布并绘制

1、numpy方法 函数&#xff1a; numpy.histogram(a, bins10, rangeNone, normedNone, weightsNone, densityNone) 参数说明&#xff1a; a:输入数据数组&#xff1b;bins:指定统计的区间个数&#xff0c;可以是一个整数&#xff0c;也可以是一个数组&#xff0c;默认值为10…

续签KES证书

MiniO KES&#xff08;密钥加密服务&#xff09;是 MinIO 开发的一项服务&#xff0c;旨在弥合在 Kubernetes 中运行的应用程序与集中式密钥管理服务 &#xff08;KMS&#xff09; 之间的差距。中央 KMS 服务器包含所有状态信息&#xff0c;而 KES 在需要执行与获取新密钥或更新…

最小生成树(Java实现)

一、Prim算法 Prim算法基本思想为&#xff1a;从联通网络 N{V,E}中某一顶点 v0 出发&#xff0c;此后就从一个顶点在 S 集中&#xff0c; 另一个顶点不在 S 集中的所有顶点中选择出权值最小的边&#xff0c;把对应顶点加入到 S 集 中&#xff0c; 直到所有的顶点都加入到 S 集中…

RK3568平台 TinyAlsa集成第三方音频算法

一.tinyalsa介绍 ALSA&#xff08;Advanced Linux Sound Architecture&#xff09;是一个开源项目&#xff0c;涵盖了用户空间和内核空间对音频设备的操作接口&#xff0c;通过应用层使用alsalib可以实现对音频设备的控制 TinyAlsa是android推出的一个精简的ALSA库&#xff0c…

【Web实操08】实现一个导航效果,要求横向摆放,并且清除浮动

要实现图片的效果&#xff1a; 要利用浮动的知识点完成首页&#xff0c;电视&#xff0c;平板&#xff0c;家电&#xff0c;服务在一行导航栏剧中居中显示的功能&#xff0c;背景设置为灰黑色&#xff0c;导航栏下面是内容。 代码如下&#xff1a; <!DOCTYPE html> &l…

flink学习之窗口处理函数

窗口处理函数 什么是窗口处理函数 Flink 本身提供了多层 API&#xff0c;DataStream API 只是中间的一环&#xff0c;在更底层&#xff0c;我们可以不定义任何具体的算子&#xff08;比如 map()&#xff0c;filter()&#xff0c;或者 window()&#xff09;&#xff0c;而只是…

springboot集成COS对象存储

1.申请腾讯云存储桶 新建密钥&#xff08;后面配置要用到&#xff09; 2.编写工具类 此处使用工具类进行基本属性配置&#xff0c;也可选择在yml中配置 package com.sfy.util;import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.a…