第 5 章 · 03 数据分析与绘图 本节摘要:本节讲清 freqtrade 的三个数据可视化工具。先用 盘点本地已有哪些币种、周期、类型的数据(顺便看时间跨度)。再用 把 K 线、指标、买卖信号、实际成交点画在同一张交互图上——绿色三角是入场信号、红色三角是出场信号、青色圆点是实际进场、红/绿方块是亏/盈出场,一眼看清策略「在哪买、在哪卖、信号有没有转化成真实成交」。最后用 画资金曲线、按交易对的盈亏分布、回撤区间和并发持仓数,从收益维度评估策略。本节也会提到:这两个绘图命令官方已标记为「维护模式」,新项目推荐用 FreqUI 的网页交互图替代。 内容来源:原项目文档 、 ,汉化并套用体系化模板。
本节摘要:本节讲清 freqtrade 的三个数据可视化工具。先用
list-data盘点本地已有哪些币种、周期、类型的数据(顺便看时间跨度)。再用plot-dataframe把 K 线、指标、买卖信号、实际成交点画在同一张交互图上——绿色三角是入场信号、红色三角是出场信号、青色圆点是实际进场、红/绿方块是亏/盈出场,一眼看清策略「在哪买、在哪卖、信号有没有转化成真实成交」。最后用plot-profit画资金曲线、按交易对的盈亏分布、回撤区间和并发持仓数,从收益维度评估策略。本节也会提到:这两个绘图命令官方已标记为「维护模式」,新项目推荐用 FreqUI 的网页交互图替代。
内容来源:原项目文档
docs/data-analysis.md、docs/plotting.md,汉化并套用体系化模板。
阅读完本节,你应当能够:
回测和绘图前,先确认本地数据齐不齐。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-dataframe 和 plot-profit 依赖 Plotly,不在默认依赖里,需要单独装:
pip install -U -r requirements-plot.txt
⚠️ 维护模式:官方文档明确说这两个命令处于「维护模式」——中大规模数据绘图性能差、「存文件再开浏览器」的交互也不直观。短期内不会删除,但也不再积极维护。新项目优先用 FreqUI 的网页交互图,它没有同样的性能问题。本节仍讲这两个命令,因为它们在没有运行实例时也能离线分析回测结果。
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
不想每次敲 --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_lowerband 和 bb_upperband 两列,plot-dataframe 会自动把它们画成主图上的浅蓝色填充带,无需在 plot_config 里显式声明。这是给经典布林带策略的便利。
plot-profit 画的是收益维度的图,而不是价格维度。它生成多张子图:
max_open_trades 是否够。# 用回测结果画 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 更灵活。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 适合「分析已生成的结果」,不适合「模拟运行策略」。
--show-timerange 看跨度,--trades 看逐笔;每次回测前先跑一遍。--indicators1 主图、--indicators2 副图;--timerange 缩放。--export-filename,实盘/Dry-Run 用 --db-url ... --trade-source DB。@property 才能引用可优化参数;布林带列会被自动画成填充带。至此第 5 章结束。下一章(第 6 章)我们进入回测——把历史数据喂给策略,模拟它的表现,并诊断它有没有「作弊」。