大家好,我是 Lucifer,又来聊聊 Web3 的那些有趣事儿了。今天咱们来聊聊 Freqtrade。
上一篇我们从零搭好了 Freqtrade,写了个最简单的 SMA 交叉策略。很多人跑完回测后跟我说:“这策略也太简单了,实盘根本扛不住。”
说得对。那篇是入门用的“Hello World”。真正能活下来的策略,从来不是依赖某一个“神级指标”,而是把一堆看起来不怎么样的弱信号,用正确的方式组合起来。
今天这篇是正式续篇。我们会把「组合弱信号」这个核心思想,落地成一个能直接在 Freqtrade 里跑的策略。
先补一点前置知识
在写策略之前,先把两个最基础的概念说清楚。
1. 什么是信号?
信号不是“我觉得这个币要涨”这种模糊感觉,而是一个可量化、有方向、可重复的数据点。比如:
- RSI 从 30 以下回升
- 快线上穿慢线
- 成交量放大到均线的 1.3 倍
这些都是信号。单个信号通常很弱,准确率往往只有 50% 多一点点。
2. dataframe.loc 是干什么的?
Freqtrade 策略的核心是一张表格(DataFrame),每一行是一根 K 线,每一列是价格或指标。
dataframe.loc[条件, 列名] = 值 的意思是:
找到符合条件的那些 K 线,给它们打上标记。
比如:
1 | dataframe.loc[ |
这句话的意思就是:“凡是 RSI 低于 30 且有成交量的 K 线,都标记为可以买入。”
后面所有买卖逻辑,本质上都是在用 .loc 给不同的行打分或打标记。
为什么要组合多个弱信号?
单一信号最大的问题是:它大部分时候都是错的。
量化里把单个信号的准确度叫 IC(Information Coefficient)。机构级信号的 IC 通常只有 0.05~0.15,意思是它跟市场真实走势的相关性非常弱。
但主动管理基本定律告诉我们:
IR = IC × √N
系统整体表现 = 单个信号准确度 × 独立信号数量的平方根。
所以,与其苦苦寻找一个“永远正确”的神级信号,不如收集几十个“稍微有点准”的弱信号,然后把它们正确地组合起来。噪音会互相抵消,优势会叠加。
这就是今天策略的核心思路。
策略思路
我们不追求某一个指标特别准,而是让多个弱信号一起“投票”。
具体做法:
- 选取 6 个相关性较低的常见信号(动量、均值回归、成交量、趋势强度等)。
- 每个信号根据自己的条件给当前 K 线打分(有的 +1,有的 +2)。
- 把所有分数加总,得到一个综合置信度分数。
- 只有当综合分数达到设定阈值时,才允许开仓。
- 出场逻辑反过来,用反向信号打分,达到阈值就平仓。
这样做的好处是:
- 不再要求所有条件同时成立(那会让信号极少)。
- 不同信号可以有不同权重(比如 RSI 回升给 2 分,普通交叉只给 1 分)。
- 噪音被分散,真正有优势的时刻更容易被识别出来。
这已经是文章里“组合引擎”思想的简化落地版。真正的机构还会做去均值、正交化、残差加权等更复杂的步骤,但对我们现阶段来说,评分投票已经足够体现核心逻辑。
完整策略代码(辅助参考)
把下面代码保存为 user_data/strategies/MultiSignalScore.py 即可:
1 | from freqtrade.strategy import IStrategy, IntParameter |
怎么跑起来
下载数据后执行回测:
1 | freqtrade backtesting --strategy MultiSignalScore --timerange 20240701-20250701 --export trades |
想优化阈值参数,可以用:
1 | freqtrade hyperopt --strategy MultiSignalScore --hyperopt-loss SharpeHyperOptLoss --spaces buy sell --epochs 100 |
总结
一个现实中真正可用的策略基本就是按照这个方式去叠加信号, 给不同信号分配不同的权重等等。
量化最反直觉的一点是:你越执着于寻找“永远正确”的信号,你就越容易亏钱。真正能持续活下来的人,都在默默收集那些“稍微有点准”的弱信号,然后用数学把它们拧成一股绳。





















