第 5 章 · 03 数据分析与绘图


文档摘要

第 5 章 · 03 数据分析与绘图 本节摘要:本节讲清 freqtrade 的三个数据可视化工具。先用 盘点本地已有哪些币种、周期、类型的数据(顺便看时间跨度)。再用 把 K 线、指标、买卖信号、实际成交点画在同一张交互图上——绿色三角是入场信号、红色三角是出场信号、青色圆点是实际进场、红/绿方块是亏/盈出场,一眼看清策略「在哪买、在哪卖、信号有没有转化成真实成交」。最后用 画资金曲线、按交易对的盈亏分布、回撤区间和并发持仓数,从收益维度评估策略。本节也会提到:这两个绘图命令官方已标记为「维护模式」,新项目推荐用 FreqUI 的网页交互图替代。 内容来源:原项目文档 、 ,汉化并套用体系化模板。

第 5 章 · 03 数据分析与绘图

本节摘要:本节讲清 freqtrade 的三个数据可视化工具。先用 list-data 盘点本地已有哪些币种、周期、类型的数据(顺便看时间跨度)。再用 plot-dataframe 把 K 线、指标、买卖信号、实际成交点画在同一张交互图上——绿色三角是入场信号、红色三角是出场信号、青色圆点是实际进场、红/绿方块是亏/盈出场,一眼看清策略「在哪买、在哪卖、信号有没有转化成真实成交」。最后用 plot-profit 画资金曲线、按交易对的盈亏分布、回撤区间和并发持仓数,从收益维度评估策略。本节也会提到:这两个绘图命令官方已标记为「维护模式」,新项目推荐用 FreqUI 的网页交互图替代。

内容来源:原项目文档 docs/data-analysis.mddocs/plotting.md,汉化并套用体系化模板。

学习目标

阅读完本节,你应当能够:

  1. list-data 盘点本地数据的币种、周期、类型、时间跨度。
  2. plot-dataframe 画出 K 线 + 指标 + 买卖信号 + 实际成交点。
  3. 看懂图上绿/红三角、青圆点、红/绿方块各自的含义。
  4. plot-profit 画资金曲线、按交易对盈亏、回撤、并发数。
  5. 知道这两个命令处于维护模式,优先用 FreqUI

一、list-data:先盘点本地有什么

回测和绘图前,先确认本地数据齐不齐。list-data 列出 user_data/data/ 下所有已下载的币种/周期/类型组合:

freqtrade list-data --userdir user_data/

输出形如:

Found 33 pair / timeframe combinations. ┏━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━┓ ┃ Pair ┃ Timeframe ┃ Type ┃ ┡━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━┩ │ ADA/BTC │ 5m, 15m, 30m, 1h, 2h, 4h, 6h, 12h, 1d │ spot │ │ ETH/BTC │ 5m, 15m, 30m, 1h, 2h, 4h, 6h, 12h, 1d │ spot │ │ ETH/USDT │ 5m, 15m, 30m, 1h, 2h, 4h │ spot │ └───────────────┴───────────────────────────────────────────┴──────┘

--show-timerange 能看到每条数据的起止时间,排查「数据不够长」(指标热身不足):

freqtrade list-data --show-timerange --trades

--trades 还会列出逐笔成交数据的时间跨度和笔数。

💡 每次回测前先 list-data:90% 的「回测报错找不到数据」都是因为漏下了某个周期或币种。养成习惯先盘点。

二、绘图工具的安装

plot-dataframeplot-profit 依赖 Plotly,不在默认依赖里,需要单独装:

pip install -U -r requirements-plot.txt

⚠️ 维护模式:官方文档明确说这两个命令处于「维护模式」——中大规模数据绘图性能差、「存文件再开浏览器」的交互也不直观。短期内不会删除,但也不再积极维护。新项目优先用 FreqUI 的网页交互图,它没有同样的性能问题。本节仍讲这两个命令,因为它们在没有运行实例时也能离线分析回测结果。

三、plot-dataframe:K 线 + 指标 + 买卖点

plot-dataframe 生成一张交互式网页图,含三个子图:主图(K 线 + 跟随价格的指标如均线)、成交量、副图(其他指标如 MACD/RSI)。

freqtrade plot-dataframe --strategy AwesomeStrategy -p BTC/USDT

它会为每个交易对生成一个 HTML 文件。指定要画的指标:

# --indicators1 画在主图(与价格同尺度,如均线) # --indicators2 画在副图(尺度不同,如 MACD、RSI) freqtrade plot-dataframe --strategy AwesomeStrategy -p BTC/USDT \ --indicators1 sma ema --indicators2 macd rsi

图上的标记含义

这是看懂图的关键。同一根 K 线上,「信号」和「实际成交」是两回事:

标记 含义
绿色三角 ▲ 策略产出的入场信号(enter_long=1)。注意:有信号不等于成交,可能因 max_open_trades 满而被拒
红色三角 ▼ 策略产出的出场信号(exit_long=1)。同样,有信号不一定真平仓
青色圆点 ● 实际进场点(信号转化为真实订单)
红色方块 ■ 亏损或 0% 平仓的实际出场点
绿色方块 ■ 盈利平仓的实际出场点

💡 核心洞察:对比「三角数」和「圆点数」。如果绿三角远多于青圆点,说明大量入场信号因为满仓被拒——要么放宽 max_open_trades,要么信号太密集需要收紧。这是诊断策略「信号利用率」的最直观方式。

画回测结果或数据库里的成交

plot-dataframe 默认只画信号;要画实际成交点,需要提供成交来源:

# 画某次回测结果的成交(用回测导出文件) freqtrade plot-dataframe --strategy AwesomeStrategy \ --export-filename user_data/backtest_results/backtest-result.json -p BTC/USDT # 画 Dry-Run/实盘数据库里的成交 freqtrade plot-dataframe --strategy AwesomeStrategy \ --db-url sqlite:///tradesv3.dry_run.sqlite -p BTC/USDT --trade-source DB

缩放时间范围

数据太长图会卡,用 --timerange 缩放:

freqtrade plot-dataframe --strategy AwesomeStrategy -p BTC/USDT --timerange 20260801-20260805

四、plot_config:在策略里控制画什么

不想每次敲 --indicators1/2,在策略里写 plot_config 属性即可固化。它支持主图/副图分区、指定颜色、填充区间:

@property def plot_config(self): return { 'main_plot': { f'ema_{self.emashort.value}': {'color': 'red'}, f'ema_{self.emalong.value}': {'color': '#CCCCCC'}, 'sar': {}, }, 'subplots': { 'MACD': { 'macd': {'color': 'blue', 'fill_to': 'macdhist'}, 'macdsignal': {'color': 'orange'}, 'macdhist': {'type': 'bar'}, }, 'RSI': {'rsi': {'color': 'red'}}, }, }

要点:

  • main_plot:与价格同尺度的指标(均线、SAR、布林带)。
  • subplots:每个键是一个独立副图,可放多个指标。
  • fill_to / fill_color:填充两个指标之间的区域(如布林带、一目云)。
  • type:scatter(默认散点)或 bar(柱状,如 MACD 柱)。

💡 @property 而非类属性:写成 @property 才能在配置里引用 self.xxx.value 这类可优化参数的当前值;写成普通类属性访问不到参数实例。

五、布林带的特殊处理

如果 DataFrame 里有 bb_lowerbandbb_upperband 两列,plot-dataframe自动把它们画成主图上的浅蓝色填充带,无需在 plot_config 里显式声明。这是给经典布林带策略的便利。

六、plot-profit:资金曲线与回撤

plot-profit 画的是收益维度的图,而不是价格维度。它生成多张子图:

  1. 平均收盘价:所有交易对的均价走势,看大盘整体涨跌。
  2. 累计盈亏曲线:回测期间的累计利润,标注最大回撤的起止点。
  3. 按交易对的盈亏:哪个币贡献了利润、哪个拖后腿,揪出异常值。
  4. 并发持仓数:多少次「满仓」,辅助判断 max_open_trades 是否够。
  5. 水下曲线(Underwater):回撤期的深度与时长。
# 用回测结果画 freqtrade plot-profit -p LTC/BTC \ --export-filename user_data/backtest_results/backtest-result.json # 用数据库画 freqtrade plot-profit -p LTC/BTC \ --db-url sqlite:///tradesv3.sqlite --trade-source DB

💡 看资金曲线的姿势:别只看「最终赚多少」。重点看回撤段的形状——是平滑的小幅回撤(健康),还是突然深跌(可能踩了某个极端行情)?回撤持续多久?能不能扛得住心理压力?这些比总收益更能决定策略能不能上实盘。

七、Jupyter Notebook:更深度的分析

对于「想跑一段自定义分析代码」的场景,用 Jupyter 更灵活。freqtrade 在 freqtrade create-userdir 后会在 user_data/notebooks/ 放示例 notebook(如 strategy_analysis_example.ipynb),可以直接加载回测结果做 pandas 分析。

推荐工作流:

任务 工具
下载数据、跑回测、跑 Dry-Run CLI
重复性多步骤操作 Shell 脚本
自定义可视化、数据探索 Jupyter Notebook

Docker 用户可以用官方的 jupyter compose:docker compose -f docker/docker-compose-jupyter.yml up,在 https://127.0.0.1:8888/lab 访问。

⚠️ Notebook 的局限:涉及异步执行的代码(如下单)在 Notebook 里会有问题;freqtrade 主入口是 CLI,纯 Python 调用会绕过一些参数注入,需要手动构造对象。Notebook 适合「分析已生成的结果」,不适合「模拟运行策略」。

本节要点回顾

  1. list-data:盘点本地数据的币种/周期/类型;--show-timerange 看跨度,--trades 看逐笔;每次回测前先跑一遍。
  2. plot-dataframe:画 K 线 + 指标 + 信号 + 成交;--indicators1 主图、--indicators2 副图;--timerange 缩放。
  3. 图上标记:绿/红三角是「信号」、青圆点是「实际进场」、红/绿方块是亏/盈「实际出场」;对比三角与圆点数判断信号利用率。
  4. 成交来源:回测结果用 --export-filename,实盘/Dry-Run 用 --db-url ... --trade-source DB
  5. plot_config:策略内固化绘图配置;用 @property 才能引用可优化参数;布林带列会被自动画成填充带。
  6. plot-profit:资金曲线 + 按交易对盈亏 + 回撤 + 并发数 + 水下曲线;重点看回撤形状而非只看总收益。
  7. 维护模式:这两个命令不再积极维护,优先用 FreqUI;深度自定义分析用 Jupyter Notebook。

至此第 5 章结束。下一章(第 6 章)我们进入回测——把历史数据喂给策略,模拟它的表现,并诊断它有没有「作弊」。


发布者: 作者: 灏天文库 转发
评论区 (0)
U