建模杂谈系列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
- 读入错误 Read
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 再进行最新的运行时测试
相关文章:

建模杂谈系列244 TimeTraveller
说明 所有的基于时间处理和运行的程序将以同样的节奏同步和执行 TT(TimeTraveller)是一个新的设计,它最初会服务与量化过程的大量任务管理:分散开发、协同运行。但是很显然,TT的功能将远不止于此,它将服务大量的,基于时…...

基于MingGW64 GCC编译Windows平台上的 libuvc
安装cmake 打开cmake官网 https://cmake.org/download/,下载安装包: 安装时选择将cmake加到系统环境变量里。安装完成后在新的CMD命令窗口执行cmake --version可看到输出: D:\>cmake --version cmake version 3.29.3 CMake suite mainta…...

【Linux】网络高级IO
欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:Linux 目录 👉🏻五种IO模型👉🏻消息通信的同步异步与进程线程的同步异步有什么不同?👉…...

【C++ ——— 继承】
文章目录 继承的概念即定义继承概念继承定义定义格式继承关系和访问限定符继承基类成员访问方式的变化 基类对象和派生类对象的赋值转换继承中的作用域派生类中的默认成员函数继承与友元继承与静态成员菱形继承虚继承解决数据冗余和二义性的原理继承的总结继承常见笔试面试题 继…...

kafka-守护启动
文章目录 1、kafka守护启动1.1、先启动zookeeper1.1.1、查看 zookeeper-server-start.sh 的地址1.1.2、查看 zookeeper.properties 的地址 1.2、查看 jps -l1.3、再启动kafka1.3.1、查看 kafka-server-start.sh 地址1.3.2、查看 server.properties 地址 1.4、再次查看 jps -l 1…...
TypeScript 中的命名空间和模块化
1. 命名空间(Namespace) 命名空间提供了一种逻辑上的代码分组机制,用于避免命名冲突和将相关代码组织在一起。它使用 namespace 关键字来定义命名空间,并通过点运算符来访问其中的成员。例如: // 定义命名空间 names…...
9 html综合案例-注册界面
9 综合案例-注册界面 一个只有html骨架的注册页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…...

Xilinx RFSOC 47DR 8收8发 信号处理板卡
系统资源如图所示: FPGA采用XCZU47DR 1156芯片,PS端搭载一组64Bit DDR4,容量为4GB,最高支持速率:2400MT/s; PS端挂载两片QSPI X4 FLASH; PS支持一路NVME存储; PS端挂载SD接口,用于存储程序&…...
ros2 launch 用法以及一些基础功能函数的示例
文章目录 launch启动一个节点的launch示例launch文件中添加节点的namespacelaunch文件中的话题名称映射launch文件中向节点内传入命令行参数launch文件中向节点内传入rosparam使用方法多节点启动命令行参数配置资源重映射ROS参数设置加载参数文件在launch文件中使用条件变量act…...
如何使用Python获取图片中的文字信息
如下有三中方法: 方法1. 使用Tesseract OCR(pytesseract) 安装依赖 首先,确保你已经安装了Tesseract OCR引擎(例如,通过你的操作系统的包管理器)。然后,你可以通过pip安装pytesse…...
C++知识点
1. 构造函数:当没有写任何构造函数(含拷贝构造),系统会生成默认的无参构造,并且访问属性是共有。 默认拷贝构造:当没有写任何的拷贝构造,系统会生成默认的拷贝构造->是一个浅拷贝 写了拷贝构造函数,这…...
反转字符串中的单词-力扣
此题将问题分为三步进行解决: 第一步,删除字符串中多余的空格,removeSpaces函数中删除所有的空格,并手动在每个单词后添加一个空格,最后重构字符串s第二步,将整个字符串反转第三步,对反转后的字…...
Kotlin 重写与重载
文章目录 重写(Override)重载(Overload) 重写(Override) 重写通常是指子类覆盖父类的属性或方法,通常会标记为override: open class Base {open val name "Base"open f…...

关于高版本 Plant Simulation 每次保存是 提示提交comm对话框的处理方法
关于高版本 Plant Simulation 每次保存是 提示提交comm对话框的处理方法 如下图 将model saving history 修改为None即可 关于AutoCAD 2022 丢失模板库的问题 从新从以下地址打开即可: D:\Program Files\Autodesk\AutoCAD 2022\UserDataCache\zh-cn\Template...

C语言之旅:探索单链表
目录 一、前言 二、实现链表的功能: 打印 创建节点 尾插 尾删 头插 头删 查找 在指定位置之前插入数据 指定位置删除 在指定位置之后插入数据 打印 销毁 三、全部源码: 四、结语 一、前言 链表是一个强大且基础的数据结构。对于很多初…...
【安卓基础】-- 消息机制 Handler
目录 消息机制 Handler面试问题 消息机制 Handler 对handler机制的基本作用、用法、时序流程进行介绍,针对handler机制中的内存泄漏问题讲解:一篇读懂Android Handler机制 Android-Handler机制详解 全面解析 | Android之Handler机制 需要掌握的&#x…...
Optional 类
概述 到目前为止,臭名昭著的空指针异常是导致 Java 应用程序失败的最常见原因。以前,为了解决空指针异常,Google 公司著名的 Guava 项目引入了 Optional 类, Guava 通过使用检查空值的方式来防止代码污染,它鼓励程序员…...

自动微分技术在 AI for science 中的应用
本文简记我在学习自动微分相关技术时遇到的知识点。 反向传播和自动微分 以 NN 为代表的深度学习技术展现出了强大的参数拟合能力,人们通过堆叠固定的 layer 就能轻松设计出满足要求的参数拟合器。 例如,大部分图神经网络均基于消息传递的架构。在推理…...
ASM OMF single-file creation form 重命名
OMF下不能自动命名,需要重新命名的话:1 1. spfile 可以 create pfile from spfile 后再create spfile from pfile 2 redo? 3 datafile? Here are some details of the copy problem: a) You are not allowed to set the numbe…...

VGGNet
VGGNet CNN卷积网络的发展史 1. LetNet5(1998) 2. AlexNet(2012) 3. ZFNet(2013) 4. VGGNet(2014) 5. GoogLeNet(2014) 6. ResNet(2015) 7. DenseNet(2017) 8. EfficientNet(2019) 9. Vision Transformers(2020) 10. 自适应卷积网络(2021) 上面列出了发展到现在CNN的一些经典…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...

C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
node.js的初步学习
那什么是node.js呢? 和JavaScript又是什么关系呢? node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说, 需要在node.js的环境上进行当JavaScript作为前端开发语言来说,需要在浏览器的环境上进行 Node.js 可…...

Java设计模式:责任链模式
一、什么是责任链模式? 责任链模式(Chain of Responsibility Pattern) 是一种 行为型设计模式,它通过将请求沿着一条处理链传递,直到某个对象处理它为止。这种模式的核心思想是 解耦请求的发送者和接收者,…...
el-amap-bezier-curve运用及线弧度设置
文章目录 简介示例线弧度属性主要弧度相关属性其他相关样式属性完整示例链接简介 el-amap-bezier-curve 是 Vue-Amap 组件库中的一个组件,用于在 高德地图 上绘制贝塞尔曲线。 基本用法属性path定义曲线的路径,可以是多个弧线段的组合。stroke-weight线条的宽度。stroke…...