ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Freqtrade Orderflow 订单流数据分析实战:公开成交数据配置、下载与策略列使用指南

Freqtrade Orderflow 订单流数据分析实战:公开成交数据配置、下载与策略列使用指南 Freqtrade Orderflow 订单流数据分析实战公开成交数据配置、下载与策略列使用指南【免费下载链接】freqtradeFree, open source crypto trading bot项目地址: https://gitcode.com/GitHub_Trending/fr/freqtrade本文基于 Freqtrade 官方文档 docs/advanced-orderflow.md 展开讲解如何利用交易所公开逐笔成交数据public trades在回测与实盘中做订单流orderflow分析如何开启use_public_trades、如何配置orderflow参数、如何用--dl-trades下载历史成交数据、策略 dataframe 中新增的 11 个订单流列各代表什么以及 footprint 图表成交量分布与失衡imbalances检测的底层算法。读完后你可以独立搭建一套基于买卖盘口不平衡、Delta 与堆叠失衡的订单流指标策略。功能定位与适用限制Freqtrade 的 orderflow 功能允许你把交易所的逐笔公开成交记录public trades聚合到每一根 K 线上从而在策略中分析订单流动态。官方文档将其明确标注为实验性beta特性使用前后需要注意三点限制功能处于 beta 阶段未来版本中配置项和列结构可能发生变化遇到问题应向官方仓库反馈尚未与 FreqAI 测试组合使用把 orderflow 和 FreqAI 两个功能叠加目前不在支持范围内性能开销显著orderflow 需要原始逐笔成交数据数据量远大于 OHLCV。首次启动时 Freqtrade 需要下载覆盖最近若干根 K 线的全部成交记录导致启动变慢开启后内存占用也会明显上升需要预留足够的计算资源。从源码结构看该功能的所有计算集中在 freqtrade/data/converter/orderflow.py新增列的完整清单定义在 freqtrade/constants.py 的ORDERFLOW_ADDED_COLUMNS常量中trades、orderflow、imbalances、stacked_imbalances_bid、stacked_imbalances_ask、max_delta、min_delta、bid、ask、delta、total_trades与文档描述一一对应。开启功能在 exchange 段启用 use_public_trades第一步是在config.json的exchange段中将use_public_trades设为trueexchange: { ... use_public_trades: true, }这一步不是可选开关那么简单。在配置校验层 freqtrade/configuration/config_validation.py 中_validate_orderflow会检查一旦exchange.use_public_trades为true而配置中缺少顶层orderflow段会直接抛出ConfigurationErrorOrderflow is a required configuration key when using public trades.。也就是说开启公开成交数据后orderflow配置段是必填项两个配置必须同时存在。策略侧的入口在 freqtrade/strategy/interface.py 的_if_enabled_populate_trades方法当检测到exchange.use_public_trades为真时它会以当前 dataframe 的日期范围构造 timerange通过self.dp.trades(...)从 DataProvider 取成交记录再调用populate_dataframe_with_trades把订单流列填充进你策略使用的 dataframe并按交易对缓存已计算好的分组结果。由于该填充发生在advise_indicators阶段之前你的populate_indicators中可以直接读取这些新列。配置 orderflow 处理参数orderflow段共有 6 个参数完整配置示例如下来自官方文档orderflow: { cache_size: 1000, max_candles: 1500, scale: 0.5, stacked_imbalance_range: 3, // needs at least this amount of imbalance next to each other imbalance_volume: 1, // filters out below imbalance_ratio: 3 // filters out ratio lower than }各参数含义、schema 约束与源码中的作用如下表参数作用schema 约束config_schema.py源码中的行为cache_size多少根历史 orderflow K 线被缓存而不是每根新 K 线重新计算数值最小 1默认 1500计算完成后取dataframe.tail(cache_size)整体缓存下一轮若某根 K 线命中缓存则直接复制结果跳过全部计算max_candles只为最近多少根 K 线获取并聚合成交数据数值最小 1默认 1500策略侧仅聚合晚于dataframe.tail(max_candles).date.iat[0]的成交交易侧needed_candle_for_trades_ms用它决定从交易所拉取多少根 K 线量的成交scalefootprint 图表的价格分箱bin宽度数值最小 0.0成交价按round(price / scale) * scale取整到scale的整数倍后分箱聚合stacked_imbalance_range连续失衡价格层的最小个数数值最小 0用于stacked_imbalance函数识别堆叠失衡区间的起始价格imbalance_volume失衡判定的最低总量阈值数值最小 0价格层总成交量低于该值时失衡直接判为Falseimbalance_ratio失衡判定所需的 bid/ask 成交量比值下限数值最小 0.0bid 失衡要求本层 bid 量 / 上一层 ask 量 该比值在 schema 中max_candles和scale属于必填字段required数组而cache_size缺省为 1500。注意scale是绝对价格单位而非百分比例如scale: 0.5表示每 0.5 个价格单位聚合成一个价格层选择时应与所交易品种的典型价差量级匹配分箱过粗会丢失细节过细则单箱成交量被摊薄难以触发失衡阈值。为回测下载历史成交数据回测需要历史逐笔成交数据通过freqtrade download-data命令的--dl-trades标志下载定义于 freqtrade/commands/cli_options.py 的download_trades选项帮助文本为 Download trades instead of OHLCV data。官方文档给出的示例freqtrade download-data -p BTC/USDT:USDT --timerange 20230101- --trading-mode futures --timeframes 5m --dl-trades该命令的执行链是download-data进入数据下载流程后逐笔拉取由 freqtrade/data/history/history_utils.py 驱动——先读取本地已有成交文件再调用 freqtrade/exchange/exchange.py 的get_historic_trades内部按交易对、since/until 时间窗支持 time 或 id 两种游标分页方式增量抓取新成交去重后落盘。--trading-mode futures决定成交数据归属现货还是合约交易模式--timeframes指定 K 线周期因为 orderflow 列是按 K 线周期聚合的。数据可用性提醒并非所有交易所都提供历史公开成交数据。对于不支持的交易对/交易所使用--dl-trades启动下载时 Freqtrade 会打印警告。此外同一目录下的--convert标志可以把已下载的成交数据转换为 OHLCV主要用于没有历史 OHLCV 的交易所这属于 download-data 文档 的范畴与 orderflow 分析相互独立但共用同一份成交文件。策略中自动生成的订单流列启用后populate_dataframe_with_tradesfreqtrade/data/converter/orderflow.py会为 dataframe 的每根 K 线填充以下列文档列表 源码常量一致dataframe[trades] # 本根 K 线内每笔成交的明细列表 dataframe[orderflow] # footprint 图表 dict见下文结构 dataframe[imbalances] # 本根 K 线的买卖盘失衡 dict dataframe[bid] # 本根 K 线 bid 方向总成交量 dataframe[ask] # 本根 K 线 ask 方向总成交量 dataframe[delta] # ask 与 bid 成交量之差 dataframe[min_delta] # K 线内逐笔 delta 累计和的最小值 dataframe[max_delta] # K 线内逐笔 delta 累计和的最大值 dataframe[total_trades] # 成交笔数 dataframe[stacked_imbalances_bid] # bid 侧堆叠失衡区间起始价格列表 dataframe[stacked_imbalances_ask] # ask 侧堆叠失衡区间起始价格列表在源码中可以确认这些列的计算细节bid/ask 归属约定side sell的成交计入bid方向side buy的成交计入ask方向——即以主动卖盘砸向买盘为 bid 量、主动买盘吃掉卖盘为 ask 量delta ask - bid正值表示主动买盘占优min/max_delta对 K 线内逐笔 delta 做累计和cumsum取该曲线的最大值与最小值反映 K 线内部主动买卖力量的最强峰值计算窗口只处理晚于最近max_candles根 K 线起始时间的成交更早的历史不会参与聚合这正是内存开销可控的关键异常处理整个填充过程若抛错会被包装为DependencyException并记录日志而不是静默产出空列。一个最小可用的策略集成示例文档原版def populate_indicators(self, dataframe: DataFrame, metadata: dict) - DataFrame: # Calculating cumulative delta dataframe[cum_delta] cumulative_delta(dataframe[delta]) # Accessing total trades total_trades dataframe[total_trades] ... def cumulative_delta(delta: Series): cumdelta delta.cumsum() return cumdelta累计 deltacumulative delta是订单流分析中最常用的基础指标对delta列求累计和即可得到资金主动流向的累积曲线可配合均线或背离逻辑构建信号。Footprint 图表dataframe[orderflow]列orderflow列保存的是每根 K 线的footprint足迹图按scale分箱后各价格层上主动买/卖成交量与笔数的分布。其结构为{价格: 统计dict}{ price: { bid_amount: 0.0, ask_amount: 0.0, bid: 0, ask: 0, delta: 0.0, total_volume: 0.0, total_trades: 0 } }各字段含义字段含义key价格价格层按scale间隔分箱round(price/scale)*scalebid_amount该价格层上买方向sidesell 主动卖盘总成交量ask_amount该价格层上卖方向sidebuy 主动买盘总成交量bid/ask该价格层的买/卖订单笔数delta该价格层 ask_amount 与 bid_amount 之差total_volume该价格层总量ask_amount bid_amounttotal_trades该价格层总笔数ask bid对应实现是 freqtrade/data/converter/orderflow.py 中的trades_to_volumeprofile_with_total_delta_bid_ask先用np.where把 side 映射为 bid/ask 的量与笔数把成交价取整到scale的倍数再groupby(price).sum()完成分箱聚合。footprint 分布可以让你直接看到单根 K 线内资金在哪些价位激烈换手例如高价位出现集中的 ask_amount 峰通常意味着买方在该位置持续吃单上攻。原始成交明细dataframe[trades]列trades列是一个列表保存本根 K 线时间窗内发生的所有逐笔成交用于比列级指标更细粒度的自定义分析。每条记录为 dict包含文档列出timestamp成交时间戳毫秒date成交日期price成交价格amount成交数量side买或卖id交易所唯一成交标识cost成交总价值price × amount。从源码结构看存储进trades列的记录来源于 freqtrade/constants.py 定义的DEFAULT_TRADES_COLUMNStimestamp、id、type、side、price、amount、cost外加date列因此在实际使用中每条记录还会出现typelimit/market 等订单类型字段聚合时用于剔除的candle_start/candle_end辅助列不会写入该列。失衡检测imbalances与stacked_imbalancesimbalances列提供每根 K 线的盘口失衡信息当某一价格层的 ask 与 bid 成交量出现显著差异时即构成失衡。其结构为{价格: {bid_imbalance: 布尔, ask_imbalance: 布尔}}{ price: { bid_imbalance: false, ask_imbalance: false } }算法实现trades_orderflow_to_imbalances值得逐行理解因为这里采用的是斜向对比而非同层对比ask df.ask.shift(-1)——把 ask 列向下平移一格即用价格层 N 的 bid 量与价格层 N1 的 ask 量比较footprint 分析中标准的对角比较bid_imbalance (bid / ask_above) imbalance_ratio本层 bid 量相对上一层 ask 量比值超过imbalance_ratio时判定为 bid 失衡ask_imbalance对称处理再按total_volume imbalance_volume把低量级的价格层强制置False避免小盘噪音触发失衡。stacked_imbalances_bid/stacked_imbalances_ask列则进一步做堆叠失衡识别stacked_imbalance函数把布尔失衡序列分组统计连续 True 段凡是连续失衡层数达到stacked_imbalance_range的区间就返回该区间起始价格层。多个这样的起始价列表即构成堆叠失衡区——在实盘语义上连续多层买/卖盘压倒性占优的位置常被视为短期支撑/阻力或流动性真空边界。注意列表记录的是失衡区间的开始价格而非全部失衡价格策略中若需要区间端点可用scale反推。缓存机制与性能调优orderflow 的计算成本决定了两个参数直接决定运行效率cache_sizepopulate_dataframe_with_trades每次运行结束后保存dataframe.tail(cache_size)的副本作为缓存下一根新 K 线到来时凡是 date 命中缓存的 K 线其 11 个订单流列直接从缓存复制不再重算 footprint 和失衡。cache_size越大重算越少、内存越高——文档示例取 1000schema 默认 1500可按回测时长与内存权衡max_candles双重作用——策略侧只聚合最近max_candles根 K 线的成交交易侧 freqtrade/exchange/exchange.py 的needed_candle_for_trades_ms用min(max_candles, 单次可拉取 K 线数)决定从交易所预取的成交时间窗并额外多取 1 根 K 线作为安全边界。_now_is_time_to_refresh_trades则在新 K 线形成后触发增量拉取只抓自上一笔缓存成交 id 之后的新记录并合并去重因此实盘运行期每个周期的增量成本很低大头在首次冷启动。回测时如果观察到启动阶段耗时集中可以优先调小max_candles以覆盖策略回看窗口为准如果实盘中每周期延迟偏高再考虑增大cache_size。仓库中可深入阅读的参考文件文档原文docs/advanced-orderflow.md核心实现freqtrade/data/converter/orderflow.pyK 线分组、footprint 分箱、失衡与堆叠失衡算法、缓存逻辑列常量freqtrade/constants.pyORDERFLOW_ADDED_COLUMNS、DEFAULT_TRADES_COLUMNS、TRADING_MODES配置 schemafreqtrade/config_schema/config_schema.pyorderflow段各参数类型、最小值与默认值配置校验freqtrade/configuration/config_validation.pyuse_public_trades与orderflow段的联动校验策略填充入口freqtrade/strategy/interface.py_if_enabled_populate_trades按交易对缓存分组结果成交拉取与刷新freqtrade/exchange/exchange.pytrades缓存、get_historic_trades、needed_candle_for_trades_ms、_now_is_time_to_refresh_trades下载入口选项freqtrade/commands/cli_options.py--dl-trades单元测试tests/data/test_converter_orderflow.py测试样例数据tests/testdata/orderflow含populate_dataframe_with_trades_DF.feather等预期结果文件可用于核对列结构与聚合逻辑小结Freqtrade 的 orderflow 功能把逐笔成交 → K 线级订单流指标这条链路完整地工程化了--dl-trades负责数据落盘use_public_tradesorderflow配置负责开关与分箱/失衡阈值populate_dataframe_with_trades负责带缓存的聚合计算最终在populate_indicators前交付delta、cum_delta、footprint、imbalances 与堆叠失衡区等可直接建模的列。作为 beta 特性建议先在回测环境验证信号逻辑与资源消耗再谨慎投入实盘并注意它当前不与 FreqAI 组合使用。【免费下载链接】freqtradeFree, open source crypto trading bot项目地址: https://gitcode.com/GitHub_Trending/fr/freqtrade创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进