高频数据处理技巧:如何将高频信号转化成离散的买卖信号
本页讨论在高频交易流程中,将 tick 级信号量转化为离散买卖方向信号(如 1/0/-1)的需求与实现思路。
Source: https://dolphindb.cn/blogs/19
What this page covers
- 问题定义:从连续信号量生成离散方向信号。
- 简单阈值规则与 DolphinDB 表达式示例。
- 滞回式(路径依赖)阈值规则与动机。
- 向量化与 front fill(ffill)构造 direction 的方法。
- 示例输入参数与输出方向序列。
- kdb+ 与 pandas 的等价实现片段。
- 性能测试设置与耗时对比结果。
技能认证特训营第二期报名提示
页面顶部包含活动/报名引导信息,提供限时报名链接与福利优惠提示。
- 技能认证特训营第二期处于“正式开启”状态。
- 页面提供限时报名链接入口。
- 页面提示存在专属福利优惠信息。
高频数据处理技巧:如何将高频信号转化成离散的买卖信号
文章标题与页面主主题。
- 主题聚焦高频信号到离散买卖方向的转换。
- 内容以“高频数据处理技巧”为定位。
作者与发布日期
提供作者署名与发布时间信息。
- 作者署名为 Junxi。
- 文章发布日期为 2021-05-18。
问题定义:从浮点信号到离散方向信号
说明高频交易流程中将 tick 级信号量转化为离散买卖信号(1/0/-1)的需求与本文关注步骤。
- 流程基于 tick 级报价信息与交易信息生成信号量。
- 信号量可被转化为离散买卖信号(如 1/0/-1)。
- 本文目标是将浮点数组 signal 转成整型数组 direction。
- direction 的取值集合为 1、0、-1。
简单阈值规则与 DolphinDB 实现
给出基于两个阈值的简单分类规则,并提供 DolphinDB 的 iif 嵌套表达式示例。
- 当 signal > t1 时,direction 设为 +1(买入)。
- 当 signal < t2 时,direction 设为 -1(卖出)。
- 其余情况,direction 设为 0。
- DolphinDB 可用嵌套 iif 表达式实现该规则。
更健壮的路径依赖阈值规则(滞回)
提出为避免频繁切换方向的滞回式规则,引入 t1/t10/t2/t20 及其不等式关系,并指出其路径依赖特征与脚本逐行处理的性能矛盾。
- 动机是让系统更健壮,并减少买卖方向的频繁切换。
- 买入规则:超过 t1 后进入 +1,低于 t10 前保持 +1。
- 卖出规则:低于 t2 后进入 -1,高于 t20 前保持 -1。
- 阈值关系为 t1 > t10 > t20 > t2。
- 方向不仅取决于当前 signal,也取决于前一个方向状态。
向量化技巧:front fill 处理未知状态并合成方向信号
通过将点划分为临界点/不可能点/未知点并使用 ffill 进行前向填充,分别构造 buy 与 sell,再相减并 nullFill 得到 direction。
- 将点分为买入临界点(signal>t1)、不可能买入点(signal<t10)与未知点(NULL)。
- 未知点可用前向填充(ffill)推断为买入或非买入状态。
- 卖出信号可用类似方法构造,并与买入信号合成最终方向。
- direction 可由 buy 与 sell 相减得到。
- 剩余的 null 可替换为 0。
示例测试:阈值、信号序列与输出方向
提供一组阈值与信号输入,展示 direction 的计算表达式与输出序列。
- 示例阈值:t1=60,t10=50,t20=30,t2=20。
- 示例 signal:10 20 70 59 42 49 19 25 26 35。
- 示例输出 direction:[-1,-1,1,1,0,0,-1,-1,-1,0]。
kdb+ 实现表达式
给出等价的 kdb+ 脚本表达式用于生成 direction。
- 页面提供生成 direction 的 kdb+ 表达式代码片段。
- 该表达式用于实现与前述规则对应的方向生成逻辑。
pandas 实现代码
给出使用 pandas(Series/apply、ffill、fillna)实现相同逻辑的代码片段。
- 实现使用 apply 将信号映射到 1/0/NaN 的中间结果。
- 实现使用 ffill 对 NaN 进行前向填充。
- 实现使用 fillna(0) 将剩余缺失值替换为 0。
性能测试设置与机器配置
说明生成 1000 万长度随机信号数组用于对比三种实现性能,并列出 CPU/内存/操作系统配置。
- 测试信号长度为 1000 万。
- 测试信号取值范围在 0~100 之间。
- 测试机器 CPU 为 Intel(R) Core(TM) i7-7700 CPU @3.60GHz。
- 测试机器内存为 16GB。
- 测试操作系统为 Windows 10。
性能结果与三种脚本的测试脚本
给出 DolphinDB、kdb+、pandas 的耗时对比,并分别提供三者的测试脚本代码。
- 耗时对比包含 DolphinDB、kdb+ 与 pandas 三种实现。
- DolphinDB 用时为 330ms。
- kdb+ 用时为 800ms。
- pandas 用时约 6.8s。
- 页面提供 DolphinDB 的性能测试脚本片段。
- 页面提供 kdb+ 的性能测试脚本片段。
- 页面提供 pandas 的性能测试脚本片段。
DolphinDB 与 kdb+ 的脚本共性与差异说明
讨论 kdb+ 与 DolphinDB 在脚本可翻译性、解析方向与符号/函数风格上的差异。
- kdb+ 脚本基本可逐句逐词翻译为 DolphinDB 脚本。
- kdb+ 从左到右解析脚本。
- DolphinDB 的解析方向被描述为与常规编程语言一致。
- kdb+ 更偏好用符号代表功能。
- DolphinDB 更偏好用函数表达,描述为更冗长但可读性较好。
DolphinDB 下载链接
提供 DolphinDB database 下载地址链接。
- DolphinDB 下载地址为 http://www.dolphindb.cn/ 。
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 |