交易对与 Pairlists

本章详细介绍 Freqtrade 的 Pairlists 机制,涵盖静态列表、动态排序、多种过滤器以及自定义 Pairlist 的开发,帮助读者灵活配置交易对的筛选和排序策略。

Pairlists 概述

什么是 Pairlists

Pairlists 是 Freqtrade 中管理和筛选交易对的机制。它定义了一组交易对以及它们的处理顺序。Freqtrade 会根据配置的 Pairlists 链来决定交易哪些币种以及优先级。

Pairlist 处理链

Pairlists 以链式管道(pipeline)方式工作,每个环节对交易对列表进行增删或排序:

{
    "pairlists": [
        {"method": "StaticPairList"},
        {"method": "VolumePairList", "number_assets": 15},
        {"method": "AgeFilter", "min_days_listed": 3},
        {"method": "PerformanceFilter"},
        {"method": "PriceFilter", "low_price_ratio": 0.01}
    ]
}

处理流程:

  1. StaticPairList:从白名单加载初始交易对列表
  2. VolumePairList:按交易量排序,保留前 15 个
  3. AgeFilter:移除上市不足 3 天的交易对
  4. PerformanceFilter:按近期表现排序
  5. PriceFilter:移除价格过低的交易对

静态 Pairlist

StaticPairList

exchange.pair_whitelist 中加载指定的交易对:

{
    "exchange": {
        "pair_whitelist": [
            "BTC/USDT",
            "ETH/USDT",
            "SOL/USDT",
            "BNB/USDT",
            "ADA/USDT",
            "DOT/USDT",
            "AVAX/USDT",
            "LINK/USDT"
        ],
        "pair_blacklist": [
            "TETHER/USDT",
            "USDC/USDT",
            ".*/BUSD",
            ".*/USDC",
            ".*BULL.*",
            ".*BEAR.*"
        ]
    },
    "pairlists": [
        {"method": "StaticPairList"}
    ]
}

白名单与黑名单

配置项说明示例
pair_whitelist可交易的币种列表["BTC/USDT", "ETH/USDT"]
pair_blacklist排除的币种(支持正则)[".*/BUSD", ".*BULL.*"]
正则匹配黑名单支持正则表达式".*DOWN.*" 排除所有杠杆代币

黑名单正则示例

{
    "pair_blacklist": [
        ".*UP$",           // 排除杠杆上涨代币
        ".*DOWN$",         // 排除杠杆下跌代币
        ".*BULL$",
        ".*BEAR$",
        ".*[0-9]{1,3}S$",  // 排除某类特定命名的代币
        "ETHUP/USDT",      // 精确排除某个交易对
        ".*/BUSD",         // 排除所有 BUSD 交易对
        "USDT/USDT",       // 排除稳定币兑换
        "TUSD/USDT",
        "USDC/USDT"
    ]
}

动态 Pairlist

VolumePairList

按交易量排序,只保留交易量最大的前 N 个交易对:

{
    "pairlists": [
        {
            "method": "VolumePairList",
            "number_assets": 20,
            "sort_key": "quoteVolume",
            "min_value": 1000000,
            "refresh_period": 1800
        }
    ]
}
参数类型默认值说明
number_assetsint20保留的交易对数量
sort_keystringquoteVolume排序字段
min_valuefloat0最低成交量要求
refresh_periodint1800刷新周期(秒)

ProducerPairList

在多机器人架构中,从"生产者"机器人获取活跃交易对:

{
    "pairlists": [
        {
            "method": "ProducerPairList",
            "number_assets": 10,
            "producers": ["producer1", "producer2"]
        }
    ]
}

RemotePairList

从远程 API 获取交易对列表:

{
    "pairlists": [
        {
            "method": "RemotePairList",
            "number_assets": 20,
            "pairlist_url": "https://api.example.com/pairlist",
            "bearer_token": "your_token",
            "refresh_period": 1800,
            "keep_pairlist_on_error": true
        }
    ]
}

过滤器 (Filters)

按市值过滤 (MarketCapFilter)

需要安装 CoinGecko 依赖:

pip install "freqtrade[coingecko]"
{
    "pairlists": [
        {"method": "StaticPairList"},
        {
            "method": "MarketCapFilter",
            "min_marketcap": 100000000,
            "max_marketcap": 50000000000
        }
    ]
}

按价格过滤 (PriceFilter)

{
    "pairlists": [
        {"method": "StaticPairList"},
        {
            "method": "PriceFilter",
            "low_price_ratio": 0.001,
            "high_price_ratio": 0.99,
            "min_price": 0.00000001,
            "max_price": 100000
        }
    ]
}
参数说明示例
low_price_ratio移除低于均值价格一定比例的交易对0.001
high_price_ratio移除高于均值价格一定比例的交易对0.99
min_price最低绝对价格0.00000001
max_price最高绝对价格100000

按上市时间过滤 (AgeFilter)

移除上市时间过短的交易对,避免操纵风险:

{
    "pairlists": [
        {"method": "StaticPairList"},
        {
            "method": "AgeFilter",
            "min_days_listed": 10,
            "max_days_listed": 0
        }
    ]
}
参数说明
min_days_listed最小上市天数(必填)
max_days_listed最大上市天数(0 表示无限制)

按表现过滤 (PerformanceFilter)

根据交易对的历史表现进行排序:

{
    "pairlists": [
        {"method": "StaticPairList"},
        {"method": "PerformanceFilter"}
    ]
}

PerformanceFilter 会根据该交易对在机器人中的历史交易表现(总利润)进行排序,表现最好的排在最前面。

按波动性过滤 (VolatilityFilter)

移除波动性过低的交易对:

{
    "pairlists": [
        {"method": "StaticPairList"},
        {
            "method": "VolatilityFilter",
            "lookback_days": 10,
            "min_volatility": 0.02,
            "max_volatility": 0.10
        }
    ]
}
参数说明建议值
lookback_days回溯天数10-30
min_volatility最低波动率0.02-0.05
max_volatility最高波动率0.08-0.20

SpreadFilter

移除买卖价差过大的交易对:

{
    "pairlists": [
        {"method": "StaticPairList"},
        {
            "method": "SpreadFilter",
            "max_spread_ratio": 0.005
        }
    ]
}
参数说明默认值
max_spread_ratio最大允许价差比例0.005 (0.5%)

RangeStabilityFilter

移除价格在限定范围内波动不足的交易对:

{
    "pairlists": [
        {"method": "StaticPairList"},
        {
            "method": "RangeStabilityFilter",
            "lookback_days": 10,
            "min_rate_of_change": 0.01,
            "refresh_period": 1440
        }
    ]
}

过滤器链组合示例

{
    "pairlists": [
        // 第一步:从白名单开始
        {"method": "StaticPairList"},

        // 第二步:按 24h 交易量排序,保留前 50
        {
            "method": "VolumePairList",
            "number_assets": 50
        },

        // 第三步:移除稳定币交易对
        {
            "method": "PriceFilter",
            "low_price_ratio": 0.001
        },

        // 第四步:移除价差过大的
        {
            "method": "SpreadFilter",
            "max_spread_ratio": 0.005
        },

        // 第五步:移除上市不足 7 天的
        {
            "method": "AgeFilter",
            "min_days_listed": 7
        },

        // 第六步:只保留高市值币种
        {
            "method": "MarketCapFilter",
            "min_marketcap": 500000000
        },

        // 第七步:移除低波动币种
        {
            "method": "VolatilityFilter",
            "lookback_days": 10,
            "min_volatility": 0.03
        }
    ]
}

过滤器对比表

过滤器作用数据源推荐位置
StaticPairList加载白名单配置文件链首
VolumePairList按成交量排序交易所 API链首/中
PriceFilter价格范围过滤交易所 API链中
SpreadFilter价差过滤订单簿链中
AgeFilter上市时间交易所 API链中
PerformanceFilter历史表现排序本地数据库链尾
VolatilityFilter波动率过滤历史 K 线链中
MarketCapFilter市值过滤CoinGecko链中
RangeStabilityFilter稳定性过滤历史数据链尾
ProducerPairList生产者同步外部实例链首

自定义 Pairlist

开发自定义 Pairlist Handler

from freqtrade.pairlist import IPairList
from freqtrade.pairlist.IPairList import PairlistParameter
from pandas import DataFrame

class MyCustomPairList(IPairList):
    """
    自定义 Pairlist:排除过去 N 天内价格下跌超过 X% 的交易对
    """

    def __init__(self, exchange, pairlistmanager, config, pairlistconfig, pairlist_pos):
        super().__init__(exchange, pairlistmanager, config, pairlistconfig, pairlist_pos)

        # 从配置读取自定义参数
        self.lookback_days = pairlistconfig.get("lookback_days", 7)
        self.max_loss_pct = pairlistconfig.get("max_loss_pct", -15)

    @property
    def needstickers(self) -> bool:
        return False

    def short_desc(self) -> str:
        return f"MyCustomPairList - lookback={self.lookback_days}d, max_loss={self.max_loss_pct}%"

    @staticmethod
    def description() -> str:
        return "排除近期表现不佳的交易对"

    def gen_pairlist(self, tickers: dict) -> list:
        # 从 whitelist 开始
        pairlist = self.whitelist
        return pairlist

    def filter_pairlist(self, pairlist: list, tickers: dict) -> list:
        filtered = []
        for pair, data in pairlist:
            # 获取历史数据
            candles = self.dp.get_pair_dataframe(pair, self.config["timeframe"])

            if candles is not None and len(candles) > self.lookback_days:
                # 计算过去 N 天的变化率
                old_close = candles["close"].iloc[-self.lookback_days]
                current_close = candles["close"].iloc[-1]
                change_pct = (current_close - old_close) / old_close * 100

                # 如果跌幅超过阈值,则跳过
                if change_pct <= self.max_loss_pct:
                    self.log_once(f"排除 {pair}{self.lookback_days}天跌幅 {change_pct:.1f}%")
                    continue

            filtered.append((pair, data))

        return filtered

使用自定义 Pairlist

{
    "pairlists": [
        {"method": "StaticPairList"},
        {
            "method": "MyCustomPairList",
            "lookback_days": 14,
            "max_loss_pct": -20
        }
    ]
}

高级技巧

多 Pairlist 链的分段配置

{
    "pairlists": [
        // 第一段:从全市场筛选出高风险偏好的币种
        {"method": "VolumePairList", "number_assets": 200},
        {"method": "VolatilityFilter", "min_volatility": 0.05},

        // 第二段:进一步缩小范围
        {"method": "VolumePairList", "number_assets": 20},
        {"method": "PriceFilter", "low_price_ratio": 0.01},

        // 第三段:按性能排序
        {"method": "PerformanceFilter"}
    ]
}

动态调整策略

你可以在策略中根据市场状态动态调整 Pairlist:

def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    # 获取当前所有交易对的性能
    performance = self.dp.get_performance()
    top_pairs = [p["pair"] for p in performance[:5]]

    # 记录当前活跃交易对
    self.logger.info(f"当前关注交易对: {top_pairs}")

    return dataframe