4. 逻辑回归与分类策略:从概率到交易信号
逻辑回归,这个名字其实挺有迷惑性的。它名字里带个「回归」,干的却是分类的活。说白了,就是用来回答「是或否」的问题——比如明天股价是涨还是跌?
我个人习惯把逻辑回归看作线性回归的「升级版」。线性回归输出的是一个连续值,比如预测股价是10.5元。但很多时候,我们只需要知道「涨」还是「跌」,这时候就需要把连续值映射到0和1之间。嗯,这就是Sigmoid函数登场的地方。
4.1 Sigmoid函数:把数值压成概率
Sigmoid函数的数学表达式很简单:
σ(z) = 1 / (1 + e^(-z))
它的输出范围是(0, 1)。当z趋近正无穷时,输出趋近1;当z趋近负无穷时,输出趋近0。z=0时,输出正好是0.5。
我在项目中遇到过一个问题:直接用线性回归预测涨跌,结果经常出现大于1或小于0的「概率」,这显然不合理。Sigmoid函数完美解决了这个问题——它把任何实数输入都压缩到0到1之间,天然适合做概率输出。
核心理解:逻辑回归 = 线性回归 + Sigmoid激活函数。线性部分负责「打分」,Sigmoid负责把分数转成概率。
你想想看,如果线性回归的输出是z = w·x + b,那么逻辑回归的输出就是:
P(y=1|x) = 1 / (1 + e^(-(w·x + b)))
这个P值就是模型预测的「上涨概率」。我们通常设定一个阈值,比如0.5,大于阈值就预测上涨,小于阈值就预测下跌。
4.2 二分类交易信号生成
有了概率,怎么生成交易信号?这里有个常见的坑——我曾经以为概率大于0.5就买入,小于0.5就卖出,结果回测亏得一塌糊涂。
为什么?因为市场不是非黑即白的。概率0.51和0.49其实差别不大,但按0.5阈值一刀切,交易信号会非常频繁,手续费都能吃掉大部分收益。
避坑指南:我曾经用0.5作为阈值,回测结果惨不忍睹。后来改用双阈值策略——概率大于0.7才买入,小于0.3才卖出,中间区域不操作。效果好了很多。
信号生成逻辑可以这样设计:
if prob > upper_threshold:
signal = 1 # 买入
elif prob < lower_threshold:
signal = -1 # 卖出
else:
signal = 0 # 持仓不动
阈值怎么选?我建议用滚动窗口的分位数。比如取过去60天预测概率的70%分位数作为上阈值,30%分位数作为下阈值。这样阈值会自适应市场状态的变化。
4.3 回测框架搭建
搭建回测框架,说白了就是模拟真实交易。我习惯用事件驱动的方式,按时间顺序逐根K线处理。
一个最小可用的回测框架需要这几个组件:
- 数据模块:加载历史行情数据,包括开盘价、收盘价、最高价、最低价、成交量等
- 信号模块:用训练好的逻辑回归模型生成交易信号
- 执行模块:模拟下单,考虑滑点和手续费
- 风控模块:控制仓位、设置止损止盈
- 绩效模块:计算收益率、夏普比率、最大回撤等指标
我给大家看一个简化版的回测代码框架:
class BacktestEngine:
def __init__(self, data, model, initial_capital=100000):
self.data = data
self.model = model
self.capital = initial_capital
self.position = 0
self.trades = []
def run(self):
for i in range(len(self.data)):
# 生成特征
features = self._extract_features(i)
# 预测概率
prob = self.model.predict_proba(features)[:, 1]
# 生成信号
signal = self._generate_signal(prob)
# 执行交易
self._execute(signal, i)
# 每日风控检查
self._risk_control(i)
# 计算绩效
return self._calculate_performance()
个人经验:回测框架一定要考虑「未来函数」。我刚开始做回测时,不小心用到了未来数据,回测曲线漂亮得像假的一样。后来养成了习惯——每次生成特征时,只用当前时刻之前的数据。
4.4 知识体系总览
下面这张图展示了本章的核心逻辑:
4.5 实战中的注意事项
逻辑回归虽然简单,但用好了威力不小。我总结了几点经验:
| 环节 | 常见问题 | 我的解决方案 |
|---|---|---|
| 特征选择 | 特征太多导致过拟合 | 用L1正则化做特征筛选,保留最重要的5-10个特征 |
| 样本不平衡 | 上涨和下跌样本数量悬殊 | 使用SMOTE过采样,或者调整类别权重 |
| 阈值设定 | 固定阈值不适应市场变化 | 用滚动分位数动态调整阈值 |
| 过拟合 | 回测漂亮,实盘拉胯 | 做交叉验证,用样本外数据验证 |
核心要点:逻辑回归不是万能的,但它胜在可解释性强。你能清楚地知道每个特征对预测结果的影响权重。这在量化交易中非常重要——你总得知道模型为什么做出某个决策。
嗯,逻辑回归这部分就讲到这里。记住一点:模型再复杂,最终都要落到「能不能赚钱」这个核心问题上。回测框架就是验证这个问题的工具,一定要搭建得扎实。