Freqtrade
适合 Testnet 可视化的项目(开源 + 实用)
| 名称 | 简介 | 可视化方式 | 是否支持 Binance Testnet | 语言 / 框架 | 链接 |
|---|---|---|---|---|---|
| Freqtrade ⭐️ | ✅ 最知名的开源量化交易框架,内置回测、模拟、实盘。支持 Binance Testnet。 | Web UI(实时净值、仓位、信号图) | ✅ 支持 | Python / FastAPI + Plotly | github.com/freqtrade/freqtrade |
| Backtrader + Backtrader Plot | 强大的 Python 回测框架,可扩展到实时数据。 | Matplotlib 图形可视化 | ❌(原生不支持 Testnet,但可集成 CCXT) | Python | github.com/mementum/backtrader |
| QuantConnect Lean | 专业级量化引擎(同 QuantConnect 平台),支持可视化分析与实时回测。 | 内置网页 Dashboard | ⚠️(主要对接自家 API,不支持 Binance Testnet) | C# / Python | github.com/QuantConnect/Lean |
| Jesse AI | 实时交易 + 策略开发 + Web 可视化界面。 | 完整 Web 仪表盘(含净值曲线、信号) | ✅ Binance Testnet 支持 | Python / Vue.js | github.com/jesse-ai/jesse |
| GNOME Trader | 桌面客户端风格交易终端,可连接 Binance API。 | 图形化(K线+交易) | ✅ Testnet 可配置 | Python / Qt | github.com/gnometerminal/gnometrader |
Freqtrade 支持 3 种模式:
- Backtesting(离线回测)
- Dry-run(Testnet 模拟)✅
- Live(真实交易)
安装
pip install freqtrade
检查 freqtrade -V
创建默认配置
freqtrade new-config --config config.json
在你的 config.json 中找到 "exchange" 部分,改成如下内容:
"exchange": {
"name": "binance",
"key": "你的_testnet_API_KEY",
"secret": "你的_testnet_API_SECRET",
"sandbox": true,
"ccxt_config": {
"enableRateLimit": true
},
"ccxt_async_config": {
"enableRateLimit": true
}
}
✅ 注意:
"sandbox": true→ 启用 Binance Testnet 模式;- 确保 Testnet API Key 正确
Freqtrade 期望你有一个 “user_data” 文件夹(用于存放策略、日志、数据库、配置等),但现在没有
freqtrade create-userdir --userdir user_data
安装 UI
freqtrade install-ui
在config里设置用户名密码
"api_server": {
"username": "freqtrader",
"password": "freqtrader"
},
启动
freqtrade webserver
如果你在云服务器运行(例如 AWS、VPS),可使用:
freqtrade webserver --host 0.0.0.0 --port 8080
创建策略
创建一个新策略模板:
freqtrade new-strategy --strategy MyFirstStrategy
它会在 user_data/strategies/MyFirstStrategy.py 生成模板。
策略结构
一个最基本的策略包含以下几个函数:
from freqtrade.strategy.interface import IStrategy
from pandas import DataFrame
import talib.abstract as ta
class MyFirstStrategy(IStrategy):
timeframe = '5m' # K线周期
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe['rsi'] = ta.RSI(dataframe)
dataframe['ema'] = ta.EMA(dataframe, timeperiod=20)
return dataframe
def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe.loc[
(dataframe['rsi'] < 30) & (dataframe['close'] > dataframe['ema']),
'buy'] = 1
return dataframe
def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe.loc[
(dataframe['rsi'] > 70),
'sell'] = 1
return dataframe
回测(Backtesting)
获取历史数据:
freqtrade download-data --exchange binance --pairs BTC/USDT --timeframe 5m --days 30
- 指定交易所从 Binance(币安)获取数据
- 下载所有以 USDT 为计价的交易对(如 BTC/USDT、ETH/USDT)
- 下载 5分钟K线 数据
- 下载最近 30天 的历史数据
--erase重新下载数据
Freqtrade 会去 Binance 获取以下类似数据:
| 时间 | 开盘价 | 最高价 | 最低价 | 收盘价 | 成交量 |
|---|---|---|---|---|---|
| 2025-09-05 00:00 | 62000 | 62100 | 61800 | 61950 | 1.25 |
| 2025-09-05 00:05 | 61950 | 62020 | 61900 | 61990 | 0.98 |
数据会被保存到本地路径:
user_data/data/binance/
并且每个交易对都会有一个 .json.gz 文件,比如:
user_data/data/binance/BTC_USDT-5m.json.gz
显示数据
freqtrade list-data --show-timerange
运行回测:
在 config.json 修改成 StaticPairList
"pairlists": [
{
"method": "StaticPairList",
"number_assets": 20,
"sort_key": "quoteVolume",
"min_value": 0,
"refresh_period": 1800
}
],
然后添加币种白名单
"exchange": {
"name": "binance",
"pair_whitelist": [
"BTC/USDT"
],
}
然后运行
freqtrade backtesting --strategy MyFirstStrategy
--timerange 20250101-20251001加入时间
查看结果:
Freqtrade 会输出:
- 总收益率
- 胜率
- 最大回撤
- 每笔交易详情
也可生成图表报告:
freqtrade backtesting --strategy MyFirstStrategy --export trades
freqtrade plot-dataframe --strategy MyFirstStrategy
结果解读
| 指标 | 数值 | 含义 |
|---|---|---|
| 总交易数(Trades) | 8 | 共进行了 8 次买卖 |
| 胜率(Win%) | 25% | 只有 2 次盈利、6 次亏损 |
| 平均收益(Avg Profit %) | 0.36% | 每笔交易平均赚 0.36%(包含亏损) |
| 总收益(Tot Profit %) | +0.93% | 账户整体收益率 |
| 总盈利(Tot Profit USDT) | +9.298 USDT | 初始 1000 USDT,最后 1009.298 USDT |
| 年化收益(CAGR) | 12.35% | 按年折算的理论收益率 |
| 最大回撤(Max Drawdown) | -1.4% | 最大账户回撤(从最高点到最低点的跌幅) |
| 夏普比率(Sharpe) | 0.89 | 衡量风险调整后的收益(>1 较好) |
| 索提诺比率(Sortino) | 3.21 | 类似夏普,但只考虑下行风险(这个偏高不错) |
收益结构分析
| 项目 | 说明 | 结果 |
|---|---|---|
| 最佳交易 | 一次盈利最高的交易 | +5% |
| 最差交易 | 一次亏损最多的交易 | -1.73% |
| 最长持仓时间 | 4天5小时 | 说明策略交易节奏慢 |
| 平均持仓时间 | 约 1.5 天 | 属于中短线策略 |
| 最大连续亏损 | 5 次 | 表示信号可靠性较低 |
| 退出方式 | ROI 退出 1 次;信号退出 7 次 | 大多数交易由策略信号触发退出 |
Dry-run(模拟实盘交易)
Dry-run = 模拟实盘交易
- 机器人会实时连接交易所(如 Binance)
- 使用真实市场行情(K线、价格)
- 根据你的策略逻辑买入/卖出
- 记录交易结果、打印日志、保存报告
- 🚫 不会真花钱、不会发出订单
💡 可以理解为:
“实盘前的全功能模拟”。
开启 Dry-run 的方法
Freqtrade 默认配置文件是支持 Dry-run 的。
只需要确保在 config.json 中这几项设置正确👇
编辑文件:
user_data/config.json
找到并修改这几项:
{
"dry_run": true,
"max_open_trades": 3,
"stake_currency": "USDT",
"stake_amount": 100,
"exchange": {
"name": "binance",
"key": "YOUR_API_KEY",
"secret": "YOUR_API_SECRET"
},
"pairlists": [
{ "method": "StaticPairList" }
],
"pair_whitelist": [
"BTC/USDT"
]
}
🔹 关键项解释:
| 参数 | 含义 | 示例 |
|---|---|---|
"dry_run": true |
✅ 启用模拟交易(不真实下单) | true |
"stake_currency": "USDT" |
交易计价货币 | USDT |
"stake_amount": 100 |
每次交易使用的资金 | 100 USDT |
"exchange.key" / "exchange.secret" |
你的交易所 API Key | 可以留空(Dry-run 不会下单) |
启动
freqtrade trade --strategy DoubleEMAStrategy
监控 Dry-run 的运行情况
1. 查看实时日志
在终端中会实时显示交易记录,例如:
BUY signal: BTC/USDT - price: 62750.0
SELL signal: BTC/USDT - profit: +2.3%
2. 启动 Web UI(可视化界面)
Freqtrade 自带 Web 控制台 👇
freqtrade webserver
然后在浏览器打开