建模杂谈系列244 TimeTraveller

说明

所有的基于时间处理和运行的程序将以同样的节奏同步和执行

TT(TimeTraveller)是一个新的设计,它最初会服务与量化过程的大量任务管理:分散开发、协同运行。但是很显然,TT的功能将远不止于此,它将服务大量的,基于时间游走特性的各种任务。

内容

1 概念

以量化场景作为假设,讨论所需要的功能,以及TT在其中所起的作用。

  • 1 数据获取。程序需要在每个时隙启动,从接口或者网页获取新的数据,然后落库。
  • 2 数据流转。这个不在这里讨论,假设数据流转的结构和渠道已经固定,会有一个程序来专门确保流转。
  • 3 数据特征。程序在每个时隙启动,回顾过去n个时隙(brick, block)的内容,生成当前时隙新的特征。
  • 4 数据决策。程序在每个时隙启动,回顾过去时隙的内容,生成当前时隙的决策。
  • 5 过程跟随。程序在每个时隙检查检查采取的行动,给出当前时隙的新建议。
  • 6 决策评估。在每个时隙评估情况,并作出参数改变。

以上的每一个过程都是 一个相对独立且复杂的过程,如果只是case by case的开发,最后会发现情况及其混乱,难以维护。

所以,是否可以有一种机制或工具,可以基本上统一以上所有的过程?

时隙 :假设,程序只会在每个时隙启动并处理一次,正常情况下,最新的决策、行动、数据、信息可能会落后最实时的时隙1~10个。这主要是由流程的深度决定的,同时也考虑了几乎无限逻辑复杂度情况下的可同步单位。这个单位目前来看是1分钟。

时间特性

  • 1 顺序性。时间会按照严格统一的顺序向前推进,不可能跨时隙跳跃。这意味着,要处理的数据顺序和步骤是完全确定的。同时,站在某个时隙时不可能观察到未来时隙 ,技术上说,某个程序在t时隙启动,只能看到<t的时隙数据。
  • 2 单向性。只可能从小到大的执行。

【Method】GoBack: 某个过程在执行过程中出错,在T时刻时发现,并且知道在T’时刻(T’<T)是正常的,那么我们回到T’状态并重新执行的过程叫GoBack。一个GoBack过程可以是幂等,也可以是分叉,这个由过程本身决定。当引入了生成机制,那么GoBack过程不是幂等的,结果可能产生变化。

【Method】Run : 执行过程,每次TT实例总是从当前时隙,执行到最新时隙。
【Attr】LastRunSlot : 上一次执行运行的时间。

【Attr】LastDataSlot : 上一次处理到的数据时隙(含)
【Attr】LatestDataSlot : 最新的数据时隙,这是查询当前数据源得到的。

【Attr】t : 当前执行时的时隙

2 前提条件

TT执行时只考虑一个固定机制,这极大的简化了大量工作的同步和协同。但这是建立在一系列机制之上的。

  • 1 DataFlow: 这是由Flask-APScheduler-Celery + MongoEngine为基础组成的异步任务调度任务系统系统,主要是完成IO密集操作的并行操作,通过协程可以在不额外增加CPU开销的情况下大幅提升处理能力。这部分对应着以前的sniffers,逻辑上,sniffer主要就是嗅探各种数据变化,然后进行数据传递。 消息队列(Redis Stream、RabbitMQ)、主库(Mongo)、分析库(ClickHouse)构成了数据流的数据库核心。
  • 2 GFGoLite:这个本身是一个全局的、无状态的函数服务。与TT相关的是UCS规范相关的实现,当TT需要追溯时间数据时,可能需要通过UCS对象(背后是GFGoLite)操作。
  • 3 GlobalBuffer: 首先通过较为严格的tiers命名方法,确保数据始终可以使用kv的方式存取。一方面是程序(对象)本身的状态信息需要暂存(以便加载时可以恢复执行),另一方面是程序依赖的时间数据,需要载入(预载入)以便快速处理。

3 设计

先考虑几个常见的应用场景。

3.1 回测

对于标的A,开发了策略S,我们需要对S进行回测,以确保其效果,特别是对于OOB的表现。

回测会指定一套规则集,然后执行一个时间区间,从头开始执行到尾然后停止。

  • 1 顺序加载数据(Read)。指定了开始和结尾之后,通过UCS可以获取brick_list,从而精确获取需要执行的每一个brick。brick数据是结构化的,存在于clickhouse中,加载速度会非常快。(RedisOrClickHouse)
  • 2 执行规则。回测过程读取的全部是结构化数据,不包含向量。向量是中间数据(这可能会导致一些delay,所以数据处理和特征生成一般在slot的前半部分执行,而决策在后半部分执行,这样如果调度得当的话,还是有可能只落后一个时隙的)。
  • 3 回写数据。单次执行完毕后,会有对应的行动数据需要写入数据库。数据可以分为两部分,一部分是明细数据,需要存入数据库,作为进一步分析,这部分数据推入RedisStream(元数据也顺带推入,作为checkpoint)。;另一部分是运行时元数据,这部分只要缓存在Redis里即可。任何时刻,只要从checkpoint恢复,都可以退回到那个时刻重新开始。

回测时,数据以拉为主,数据在缓存中存在1小时,或者一天,然后自动删除

3.2 运行时

与回测不同,运行时会存在很多空转情况,甚至出现依赖错误。

运行时,一般会处在等待最新数据流入,然后处理的情况。有几个问题是需要考虑的:

  • 1 网络连接:【偶发失败、挂起、超时】这不是可选项,而是必选项。网络连接表现为偶发中断,连接完全挂起,超时等。
  • 2 数据源更新:【推和拉】部分数据源未更新,全部数据源未更新。数据更多是采取服务端主动推送到缓存中,而不是程序直接去数据库取。
  • 3 处理逻辑:分为导入依赖、数据预处理、数据处理和数据后处理几部分。

服务主动将数据推到缓存中,确保服务中存在的缓存数据是最新的。

这里要做的完善的话应该结合类似prometheus之类的工具去做。但是这个目前我没搞,所以会考虑一种折中的方式去实现这个。比较明确的是,在运行上可以用状态机的方法来控制。

  • 正常 Normal :程序启动后,按照既定计划完成了数据更新,逻辑计算和结果保存。

    • Success
    • 滞后 Lag :虽然程序完成了执行,但是上一个时间点和当前运行时间点的差值大于阈值,认为数据出现了滞后。
    • 缓慢 Slow : 程序出现了缓慢执行的情况
  • 错误 Error: 程序遇到了无法执行的问题

    • 读入错误 Read
      • 连接错误 Connection
      • 超时 OutOfTime
    • 处理错误 Processing
      • 依赖 Dependency
      • 主逻辑 Logic
    • 写入错误 Write
      • 连接错误 Connection
      • 超时 OutOfTime

3.3 设计

  • 1 TT的初始化分为全新初始化和断点续传(checkpoint)两种
  • 2 TT的运行分为固定周期执行(fixed-run)和嗅探执行(sniff-run)两种模式。前者一次性检查数据完整性,然后执行;后者使用状态机管理一般运行时状态。
  • 3 TT采用Tiers方法进行精确编号,每一个TT实例将会一直使用这个编号。
  • 4 TT需要GLobalBuffer作为默认的元数据保存方法。
  • 5 TT需要QManager作为默认的数据保存方法。保存数据日志到stream,然后由一个任务来解析这些日志 ,可以考虑存到clickhouse(之前一般觉得mongo比较合适)
  • 6 TT需要UCS作为brick的推算方法。这意味着GFGoLite重启会有影响,所以TT需要考虑UCS挂掉一会的情况。
  • 7 TT将会使用前端管理,名称的统一命名将会在元数据表中记录。这意味着TT将使用MongoEnige和Mongo集群(mymeta)

一个简单的hypo如下

from typing import List, Optional,Dict
from pydantic import BaseModel# 测试
from Basefuncs import QManager,UCS,GlobalBuffer# Naming ... 先确保命名通过 - 通过MongoEngine进行操作,正确的结果将写入GlobalBuffer# 假设每个实例是从一个名称开始的,所以会先从GlobalBuffer中读取配置来初始化# 这个类的目的是构造通用的处理对象
import requests as req 
class TimeTraveller(BaseModel):__version__ = 1.0meta : Dict = {}tiers_name: str = 'tier1.tier2.tier3.option_tier1.option_tier2'qmanager_redis_agent_host: str = 'http://172.17.0.1:24021/'qmanager_batch_size: int = 1000qmanager_q_max_len: int = 100000ucs_gfgo_lite_server: str = 'http://172.17.0.1:24090/'# global buffer同样需要先设置名称 | 空间名称要和这个叠加起来globalbuffer_server: str = 'http://172.17.0.1:24088/'globalbuffer_space_name: str = 'tem_test.test'# 这里可以增加校验 | 例如给到空间的一些解释 # __space_description# 执行初始化校验def __init__(self, **para):super().__init__(**para)print('当前版本:', self.__version__)# 在初始化时对QManager、UCS和GlobalBuffer进行校验def _check_init_parts(self):pass# 读取数据部分: 用户自定义部分,有时候可以为空def read_part(self):pass# 处理数据部分:用户自定义,通常不会为空def process_part(self):pass# 输出数据部分:用户自定义,通常不会为空def write_part(self):pass

4 实现

  • 1 在开始之前,先要建立tt的专属消息管道,例如stream_tt_outcome_in和 stream_tt_outcome_out。
  • 2 创建一个实例,先按规则构造一个名称;并随之创造对应的redis_var空间。
  • 3 假设策略就是SMA,构造对应的函数
  • 4 先进行历史区间的静态回测
  • 5 再进行最新的运行时测试

在这里插入图片描述

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

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

相关文章

【spring】第二篇 bean实例化

对象已经能交给Spring的IOC容器来创建了&#xff0c;但是容器是如何来创建对象的呢? 就需要研究下bean的实例化过程&#xff0c;在这块内容中主要解决两部分内容&#xff0c;分别是 bean是如何创建的 实例化bean的三种方式&#xff0c;构造方法,静态工厂和实例工厂 在讲解这…

WPF -> MVVM

1.1安装MVV MLight 打开 Visual Studio 2022。 在顶部菜单栏中选择“工具” -> “NuGet 包管理器” -> “程序包管理器控制台”。 在控制台中输入以下命令&#xff0c;并按回车键运行&#xff1a; Install-Package MvvmLightLibsStd104.等待安装完成后&#xff0c;你就…

十_信号13 - abort()

abort() 1 首先进程不能忽略 SIGABRT信号 2 要么在 SIGABRT信号的处理函数中 清理缓冲区并自己退出进程。如果信号处理函数中没有执行退出进程操作&#xff0c;返回到 abort()函数中&#xff0c;要求在 abort()函数中结束进程&#xff0c;不能返回到其调用者

数据库(17)——DCL数据控制语言

DCL DCL是Data Control Language数据控制语言&#xff0c;用来管理数据库用户、控制数据库的访问权限。 DCL-管理用户 语法 1.查询用户 USE mysql; SELECT * FROM user; 也可以直接在datagrip找到user表 我们要操作用户要通过User和Host同时定位。Host表示当前用户只能在哪个…

音视频开发9 FFmpeg 解复用相关整体说明,重要API说明

一&#xff0c;播放器框架 二 常用音视频术语 容器&#xff0f;文件&#xff08;Conainer/File&#xff09;&#xff1a; 即特定格式的多媒体文件&#xff0c; 比如mp4、flv、mkv等。 媒体流&#xff08;Stream&#xff09;&#xff1a; 表示时间轴上的一段连续数据&#xff0…

SIMBA:单细胞嵌入与特征

目前大多数单细胞分析管道仅限于细胞嵌入&#xff0c;并且严重依赖于聚类&#xff0c;而缺乏显式建模不同特征类型之间相互作用的能力。此外&#xff0c;这些方法适合于特定的任务&#xff0c;因为不同的单细胞问题的表述方式不同。为了解决这些缺点&#xff0c;SIMBA作为一种图…

【Python网络爬虫】详解python爬虫中URL资源抓取

&#x1f517; 运行环境&#xff1a;PYTHON &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

bootstrap5-学习笔记2-模态框+弹窗+tooltip+popover+信息提示框

参考&#xff1a; Bootstrap5 教程 | 菜鸟教程 https://www.runoob.com/bootstrap5/bootstrap5-tutorial.html Bootstrap 入门 Bootstrap v5 中文文档 v5.3 | Bootstrap 中文网 https://v5.bootcss.com/docs/getting-started/introduction/ 之前用bootstrap2和3比较多&#x…

上位机图像处理和嵌入式模块部署(f407 mcu中的单独烧录方法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;stm32有三种烧录方法&#xff0c;一种是st-link v2&#xff0c;一种是dap&#xff0c;一种是j-link。不过我们在实际操作…

架构设计之可部署和可管理属性深度剖析:从理论到实践的完美融合

文章目录 引言一、可部署属性的深度剖析1.1 理论基础1.2 实践应用1.3 关键要素1.4 评估方法 二、可管理属性的深度剖析2.1 理论基础2.2 实践应用2.3 关键要素2.4 评估方法 三、从理论到实践的完美融合3.1. 架构设计阶段的融合3.2. 开发过程中的融合3.3. 部署和管理的融合3.4. 监…

54. 螺旋矩阵【rust题解】

题目 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 示例 1 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 示例 2 输入&#xff1a;matrix [[1,2,3,4],[5,6,…

Leecode---栈---每日温度 / 最小栈及栈和队列的相互实现

栈&#xff1a;先入后出&#xff1b;队列&#xff1a;先入先出 一、每日温度 Leecode—739题目&#xff1a; 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温…

day20

第一题 23. 合并 K 个升序链表 本题是已经知道有多个链表&#xff0c;需要我们将这些链表按照升序排列的规则组合到一起&#xff0c;同时这些链表都是升序排列的&#xff1b; 解法一&#xff1a; 利用优先级队列 步骤一&#xff1a;利用优先级队列床架一个小根堆&#xff1b; …

【OpenHarmony】TypeScript 语法 ④ ( 函数 | TypeScript 具名函数和匿名函数 | 可选参数 | 剩余参数 | 箭头参数 )

文章目录 一、TypeScript 函数1、TypeScript 具名函数和匿名函数2、TypeScript 函数 与 JavaScript 函数对比3、TypeScript 函数 可选参数4、TypeScript 函数 剩余参数5、TypeScript 箭头函数 参考文档 : <HarmonyOS第一课>ArkTS开发语言介绍 一、TypeScript 函数 1、Typ…

Llama(二):Open WebUI作为前端界面,使用本机的llama3

目录 背景 Open WebUI是什么 工程能力特性 产品功能特性 用户体验特性 Open WebUI安装并使用 背景 Mac M1芯片&#xff0c;16G 内存 llama3 8B的部署参考Llama&#xff08;一&#xff09;&#xff1a;Mac M1芯片运行Llama3-CSDN博客在Mac M1 16G内存环境中&#xff0c;…

牛客热题:缺失的第一个正整数

牛客热题&#xff1a;数组中出现一次的两个数字> &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 …

6月2号总结

刷题记录Codeforces Round 925 &#xff08;A,B,C&#xff09; 1.A. Recovering a Small String 问题 - A - Codeforces 输入&#xff1a; 5 24 70 3 55 48 输出&#xff1a; aav rzz aaa czz auz 给定一个3~78的整数&#xff0c;将这个整数分成a,b,c&#xff0c;其中1表示…

数据结构之二叉搜索树(TreeSetTreeMap)

目录 一.搜索树 1.1概念 1.2适用场景 2.二叉搜索树的基本操作 2.1二叉搜索树的定义 2.2查找 2.1.1基本思路 2.3插入 2.3.1基本思路 2.4删除 2.4.1基本思路 2.5遍历 2.6性能分析 二.TreeSet Map和Set 1.概念 2.模型 1.定义 2.基本操作 三.TreeMap 1.定义 2.基…

LLM大语言模型学习资料网站(git、gitee、等)

先上几个关于大模型方面比较好的开源地址吧&#xff1a; 1.清华智普ChatGLM&#xff1a; GitHub - THUDM/ChatGLM3: ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型 ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型&#xff0c;详细…

【计算机毕设】基于SpringBoot的医院管理系统设计与实现 - 源码免费(私信领取)

免费领取源码 &#xff5c; 项目完整可运行 &#xff5c; v&#xff1a;chengn7890 诚招源码校园代理&#xff01; 1. 研究目的 本项目旨在设计并实现一个基于SpringBoot的医院管理系统&#xff0c;以提高医院管理效率&#xff0c;优化医疗服务流程&#xff0c;提升患者就诊体验…