高频行情相较于传统日频数据,蕴含更丰富的市场微观结构信息,在资金流识别、订单簿动态、交易冲击分析等方面具有不可替代的价值。然而,直接使用高频数据构建策略,不仅对基础设施要求极高,也面临信号噪声大、换手成本高、难以规模化部署等现实挑战。在此背景下,高频行情低频化因子作为一种兼顾信息利用率与工程可行性的解决路径,逐渐受到业界的广泛关注。
所谓高频行情低频化因子,是指将分钟级或 Tick 级高频数据通过统计、聚合或建模手段,提炼为可在日频上稳定使用的特征信号,以适配中低频策略的交易与风控节奏,帮助策略开发者将微观、瞬时的市场状态信号转化为具备稳定预测能力的低频特征,进而提前捕捉市场机会、优化风险管控,构建具有信息壁垒的差异化策略体系。
然而,当前市面上成熟的高频行情低频化计算框架极为稀缺,现有方案普遍面临性能瓶颈与工程落地门槛高的困境------以 Python 的 Pandas 为例,处理全市场多年分钟级数据的时间与内存开销往往难以接受,且缺乏一个统一的、标准化的、适合团队协同工作的解决方案。
基于这一背景,DolphinDB 以百余个经公开研报验证、具有文献支撑的中低频日频因子为实践载体,结合其在海量数据处理方面的技术优势,探索并沉淀出一套面向分钟级乃至 Tick 级高频行情数据的通用因子计算框架,为量化策略研究与工程化落地提供完整的方法论参考与开箱即用的实现路径。
适用场景
01 高频数据的低频化因子研究
对于希望从高频行情中提炼有效信号的量化团队,高频行情低频化因子库提供了一套可直接使用的因子化框架。研究人员可以基于分钟 K 线、Level-2 快照、逐笔委托、逐笔成交等数据,快速生成低频因子结果,并开展后续的效果分析和因子筛选工作。
02 因子库建设与平台化管理
对于正在推进投研平台建设的机构,高频行情低频化因子库也适合作为因子资产管理的一部分。通过统一模板、批量计算、结果存储和更新维护机制,机构可以维护统一的因子库体系,提升因子生产和管理的标准化程度。
核心功能
01 统一的因子模板,降低开发门槛
高频行情低频化因子库基于统一的因子模板进行开发:因子模板以数据表入参,返回包含 SecurityID、TradeDate、Value、FactorName、UpdateTime 的标准因子表。
以成交量占比偏度因子为例,其因子计算函数如下:
cs
def skewVolProp(snapshot){
// 数据筛选
snap =
select
TradeDate, TradeTime, SecurityID,
deltas(TotalVolumeTrade)\last(TotalVolumeTrade) as volProp
from snapshot
context by TradeDate, SecurityID csort TradeTime
having TradeTime >= 09:30:00.000
// 计算因子指标
res =
select
SecurityID,
TradeDate,
skew(volProp) as Value,
"skewVolProp" as FactorName,
now() as UpdateTime
from snap
group by TradeDate, SecurityID
return res
}
统一的出参规范使所有因子天然具备一致的数据结构,无论是多因子横向对比、入库管理,还是与下游回测、生产流程对接,均无需额外的格式适配;开发者新增自定义因子时,只需遵循相同的出参约定,即可无缝融入已有的因子管理与调用体系。
注:不同数据源字段可能有区别,使用该库前请依据本地数据源的字段进行对齐。
02 100+因子计算逻辑,开箱即用,灵活可扩展
因子库覆盖 100 余个高频行情低频化因子,涵盖量价关系、波动特征、流动性状态与交易行为四大维度,按数据源分为四类:基于分钟 K 线、Level-2 快照、逐笔委托与逐笔成交。通过聚合等低频化处理手段,将原本难以直接纳入中低频策略框架的 Tick 级信息,转化为可直接参与研究、回测与生产的日频因子。因子库已内置完整计算逻辑,用户可直接调用或参考,无需从零开发。
以下按数据源分类,列举部分代表性因子,完整因子列表及计算代码请参见原文:
基于分钟 K 线的因子
聚焦日内量价行为与交易结构特征,如:
-
最短路径非流动性因子:以 K 线路径构造非流动性度量,捕捉价格变动阻力
-
成交量"潮汐"价格变动速率因子:刻画日内成交量涨退潮节奏与价格联动关系
-
T 分布主动占比因子:利用 T 分布估计主动买入金额占比,反映交易方向倾向
基于 Level-2 快照的因子
深入挖掘盘口信息与高频波动结构,如:
-
已实现跳跃波动率因子:分离价格连续波动与跳跃成分,识别非正常波动事件
-
聪明钱因子:识别被动挂单、订单流持续性和交易非对称性,追踪知情交易者行为
-
日度盘口价差因子:度量买卖报价价差,反映日内微观流动性水平
基于逐笔委托的因子
捕捉委托意愿与交易预期,如:
- 开盘后净委买增额占比因子:统计开盘后净委买变化额与成交额之比,反映早盘资金入场意愿强度
基于逐笔成交的因子
精细刻画主动交易行为与大单冲击,如:
-
大单买入占比因子:识别成交量显著偏大的订单,识别异常交易冲击
-
卖出反弹偏离因子:统计低于收盘价的卖单平均成交价偏离幅度,刻画遗憾规避行为
-
超大单涨跌幅因子:追踪超大单主动成交的累计价格冲击,量化巨量资金对价格的驱动效应
03 异步后台任务 + 并行计算框架,提升因子生产效率
面对高频数据量大、计算耗时长的现实挑战,因子库在计算架构上提供了两层加速机制:
一是通过 submitJob将计算任务以异步方式提交至服务器后台执行,无需阻塞等待,释放前台资源;
二是在任务执行过程中,基于 DolphinDB 的 map-reduce 框架(mr 函数)对数据分区进行并行计算,充分利用集群算力。
cs
//后台任务计算函数模版
def factorjob(conf){
dataTB = loadTable(conf[`dataDB], conf[`dataTB])
days = conf[`startDay]..conf[`endDay]
startTime = 09:30:00.000
endTime = 14:57:00.000
//提取计算所需数据,sqlDS生成元代码
ds = sqlDS(<select SecurityID, date(DateTime) as TradeDate, time(DateTime) as TradeTime, LastPx, Volume, Amount
from dataTB
where date(DateTime) in days and (time(DateTime) between startTime and endTime) and (SecurityID like "00%" or SecurityID like "30%" or SecurityID like "6%") and LastPx>0>)
//计算因子,mr函数将因子在不同节点并行计算,unionAll函数将不同节点的计算结果汇总
diffTB = mr(ds, conf[`func]).unionAll()
res = conf[`funcsec](diffTB)
//写入因子库,存储到磁盘做持久化
loadTable(conf[`factorDB], conf[`factorTB]).append!(select * from res)
}
//计算模版配置参数
conf = {
func : fuzzinessDiff,
funcsec : adjFuzzinessDiff,
factorName : "fuzzinessDiff",
dataDB : "dfs://stockMinKSH",
dataTB : "stockMinKSH",
factorDB : "dfs://factor_day",
factorTB : "factor_day",
startDay : 2021.01.01,
endDay : 2021.01.31
}
//提交计算和存储因子的任务到服务器
id = submitJob("factorjob", conf[`factorname], factorjob, conf)
此外,该框架天然支持批量计算:将配置好参数的脚本上传至服务器,通过循环调用即可一次性完成多个因子的计算与入库,适合历史回算、定期更新等批量生产场景,有效减少人工干预,降低运维成本。
04 因子结果存储与更新,便于持续沉淀
该框架不仅关注计算本身,也对结果的存储与更新提供了完整支持。计算完成后,结果将自动写入 DolphinDB 分布式因子库,按交易日与因子名分区存储;表结构内置 UpdateTime 字段,完整记录每次入库时间。存储层采用 TSDB 引擎,并通过 keepDuplicates=LAST 机制支持因子值的增量更新------重复写入时,系统以 sortColumns 为键值,自动保留最新结果,无需手动去重。
cs
// 创建日频因子库
create database "dfs://factor_day"
partitioned by RANGE(date(datetimeAdd(1980.01M,0..80*12,'M'))), VALUE(`f1`f2),
engine='TSDB',
atomic='CHUNK'
// 创建分区表
create table "dfs://factor_day"."factor_day"(
SecurityID SYMBOL,
TradeDate DATE[comment="时间列", compress="delta"],
Value DOUBLE,
FactorName SYMBOL,
UpdateTime TIMESTAMP,
)
partitioned by TradeDate, FactorName
sortColumns=[`SecurityID, `TradeDate],
keepDuplicates=LAST, //支持重复写入,保留最新写入的因子值
sortKeyMappingFunction=[hashBucket{, 500}]
对于金融机构而言,因子真正形成价值,不只是"算出来",更在于"存下来、管起来、持续用起来"。统一的存储与更新机制,有助于机构将高频行情低频化因子逐步沉淀为可查询、可维护、可复用的因子资产池,为后续回测分析、策略调用与平台建设打下基础。
05 宽表、窄表一条语句转换,方便不同场景使用
在因子使用过程中,不同业务场景对数据组织方式有不同要求。目前 DolphinDB 支持宽表和窄表两种存储模式。相较于宽表,窄表存储能够更高效地支持因子数据的添加、更新与删除操作,因此在本框架下,推荐采用窄表存储因子库。
但在计算环节,例如需要针对某一交易日的时间截面,横向对比不同标的在同一批因子上的表现差异,或者进行跨标的因子分布统计时,可以利用 DolphinDB 特殊的 pivot by 语句灵活调整数据维度。
以下示例代码展示了将因子窄表转换为宽表的逻辑:针对同一标的和同一交易日,将不同因子的值横向展开,以便于进行多维度的截面分析。
cs
dailyFactor = loadTable("dfs://factor_day","factor_day")
factorTB1 = select
Value
from dailyFactor
where FactorName in `skewVolProp`netBuyIntenOpen
pivot by SecurityID, TradeDate, FactorName
这一写法能够快速构建包含多个因子的宽表特征矩阵,便于在单标的研究场景下进行因子间的相关性分析或作为模型输入特征。
结语
高频数据蕴含着丰富的市场微观信息,但只有经过有效提炼,才能真正服务于中低频策略研究和投资决策。DolphinDB 高频行情低频化因子库,正是面向这一需求打造的一套因子化解决方案。它基于分钟 K 线、Level-2 快照、逐笔委托、逐笔成交等高频行情数据,支持 100 多个高频行情低频化因子的计算,并配套统一模板、批量处理、结果存储和更新维护等能力,帮助机构将高频数据沉淀为可持续复用的低频因子资产。
从高频数据到低频因子,从单点计算到体系化管理------DolphinDB 让这一过程变得简单、高效、可持续。