高频数据处理技巧:如何将高频信号转化成离散的买卖信号

本页讨论在高频交易流程中,将 tick 级信号量转化为离散买卖方向信号(如 1/0/-1)的需求与实现思路。

Source: https://dolphindb.cn/blogs/19

What this page covers

技能认证特训营第二期报名提示

页面顶部包含活动/报名引导信息,提供限时报名链接与福利优惠提示。

高频数据处理技巧:如何将高频信号转化成离散的买卖信号

文章标题与页面主主题。

作者与发布日期

提供作者署名与发布时间信息。

问题定义:从浮点信号到离散方向信号

说明高频交易流程中将 tick 级信号量转化为离散买卖信号(1/0/-1)的需求与本文关注步骤。

简单阈值规则与 DolphinDB 实现

给出基于两个阈值的简单分类规则,并提供 DolphinDB 的 iif 嵌套表达式示例。

更健壮的路径依赖阈值规则(滞回)

提出为避免频繁切换方向的滞回式规则,引入 t1/t10/t2/t20 及其不等式关系,并指出其路径依赖特征与脚本逐行处理的性能矛盾。

向量化技巧:front fill 处理未知状态并合成方向信号

通过将点划分为临界点/不可能点/未知点并使用 ffill 进行前向填充,分别构造 buy 与 sell,再相减并 nullFill 得到 direction。

示例测试:阈值、信号序列与输出方向

提供一组阈值与信号输入,展示 direction 的计算表达式与输出序列。

kdb+ 实现表达式

给出等价的 kdb+ 脚本表达式用于生成 direction。

pandas 实现代码

给出使用 pandas(Series/apply、ffill、fillna)实现相同逻辑的代码片段。

性能测试设置与机器配置

说明生成 1000 万长度随机信号数组用于对比三种实现性能,并列出 CPU/内存/操作系统配置。

性能结果与三种脚本的测试脚本

给出 DolphinDB、kdb+、pandas 的耗时对比,并分别提供三者的测试脚本代码。

DolphinDB 与 kdb+ 的脚本共性与差异说明

讨论 kdb+ 与 DolphinDB 在脚本可翻译性、解析方向与符号/函数风格上的差异。

DolphinDB 下载链接

提供 DolphinDB database 下载地址链接。

Facts Index

Entity Attribute Value Confidence
技能认证特训营第二期 状态 正式开启,并提供限时报名链接与专属福利优惠提示 medium
限时报名链接 url https://www.qingsuyun.com/h5/e/217471/5/ high
文章发布日期 date 2021-05-18 high
作者署名 name Junxi high
高频交易信号生成流程 描述 基于 tick 级报价信息和交易信息生成信号量,并将信号量转化为离散买卖信号(如 1/0/-1),再结合资金、头寸与优化规则生成订单发送到交易系统 high
本文讨论的目标 任务 将浮点数类型数组 signal 转化为取值为 1、0、-1 的整型数组 direction high
简单阈值转化规则 规则 signal > t1 时为 +1(买入),signal < t2 时为 -1(卖出),否则为 0 high
DolphinDB 简单阈值实现 表达式 iif(signal > t1, 1, iif(signal <t2, -1, 0)) high
更健壮的处理动机 原因 为让系统更健壮、不要频繁切换买卖方向,通常不会采用简单阈值直接切换 medium
滞回式买入规则 规则 当信号量超过 t1 时开始为买入信号;后续信号量衰减到低于 t10 之前一直保持买入信号(+1) high
滞回式卖出规则 规则 当信号量低于 t2 时开始为卖出信号;后续信号量增强到大于 t20 之前一直保持卖出信号(-1) high
阈值关系 不等式 t1 > t10 > t20 > t2 high
路径依赖性质 描述 按上述规则运行时,买卖方向除当前信号量外还取决于前一个买卖信号状态,属于路径依赖问题 high
脚本语言逐行处理路径依赖的效率 描述 在处理量化问题时脚本语言效率高,但若需要逐行处理路径依赖问题,解析成本高、效率低下 medium
买入信号向量化分段法 步骤 将向量点分为买入信号临界点(signal>t1,+1)、不可能买入点(signal<t10,0)以及未知点(NULL) high
front fill 推断未知状态 规则 未知点若前面出现买入临界点则置为买入信号;若前面出现非买入信号点(0)则置为非买入信号;可用 ffill 实现 high
卖出信号构造与合成方向 方法 用同样方法找出卖出信号(卖出信号为 +1,其他为 0),buy 与 sell 相减得到最终信号;剩余 null 替换为 0 high
DolphinDB buy/sell/direction 代码 代码片段 buy = iif(signal >t1, 1h, iif(signal < t10, 0h, 00h)).ffill() sell = iif(signal <t2, 1h, iif(signal > t20, 0h, 00h)).ffill() direction = (buy - sell).nullFill(0h) high
DolphinDB 单表达式实现 代码片段 direction = (iif(signal >t1, 1h, iif(signal < t10, 0h, 00h)) - iif(signal <t2, 1h, iif(signal > t20, 0h, 00h))).ffill().nullFill(0h) high
示例测试参数 阈值与输入 t1=60, t10=50, t20=30, t2=20;signal=10 20 70 59 42 49 19 25 26 35 high
示例测试输出 direction 结果 [-1,-1,1,1,0,0,-1,-1,-1,0] high
kdb+ 实现表达式 代码片段 direction: 0h^fills(-).(0N 1h)[(signal>t1;signal<t2)]^'(0N 0h)[(signal<t10;signal>t20)] high
pandas 实现代码 代码片段 direction = (signal.apply(lambdas: 1 if s > t1 else (0 if s < t10 else np.nan)) - signal.apply(lambdas: 1 if s < t2 else (0 if s > t20 else np.nan))).ffill().fillna(0) high
性能测试数据规模 signal 长度与范围 生成长度为 1000 万、取值在 0~100 之间的随机信号数组进行测试 high
测试机器 CPU 型号 Intel(R) Core(TM) i7-7700 CPU @3.60GHz 3.60 GHz high
测试机器 内存 容量 16GB high
测试机器 操作系统 OS Windows 10 high
性能测试结果 耗时 DolphinDB 330ms,kdb+ 800ms,pandas 约 6.8s high
DolphinDB 性能测试脚本 代码片段 t1= 60 t10 = 50 t20 = 30 t2 = 20 signal = rand(100.0, 10000000) timer direction = (iif(signal >t1, 1h, iif(signal < t10, 0h, 00h)) - iif(signal <t2, 1h, iif(signal > t20, 0h, 00h))).ffill().nullFill(0h) high
kdb+ 性能测试脚本 代码片段 t1:60 t10:50 t20:30 t2:20 signal: 10000000 ? 100.0 \\t 0h^fills(-).(0N 1h)[(signal>t1;signal<t2)]^'(0N 0h)[(signal<t10;signal>t20)] high
pandas 性能测试脚本 代码片段 import time ... signal= pd.Series(np.random.random(10000000) * 100) ... print(end- start) high
DolphinDB 与 kdb+ 脚本共性 可翻译性 kdb+ 脚本基本上能逐句逐词翻译成 DolphinDB 脚本 medium
kdb+ 与 DolphinDB 的解析方向差异 解析顺序 kdb+ 从左到右解析脚本;DolphinDB 跟常规编程语言一样从右到左 medium
kdb+ 与 DolphinDB 的表达风格差异 符号/函数偏好 kdb+ 喜欢用符号代表功能;DolphinDB 更喜欢用函数表达,可读性较好但更冗长 medium
DolphinDB 下载地址 url http://www.dolphindb.cn/ high