ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

NautilusTrader量化交易终极指南-第7章第2节-数据模型-Bar聚合十七种玩法

NautilusTrader量化交易终极指南-第7章第2节-数据模型-Bar聚合十七种玩法 NautilusTrader量化交易终极指南-第7章第2节-数据模型-Bar聚合十七种玩法一句话导读别只会用 1 分钟和 5 分钟 K 线——NautilusTrader 把 Bar 聚合拆成时间、阈值、信息驱动、Renko 四大流派十七种玩法BarType 字符串就是它们的配方。本文导航BarType一串字符串里藏着什么聚合方法的四大流派时间聚合最常用的一档阈值聚合按量成 K信息驱动聚合不平衡与连击Renko只看波动不看时间组合 Bar 与语法INTERNAL 与 EXTERNALBarSpecification 校验规则代码示例与输出小结下节预告1. BarType一串字符串里藏着什么先看一串最常见的 BarTypeEUR/USD.SIM-5-MINUTE-LAST-INTERNAL用-切成四段各有含义EUR/USD.SIMInstrumentId第 6 章讲过。5周期数值。MINUTE聚合方式。LAST在时间聚合里指用最后一笔价做收盘价。INTERNAL内部聚合。一个对象还分两层BarSpecification上面后三段5-MINUTE-LAST定义怎么聚和InstrumentId第一段定义聚谁的。组合起来就是BarType。构造方式三选一最常用第一种fromnautilus_trader.modelimportBarType,BarSpecification,BarAggregationfromnautilus_trader.model.identifiersimportInstrumentId aBarType.from_str(EUR/USD.SIM-5-MINUTE-LAST-INTERNAL)bBarType(instrument_idInstrumentId.from_str(EUR/USD.SIM),specBarSpecification(5,BarAggregation.MINUTE,LAST),)# a bBarType和BarSpecification都是dataclass(frozenTrue)自带了__eq__和__hash__所以可以直接扔进 dict 和 set 当 key——这点我后来用得很爽按 BarType 分组缓存、装配地图都顺滑。2. 聚合方法的四大流派NautilusTrader 的BarAggregation是个枚举我把它们按流派归一下类看这张图就全了BarAggregation 聚合方法时间驱动MILLISECONDSECONDMINUTEHOURDAYWEEKMONTHYEAR阈值驱动TICK 每N笔VOLUME 每N量VALUE 每N金额信息驱动TICK_IMBALANCEVOLUME_IMBALANCEVALUE_IMBALANCETICK_RUNSVOLUME_RUNSVALUE_RUNSRENKO数一数时间 8 阈值 3 信息 6 Renko 1 18 种枚举值不过核心玩法我习惯叫十七种因为 Renko 单独成流。下面逐个说。3. 时间聚合最常用的一档时间聚合按自然时间窗切割从MILLISECOND到YEAR共 8 个精度。策略里最常用MINUTE、HOUR、DAYEUR/USD.SIM-5-MINUTE-LAST-INTERNAL # 5 分钟线 EUR/USD.SIM-1-HOUR-LAST-INTERNAL # 1 小时线 EUR/USD.SIM-1-DAY-BID-INTERNAL # 1 日线用 bid 聚合时间聚合里那个中缀LAST/BID/ASK/MID/TRADE指Bar 的价格来源——LAST用最后一笔成交价BID用买一价MID用买卖中间价。我之前写过个坑外汇回测里默认都用LAST可一旦某时段没有成交LAST bar 就断了改用BID/ASK能续上行情。所以不同行情源中缀选要匹配你的数据供给。4. 阈值聚合按够数成 K阈值聚合不看时间看累积到什么量才封 barTICK凑够 N 笔 tick 就成一根。VOLUME累计成交量达到 Ncarry qty封 bar。VALUE累计成交金额达到 Ncarry currency notional封 bar。EUR/USD.SIM-1000-VOLUME-LAST-INTERNAL # 每 1000 手成交量成一根 EUR/USD.SIM-50000-VALUE-LAST-INTERNAL # 每 5 万美金金额成一根这招对流动性不均的品种特别香。比如有些小币成交稀疏按时间切 bar 会切出大量空窗按VOLUME切每根 bar 都货真价实没水份。5. 信息驱动聚合不平衡与连击信息驱动是 NautilusTrader 的高级玩法一行里藏着策略智慧。分两类不平衡类_IMBALANCETICK_IMBALANCE收单/主动买卖 tick 数不平衡达到阈值。VOLUME_IMBALANCE主动买卖成交量不平衡达阈值。VALUE_IMBALANCE主动买卖金额不平衡达阈值。连击类_RUNSTICK_RUNS/VOLUME_RUNS/VALUE_RUNS当主动买单或卖单连续跑出N 次/量/额才封 bar。BarType.from_str(BTCUSDT-PERP.BINANCE-1000-VOLUME_IMBALANCE-LAST-INTERNAL)这类 bar 天生带情绪方向信息做盘口倾向、订单流策略时是不可多得的原料。门槛高点但性能极具特色。6. Renko只看波动不看时间RENKO聚合按固定价格变动生成砖块专治噪声AAPL.XNAS-1-RENKO-LAST-INTERNAL # 每 1 个最小跳动成一块Renko 不关心时间过了多久只在价格朝同一方向波动满一个砖的大小bar_spec.step或price_increment才往外推 block。它的好处是天然过滤小幅震荡只看趋势代价是每根 bar 的时长不固定纯时间维度的指标它不适用。做趋势跟踪、均值回归前滤噪Renko 很能打。7. 组合 Bar 与语法VWAP 这类指标需要大数据窗口内的细分成交组合 bar 就是为此生的。它的语法是用把主 bar 和内部细粒度 bar 连起来EUR/USD.SIM-5-MINUTE-LAST-INTERNAL1-MINUTE-EXTERNAL左边外部/主 barfeed 给策略看的MINUTEtimeline。右边内部/聚合源用来聚合算 VWAP 的 1 分钟 bar。我一眼看标识符就头疼所以记住这个映射EXTERNAL是被消费的细粒度源INTERNAL是聚合成品。组合 bar 的意义在于主 bar 给你 5 分钟节奏的策略信号内部 1 分钟 bar 提供足够细的成交分布去算准确 VWAP。fromnautilus_trader.modelimportBarType vtBarType.from_str(EUR/USD.SIM-5-MINUTE-LAST-INTERNAL1-MINUTE-EXTERNAL)print(vt.internal_instrument_id)# 内层print(vt.external_instrument_id)# 外层8. INTERNAL 与 EXTERNAL这两个词在 BarType 里是聚合发生的位置/属性标记INTERNALbar 在引擎内部用内部跑到的数据聚合。EXTERNALbar 从由外部 feed 进来的更细粒度数据聚合。简单记忆组合 bar 里能省心接受外部细粒度 内部粗粒度的配置就能在保住信号颗粒度的同时算出精确类指标。多数人回测默认用纯INTERNAL就够组合 bar 只在需要内部数据做定量计算时才上。看两张组合关系图渲染错误:Mermaid 渲染失败: Parse error on line 2: ... subgraph EXTERNAL(外部细粒度 1-MINUTE) -----------------------^ Expecting SEMI, NEWLINE, SPACE, EOF, GRAPH, DIR, subgraph, SQS, end, AMP, COLON, START_LINK, STYLE, LINKSTYLE, CLASSDEF, CLASS, CLICK, DOWN, UP, NUM, NODE_STRING, BRKT, MINUS, MULT, UNICODE_TEXT, got PS9. BarSpecification 校验规则BarSpecification有严格校验写错就抛ValueError。几个要点step必须是正整数。聚合方式属于时间类MILLISECOND...YEARprice_typeLAST/BID/ASK/MID/TRADE就是必须的。阈值/信息/Renko 聚合price_type侧较宽松。fromnautilus_trader.modelimportBarSpecification,BarAggregation# 合法b1BarSpecification(5,BarAggregation.MINUTE,LAST)# 非法step 为 0# b2 BarSpecification(0, BarAggregation.MINUTE, LAST) # ValueError# 非法时间聚合缺 price_type# b3 BarSpecification(5, BarAggregation.MINUTE) # 类型不匹配经验是用BarType.from_str最省心因为它自带完整语法解析和校验比我手拼BarSpecification少踩一半坑。10. 代码示例与输出一键构造并解析一整批 BarType顺带校验各自属性fromnautilus_trader.modelimportBarType samples[EUR/USD.SIM-5-MINUTE-LAST-INTERNAL,EUR/USD.SIM-1000-VOLUME-LAST-INTERNAL,BTCUSDT-PERP.BINANCE-50000-VALUE_IMBALANCE-LAST-INTERNAL,AAPL.XNAS-1-RENKO-LAST-INTERNAL,EUR/USD.SIM-5-MINUTE-LAST-INTERNAL1-MINUTE-EXTERNAL,]forsinsamples:btBarType.from_str(s)print(f{s:45s}agg{bt.aggregation.__class__.__name__:18s}fspec{bt.spec})输出示意EUR/USD.SIM-5-MINUTE-LAST-INTERNAL aggBarAggregation spec5-MINUTE-LAST EUR/USD.SIM-1000-VOLUME-LAST-INTERNAL aggBarAggregation spec1000-VOLUME-LAST BTCUSDT-PERP.BINANCE-50000-VALUE_IMBALANCE-LAST-INTERNAL agg... spec50000-VALUE_IMBALANCE-LAST AAPL.XNAS-1-RENKO-LAST-INTERNAL agg... spec1-RENKO-LAST EUR/USD.SIM-5-MINUTE-LAST-INTERNAL1-MINUTE-EXTERNAL spec5-MINUTE-LAST能看到bt.spec稳定吐回标准化字符串全是范化的方便我写配置文件和日志埋点直接用它当 key。11. 小结BarType InstrumentId BarSpecificationfrom_str是最稳入口。聚合流派时间 8 种、阈值 3 种TICK/VOLUME/VALUE、信息 6 种IMBALANCE/RUNS×3、Renko。时间聚合配LAST/BID/ASK/MID/TRADE选价格源行情源要匹配。阈值聚合治流动性不均信息驱动自带情绪方向Renko 滤噪看趋势。组合 bar 用连内细外粗算 VWAP 等需要细分成交的指标。INTERNAL是引擎内部聚合EXTERNAL是外部细粒度源。BarSpecification有严格校验违反抛 ValueError。下节预告Bar 到底怎么从交易所发来的原始数据一步步汇到你的策略on_bar这串链路里各模块分别干嘛下一节数据的生命周期我用一整套 sequence diagram 把 QuoteTick 从交易所网络到策略方法的全程串给你看。聚合方法盘明白了点赞、收藏、关注三连下节看数据怎么跑完全程。
返回列表