Skip to content

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 种模式:

  1. Backtesting(离线回测)
  2. Dry-run(Testnet 模拟)✅
  3. 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

然后在浏览器打开