交易对与 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}
]
}
处理流程:
- StaticPairList:从白名单加载初始交易对列表
- VolumePairList:按交易量排序,保留前 15 个
- AgeFilter:移除上市不足 3 天的交易对
- PerformanceFilter:按近期表现排序
- 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_assets | int | 20 | 保留的交易对数量 |
sort_key | string | quoteVolume | 排序字段 |
min_value | float | 0 | 最低成交量要求 |
refresh_period | int | 1800 | 刷新周期(秒) |
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