当前位置: 首页 > 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的一些经典…...

SpringMVC:转发和重定向

1. 请求转发和重定向简介 参考该链接第9点 2. forward 返回下一个资源路径&#xff0c;请求转发固定格式&#xff1a;return "forward:资源路径"如 return "forward:/b" 此时为一次请求返回逻辑视图名称 返回逻辑视图不指定方式时都会默认使用请求转发in…...

961操作系统知识总结

部分图片可能无法显示&#xff0c;参考这里&#xff1a;https://zhuanlan.zhihu.com/p/701247894 961操作系统知识总结 一 操作系统概述 1. 操作系统的基本概念 重要操作系统类型&#xff1a;批处理操作系统(批量处理作业&#xff0c;单道批处理/多道批处理系统&#xff0c;用…...

电脑死机问题排查

情况描述&#xff1a;2024年6月2日下午16&#xff1a;04分电脑突然花屏死机&#xff0c;此情况之前遇到过三次&#xff0c;认为是腾讯会议录屏和系统自带录屏软件冲突导致。 报错信息&#xff1a;应用程序-特定 权限设置并未向在应用程序容器 不可用 SID (不可用)中运行的地址…...

百度地图1

地图的基本操作 百度地图3.0文档 百度地图3.0实例中心 设置地图 centerAndZoom(center: Point, zoom: Number)设初始化地图,center类型为Point时&#xff0c;zoom必须赋值&#xff0c;范围3-19级&#xff0c; // 百度地图API功能var map new BMap.Map("map"); //…...

Ubuntu 24.04 LTS 安装Docker

1 更新软件包索引&#xff1a; sudo apt-get update 2 安装必要的软件包&#xff0c;以允许apt通过HTTPS使用仓库&#xff1a; sudo apt-get install apt-transport-https ca-certificates curl software-properties-common 3 添加Docker的官方GPG密钥&#xff1a; curl -fs…...

【架构设计】Java如何利用AOP实现幂等操作,防止客户端重复操作

1实现方案详解 在Java中,使用AOP(面向切面编程)来实现幂等操作是一个常见的做法,特别是当你想在不修改业务代码的情况下添加一些横切关注点(如日志、事务管理、安全性等)时。幂等操作指的是无论执行多少次,结果都是相同的操作。 为了利用AOP实现幂等操作以防止客户端重…...

笔记:美团的测试

0.先启动appium 1.编写代码 如下&#xff1a; from appium import webdriver from appium.webdriver.extensions.android.nativekey import AndroidKeydesired_caps {platformName: Android,platformVersion: 10,deviceName: :VOG_AL10,appPackage: com.sankuai.meituan,ap…...

【30天精通Prometheus:一站式监控实战指南】第15天:ipmi_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…...

STM32F103借助ESP8266连接网络

ESP8266配置 STM32F103本身是不具备联网功能的&#xff0c;所以我们必须借助其他单片机来进行联网&#xff0c;然后让STM32与联网单片机通信&#xff0c;就可以实现STM32联网了。 本文借助的是ESP8266模块&#xff0c;其通过UART协议与STM32通信&#xff08;http://t.csdnimg.c…...

Feature Manipulation for DDPM based Change Detection

基于去噪扩散模型的特征操作变化检测 文章提出了一种基于去噪扩散概率模型&#xff08;DDPM&#xff09;的特征操作变化检测方法。变化检测是计算机视觉中的经典任务&#xff0c;涉及分析不同时间捕获的图像对&#xff0c;以识别场景中的重要变化。现有基于扩散模型的方法主要…...