Linear Regression交易策略无效信号过滤优化方案咨询
基于线性回归的交易信号过滤优化需求
我用线性回归构建了多空交易信号,但无法过滤长趋势里的无效中间警报。试过RSI等指标,但不同时段信号不匹配,想找基于K线直接过滤的优化方案。
原代码
// Linear regression Candels signal_length_o = input.int(title="Signal Smoothing", minval = 1, maxval = 200, defval = 7, group="Humble LinReg Candles") sma_signal_o = input.bool(title="Simple MA (Signal Line)", defval=true, group="Humble LinReg Candles") lin_reg = input.bool(title="Lin Reg", defval=true, group="Humble LinReg Candles") linreg_length = input.int(title="Linear Regression Length", minval = 1, maxval = 200, defval = 5, group="Humble LinReg Candles") bopen = lin_reg ? ta.linreg(open, linreg_length, 0) : open bhigh = lin_reg ? ta.linreg(high, linreg_length, 0) : high blow = lin_reg ? ta.linreg(low, linreg_length, 0) : low bclose = lin_reg ? ta.linreg(close, linreg_length, 0) : close r = bopen < bclose signal_o = sma_signal_o ? ta.sma(bclose, signal_length_o) : ta.ema(bclose, signal_length_o) plotcandle(r ? bopen : na, r ? bhigh : na, r ? blow: na, r ? bclose : na, title="LinReg Candles", color=color.green, wickcolor=color.green, bordercolor=color.green, editable= true) plotcandle(r ? na : bopen, r ? na : bhigh, r ? na : blow, r ? na : bclose, title="LinReg Candles", color=color.red, wickcolor=color.red, bordercolor=color.red, editable= true) plot(signal_o, color=color.white) plotchar( signal_o[3] > signal_o[2] and // 3. K线 > 2. K线 signal_o[2] > signal_o[1] and // 2. K线 > 1. K线 signal_o[1] >= signal_o[0] and // 前一根信号 >= 当前信号 bopen < signal_o and // 开盘价 < 信号线 bopen[1] > bclose[1] and // 前一根K线收阴 bopen[0] < bclose[0] and // 当前K线收阳 not ta.cross(open[1], signal_o) and not ta.cross(low[1], signal_o) and not ta.cross(open, signal_o) and not ta.cross(low, signal_o) , "Buy", "O", location.bottom, color.lime, size = size.tiny) plotchar( signal_o[3] < signal_o[2] and // 3. K线 < 2. K线 signal_o[2] < signal_o[1] and // 2. K线 < 1. K线 signal_o[1] <= signal_o[0] and // 前一根信号 <= 当前信号 bopen > signal_o and // 开盘价 > 信号线 bopen[1] < bclose[1] and // 前一根K线收阳 bopen[0] > bclose[0] and // 当前K线收阴 not ta.cross(close[1], signal_o) and not ta.cross(high[1], signal_o) and not ta.cross(open, signal_o) and not ta.cross(high, signal_o) , "Sell", "O", location.top, color.red, size = size.tiny)
基于K线的过滤优化方案
1. 核心优化思路
从K线本身的趋势一致性、信号重复度、实体强度三个维度过滤无效信号,完全基于线性回归K线数据实现,无需依赖其他指标。
2. 优化后的代码示例
// Linear regression Candels 优化版 signal_length_o = input.int(title="Signal Smoothing", minval = 1, maxval = 200, defval = 7, group="Humble LinReg Candles") sma_signal_o = input.bool(title="Simple MA (Signal Line)", defval=true, group="Humble LinReg Candles") lin_reg = input.bool(title="Lin Reg", defval=true, group="Humble LinReg Candles") linreg_length = input.int(title="Linear Regression Length", minval = 1, maxval = 200, defval = 5, group="Humble LinReg Candles") // 新增过滤参数组 trend_length = input.int(title="趋势确认周期", minval=5, maxval=50, defval=20, group="过滤设置") filter_same_dir = input.bool(title="过滤同方向重复信号", defval=true, group="过滤设置") min_body_ratio = input.float(title="最小实体/平均实体比例", minval=0.5, maxval=3.0, defval=1.2, group="过滤设置") bopen = lin_reg ? ta.linreg(open, linreg_length, 0) : open bhigh = lin_reg ? ta.linreg(high, linreg_length, 0) : high blow = lin_reg ? ta.linreg(low, linreg_length, 0) : low bclose = lin_reg ? ta.linreg(close, linreg_length, 0) : close r = bopen < bclose signal_o = sma_signal_o ? ta.sma(bclose, signal_length_o) : ta.ema(bclose, signal_length_o) // 1. 长周期趋势一致性过滤 long_trend = ta.linreg(bclose, trend_length, 0) > ta.linreg(bclose, trend_length, 1) short_trend = ta.linreg(bclose, trend_length, 0) < ta.linreg(bclose, trend_length, 1) // 2. K线实体强度过滤 body_size = math.abs(bclose - bopen) avg_body_size = ta.sma(body_size, 10) strong_body = body_size >= avg_body_size * min_body_ratio // 3. 同方向信号去重 var int last_signal = 0 // 1=多头信号, -1=空头信号, 0=无信号 // 原始信号条件 + 过滤规则 final_buy = signal_o[3] > signal_o[2] and signal_o[2] > signal_o[1] and signal_o[1] >= signal_o[0] and bopen < signal_o and bopen[1] > bclose[1] and bopen[0] < bclose[0] and not ta.cross(open[1], signal_o) and not ta.cross(low[1], signal_o) and not ta.cross(open, signal_o) and not ta.cross(low, signal_o) and long_trend and // 匹配长周期多头趋势 strong_body and // 强实体确认反转力度 (not filter_same_dir or last_signal != 1) // 避免同方向重复信号 final_sell = signal_o[3] < signal_o[2] and signal_o[2] < signal_o[1] and signal_o[1] <= signal_o[0] and bopen > signal_o and bopen[1] < bclose[1] and bopen[0] > bclose[0] and not ta.cross(close[1], signal_o) and not ta.cross(high[1], signal_o) and not ta.cross(open, signal_o) and not ta.cross(high, signal_o) and short_trend and // 匹配长周期空头趋势 strong_body and // 强实体确认反转力度 (not filter_same_dir or last_signal != -1) // 避免同方向重复信号 // 更新最后信号状态 if final_buy last_signal := 1 elif final_sell last_signal := -1 // 绘图部分 plotcandle(r ? bopen : na, r ? bhigh : na, r ? blow: na, r ? bclose : na, title="LinReg Candles", color=color.green, wickcolor=color.green, bordercolor=color.green, editable= true) plotcandle(r ? na : bopen, r ? na : bhigh, r ? na : blow, r ? na : bclose, title="LinReg Candles", color=color.red, wickcolor=color.red, bordercolor=color.red, editable= true) plot(signal_o, color=color.white) plot(ta.linreg(bclose, trend_length, 0), color=color.blue, title="长周期趋势线") plotchar(final_buy, "Buy", "O", location.bottom, color.lime, size = size.tiny) plotchar(final_sell, "Sell", "O", location.top, color.red, size = size.tiny)
3. 优化说明
- 趋势一致性过滤:通过更长周期的线性回归趋势线确认当前信号与大方向一致,过滤逆势的无效反弹信号
- 实体强度过滤:仅保留实体大于近期平均实体一定比例的信号,过滤弱反转的假信号
- 同方向去重:记录上一次信号方向,避免在同一趋势内连续触发重复信号,减少长趋势中的中间警报
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

