当前位置: 首页 > news >正文

建模杂谈系列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 再进行最新的运行时测试

在这里插入图片描述

相关文章:

建模杂谈系列244 TimeTraveller

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

基于MingGW64 GCC编译Windows平台上的 libuvc

安装cmake 打开cmake官网 https://cmake.org/download/&#xff0c;下载安装包&#xff1a; 安装时选择将cmake加到系统环境变量里。安装完成后在新的CMD命令窗口执行cmake --version可看到输出&#xff1a; D:\>cmake --version cmake version 3.29.3 CMake suite mainta…...

【Linux】网络高级IO

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;Linux 目录 &#x1f449;&#x1f3fb;五种IO模型&#x1f449;&#x1f3fb;消息通信的同步异步与进程线程的同步异步有什么不同&#xff1f;&#x1f449…...

【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. 命名空间&#xff08;Namespace&#xff09; 命名空间提供了一种逻辑上的代码分组机制&#xff0c;用于避免命名冲突和将相关代码组织在一起。它使用 namespace 关键字来定义命名空间&#xff0c;并通过点运算符来访问其中的成员。例如&#xff1a; // 定义命名空间 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发 信号处理板卡

系统资源如图所示&#xff1a;  FPGA采用XCZU47DR 1156芯片&#xff0c;PS端搭载一组64Bit DDR4,容量为4GB,最高支持速率&#xff1a;2400MT/s;  PS端挂载两片QSPI X4 FLASH&#xff1b;  PS支持一路NVME存储&#xff1b;  PS端挂载SD接口&#xff0c;用于存储程序&…...

ros2 launch 用法以及一些基础功能函数的示例

文章目录 launch启动一个节点的launch示例launch文件中添加节点的namespacelaunch文件中的话题名称映射launch文件中向节点内传入命令行参数launch文件中向节点内传入rosparam使用方法多节点启动命令行参数配置资源重映射ROS参数设置加载参数文件在launch文件中使用条件变量act…...

如何使用Python获取图片中的文字信息

如下有三中方法&#xff1a; 方法1. 使用Tesseract OCR&#xff08;pytesseract&#xff09; 安装依赖 首先&#xff0c;确保你已经安装了Tesseract OCR引擎&#xff08;例如&#xff0c;通过你的操作系统的包管理器&#xff09;。然后&#xff0c;你可以通过pip安装pytesse…...

C++知识点

1. 构造函数&#xff1a;当没有写任何构造函数(含拷贝构造)&#xff0c;系统会生成默认的无参构造&#xff0c;并且访问属性是共有。 默认拷贝构造&#xff1a;当没有写任何的拷贝构造&#xff0c;系统会生成默认的拷贝构造->是一个浅拷贝 写了拷贝构造函数&#xff0c;这…...

反转字符串中的单词-力扣

此题将问题分为三步进行解决&#xff1a; 第一步&#xff0c;删除字符串中多余的空格&#xff0c;removeSpaces函数中删除所有的空格&#xff0c;并手动在每个单词后添加一个空格&#xff0c;最后重构字符串s第二步&#xff0c;将整个字符串反转第三步&#xff0c;对反转后的字…...

Kotlin 重写与重载

文章目录 重写&#xff08;Override&#xff09;重载&#xff08;Overload&#xff09; 重写&#xff08;Override&#xff09; 重写通常是指子类覆盖父类的属性或方法&#xff0c;通常会标记为override&#xff1a; open class Base {open val name "Base"open f…...

关于高版本 Plant Simulation 每次保存是 提示提交comm对话框的处理方法

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

C语言之旅:探索单链表

目录 一、前言 二、实现链表的功能&#xff1a; 打印 创建节点 尾插 尾删 头插 头删 查找 在指定位置之前插入数据 指定位置删除 在指定位置之后插入数据 打印 销毁 三、全部源码&#xff1a; 四、结语 一、前言 链表是一个强大且基础的数据结构。对于很多初…...

【安卓基础】-- 消息机制 Handler

目录 消息机制 Handler面试问题 消息机制 Handler 对handler机制的基本作用、用法、时序流程进行介绍&#xff0c;针对handler机制中的内存泄漏问题讲解&#xff1a;一篇读懂Android Handler机制 Android-Handler机制详解 全面解析 | Android之Handler机制 需要掌握的&#x…...

Optional 类

概述 到目前为止&#xff0c;臭名昭著的空指针异常是导致 Java 应用程序失败的最常见原因。以前&#xff0c;为了解决空指针异常&#xff0c;Google 公司著名的 Guava 项目引入了 Optional 类&#xff0c; Guava 通过使用检查空值的方式来防止代码污染&#xff0c;它鼓励程序员…...

自动微分技术在 AI for science 中的应用

本文简记我在学习自动微分相关技术时遇到的知识点。 反向传播和自动微分 以 NN 为代表的深度学习技术展现出了强大的参数拟合能力&#xff0c;人们通过堆叠固定的 layer 就能轻松设计出满足要求的参数拟合器。 例如&#xff0c;大部分图神经网络均基于消息传递的架构。在推理…...

ASM OMF single-file creation form 重命名

OMF下不能自动命名&#xff0c;需要重新命名的话&#xff1a;1 1. spfile 可以 create pfile from spfile 后再create spfile from pfile 2 redo&#xff1f; 3 datafile&#xff1f; 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的一些经典…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

网页端 js 读取发票里的二维码信息(图片和PDF格式)

起因 为了实现在报销流程中&#xff0c;发票不能重用的限制&#xff0c;发票上传后&#xff0c;希望能读出发票号&#xff0c;并记录发票号已用&#xff0c;下次不再可用于报销。 基于上面的需求&#xff0c;研究了OCR 的方式和读PDF的方式&#xff0c;实际是可行的&#xff…...