先给结论:交易指标本质上只是一组数学变换,MACD 是均线差,RSI 是涨跌均值比,BOLL 是标准差通道。这些变换本身不包含任何“市场观点”,更不包含“未来走势”。但在大量交易系统和量化脚本里,指标经常被当成一种“确定性的买卖指令”来使用——金叉就买,死叉就卖,超卖就抄底。问题恰恰出在这里:同一个金叉信号,在趋势行情里可能是机会,在震荡行情里可能正好是反向陷阱;同一个超卖读数,在下跌趋势里可能只是下跌中继。
本文是“构建系统”系列的第三篇。前两篇侧重系统整体架构和交易哲学层面的顶层设计,这一篇专门解决一个非常关键的衔接问题:在你准备写指标、调参数、跑回测之前,你的交易认知是否已经安装到位。换句话说,你有没有想清楚“指标输出什么、信号在什么前提下有效、系统在什么条件下会失效”这三个问题。如果这三个问题没有答案,那么后续的指标计算、策略回测、参数优化,本质上都是在同一个错误认知上叠加更多噪声。
下面我会先用一个问题说明为什么很多人的指标策略会反复失效,然后给出一个可以落地的认知框架,最后用一组 Python 代码把“认知过滤层”直接写进策略逻辑里,让你直观看到同样的 MACD 信号,加不加认知过滤,回测结果会差多少。
1. 这篇文章真正要解决的问题
很多新人在进入量化交易或者程序化交易这个领域时,第一个动作通常是装一个 TA-Lib,然后把 MACD、RSI、KDJ、BOLL 一次性全部算出来,再把金叉死叉直接映射成交易信号。这个过程本身没有错,错的是对信号的解释方式。当你把“指标输出”直接等同于“交易指令”,你已经跳过了最关键的决策环节:当前市场处于什么状态,这个状态适不适合用这类指标,信号失效时应该怎么办。
这个问题可以拆成三个层面:
- 第一层,市场状态识别。随便找一只股票过去一年的日线数据,你会发现行情至少包含三种状态:单边趋势、区间震荡、趋势转折初期的混沌期。用同一套指标参数在这三种状态上反复交易,结果通常是趋势里赚的钱在震荡里亏回去,震荡里的微利又不足以覆盖趋势回撤。
- 第二层,信号语义理解。MACD 金叉的本质是快线从下方穿越慢线,它描述的是“过去一段时间内价格动量发生变化”,而不是“未来一定上涨”。RSI 超卖描述的是“最近跌幅在统计上显著”,而不是“马上要反弹”。指标只能告诉你历史统计特征,不承担预测未来的义务。
- 第三层,系统失效保护。任何进场信号都可能是错的。如果你的系统只设计了进场逻辑,没有设计退出逻辑、仓位逻辑和失效判定,那么再精妙的指标也救不了这个系统。
所以本文最核心的结论是:正确交易认知是用好指标做交易的前提,而这个认知在代码层面必须体现为“前置过滤层”。它不是一种模糊的心态,也不是交易时的心理素质,而是你在数据流中,在信号生成之前,插入的那一道状态判断和风险判断逻辑。
如果你正在搭建自己的第一版指标交易系统,或者你已经有信号逻辑但回测结果反复不稳定,这篇文章会帮你定位到问题的真正源头。
2. 交易指标的基础认知与常见误区
2.1 指标到底在算什么
技术分析指标可以粗分为四类:
| 类别 | 代表指标 | 计算基础 | 核心用途 |
|---|---|---|---|
| 趋势类 | MACD、均线系统 | 收盘价的移动平均及差值 | 捕捉趋势方向和趋势变化 |
| 动量类 | RSI、KDJ、随机指标 | 一段时间内涨跌幅比例 | 衡量价格运动的强弱程度 |
| 波动率类 | BOLL、ATR | 均线、标准差、真实波幅 | 描述价格波动区间和风险 |
| 量价类 | OBV、量比 | 成交量与价格方向 | 判断资金参与程度 |
这四类指标都不是预测工具,而是描述工具。MACD 描述的是两条均线之间的距离变化,RSI 描述的是最近一段时间内上涨力量和下跌力量的相对大小,BOLL 描述的是价格相对于均值偏离了几个标准差。你可以把它们理解为一种压缩和可视化,帮助人眼快速识别价格行为,但它们本身不含有“明天上涨”的信息。
2.2 三个最典型的认知误区
在实践中最常见的认知误区有三个,我把它们列成表格,方便对照检查自己是不是也踩过:
| 误区 | 错误认知 | 正确认知 |
|---|---|---|
| 指标有确定信号 | 金叉就是买入信号,死叉就是卖出信号 | 金叉只是说“动量方向改变的概率增加”,还需要匹配当前市场状态 |
| 指标越多越好 | 同时叠加 MACD、RSI、KDJ 能互相验证 | 很多指标由同一个收盘价推导而来,高度相关,叠加后不仅不增加信息,反而制造决策冲突 |
| 指标能自适应行情 | 参数设置好之后可以一直用 | 市场状态切换后,同一组参数的有效性会显著下降,需要重新验证 |
2.3 为什么同一个指标有时灵有时不灵
答案不在指标,在市场状态。举一个具体的例子,MACD 在单边趋势行情里非常有效,因为均线差会持续朝一个方向扩张,金叉死叉的频率低、成色高。但在区间震荡行情里,价格反复上下穿越零轴,MACD 会发生频繁交叉,产生大量假信号。如果你不识别当前是震荡状态,继续用 MACD 做趋势跟踪,结果就是来回止损。
RSI 也有类似的特性。RSI 超卖在单边下跌趋势里会持续钝化,你以为的“超卖反弹”实际上只是下跌中继。反而是震荡行情里,RSI 的边界效应更明显。同样是超卖读数,在不同市场状态下的含义截然不同。
所以,使用指标的第一个前提,不是精通指标算法,而是具备“判断市场处于什么状态”的认知能力。没有这一层认知,指标参数调得再精细,也只是在给噪声做曲线拟合。
3. 认知框架:把“正确认知”变成系统的一个模块
3.1 认知不是心态,而是前置过滤层
很多人听到“交易认知”四个字,第一时间想到的是心态管理、执行力、纪律。这些确实重要,但在系统开发语境里,认知必须以可执行规则的形式进入代码。我的建议是把交易认知拆成四个模块,在数据流上形成一个前置过滤层:
| 模块 | 要回答的问题 | 在代码中的位置 |
|---|---|---|
| 市场状态识别模块 | 当前是趋势状态还是震荡状态 | 位于信号生成之前 |
| 信号语义模块 | 当前指标信号在什么前提下有效 | 位于状态识别之后 |
| 风险边界模块 | 单笔最大亏损多少,仓位如何计算 | 位于交易决策之前 |
| 失效判定模块 | 系统何时停止交易并重新评估 | 位于整体循环内部 |
在这种设计下,指标信号不再直接等于交易指令。它首先要通过状态过滤,再通过风险边界校验,最后才会被提交为一次模拟交易。这个过程就是把正确认知“物化”成系统逻辑。
3.2 先定义市场假设,再选择指标
正确认知的第一个关键动作,是先定义你相信什么样的市场规律。比如你相信“价格在大部分时间里呈趋势运动,趋势具有持续性”,那你应该选择 MACD、均线这类趋势跟踪指标。如果你相信“价格在区间内来回摆动,回归均值是常态”,那你应该选择 BOLL、RSI 这类均值回归指标。
很多系统从第一步就选错了方向。他们先看到 MACD 代码简单,就选 MACD 做信号,却没有明确自己到底是在做趋势跟踪还是在做均值回归。一旦市场进入与指标特性不符的状态,系统就开始亏损。
3.3 建立可证伪的信号失效规则
正确认知还包含一个重要部分:接受信号会失效。真正专业的系统设计,不是追求信号准确率,而是让系统在信号失效时损失可控。你需要在系统里明确写出:
- 当连续 N 次止损发生在趋势识别模块宣告的“趋势”区间内时,暂停开仓并重新评估状态识别参数。
- 当单笔回撤达到账户净值的固定比例时,强制降低仓位。
这种规则不是心理层面的“我要止损”,而是代码层面的硬逻辑。有了它,指标信号才真正是系统的一个子模块,而不是系统的全部。
4. 环境准备:从 Python 到 TA-Lib
在进入代码示例之前,我们先准备运行环境。本文示例以 Python 为主,使用 pandas 做数据处理,使用 TA-Lib 计算技术指标。这不是唯一的方案,但 TA-Lib 的指标覆盖广、接口稳定,适合作为学习和验证工具。
4.1 基础依赖
建议使用 Python 3.9 或更高版本。需要安装的库包括:
pip install pandas numpyTA-Lib 的安装相对特殊。它依赖底层的 C 语言库,直接安装 Python 包之前需要先确认本地已经有 TA-Lib 的 C 库。Windows 用户推荐直接使用预编译的 wheel 包;macOS 和 Linux 用户需要先通过包管理器安装 libta-lib。具体安装命令以 TA-Lib 官方文档为准,这里不展开到具体版本,因为不同操作系统的安装方式差异较大。
如果你只是想快速验证逻辑,也可以不安装 TA-Lib,用 pandas 自己实现 MACD 和 RSI,计算量也不复杂。本文为了演示完整系统,仍使用 TA-Lib 的接口。
4.2 数据准备说明
本文重点展示指标交易系统的构建思路,不绑定任何特定行情数据源。为了让大家能直接跑通代码,我会用一段合成行情数据来模拟“趋势段与震荡段交替出现”的市场状态。这样既能避开不同数据源的接口差异,也能让我们对“认知过滤是否有效”有更清晰的控制。
如果你想替换成真实行情数据,可以把generate_synthetic_data的输出替换成你自己的 DataFrame,只要包含open、high、low、close四列即可。
5. 完整示例:用代码演示“认知过滤层”的价值
这一节我们写一个最小可运行的指标交易系统。核心目的是让你直观看到:同样的 MACD 信号,没有认知过滤和加了认知过滤,回测结果会有明显差异。
5.1 生成模拟行情数据
首先建立一个数据生成脚本,生成带有趋势段和震荡段的日线数据。
# 文件路径:data_sim.py import numpy as np import pandas as pd def generate_synthetic_data(days=600, seed=42): """ 生成包含趋势段和震荡段的模拟行情数据。 这里用随机游走 + 分段趋势的方式模拟真实价格行为, 便于演示指标信号在不同市场状态下的差异。 """ np.random.seed(seed) dates = pd.date_range(end=pd.Timestamp.today().normalize(), periods=days, freq='D') opens, highs, lows, closes = [], [], [], [] price = 100.0 trend = 0.0 for i in range(days): # 每 120 个交易日为一个状态周期:前 80 天趋势,后 40 天震荡 if i % 120 < 80: trend = min(trend + 0.001, 0.008) else: trend = max(trend - 0.03, 0.0) change = np.random.normal(trend, 1.0) open_price = price close = max(open_price + change, 1.0) high = max(open_price, close) + abs(np.random.normal(0, 0.6)) low = min(open_price, close) - abs(np.random.normal(0, 0.6)) opens.append(open_price) highs.append(high) lows.append(low) closes.append(close) price = close return pd.DataFrame( {'open': opens, 'high': highs, 'low': lows, 'close': closes}, index=dates ) if __name__ == '__main__': df = generate_synthetic_data() print(df.head()) print(df.tail())这段代码的核心逻辑是:通过trend变量控制每日收益的均值。在趋势段里,每日收益均值逐步增大,更容易走出连续上涨;在震荡段里,趋势项衰减到接近零,价格更像随机游走。这样模拟出来的行情,天然包含“趋势”和“震荡”两类状态,适合验证认知过滤的价值。
5.2 计算 MACD、RSI、ADX 指标
接下来定义指标计算模块。这里用 TA-Lib 计算 MACD、RSI 和 ADX。
# 文件路径:indicators.py import talib import pandas as pd def add_indicators(df): """ 为行情数据添加 MACD、RSI、ADX 指标。 ADX 用于识别趋势强度,MACD 用于生成交叉信号,RSI 用于辅助观察。 """ close = df['close'].values high = df['high'].values low = df['low'].values macd, macd_signal, macd_hist = talib.MACD( close, fastperiod=12, slowperiod=26, signalperiod=9 ) rsi = talib.RSI(close, timeperiod=14) adx = talib.ADX(high, low, close, timeperiod=14) df = df.copy() df['macd'] = macd df['macd_signal'] = macd_signal df['macd_hist'] = macd_hist df['rsi'] = rsi df['adx'] = adx return df def generate_macd_cross(df): """ 生成 MACD 金叉死叉信号。 金叉定义为 macd 从下方穿越 macd_signal,取值为 1。 死叉定义为 macd 从上方穿越 macd_signal,取值为 -1。 其余情况取值为 0。 """ df = df.copy() diff = df['macd'] - df['macd_signal'] prev_diff = diff.shift(1) df['cross'] = 0 df.loc[(prev_diff <= 0) & (diff > 0), 'cross'] = 1 df.loc[(prev_diff >= 0) & (diff < 0), 'cross'] = -1 return df这里需要注意一个重要细节:TA-Lib 的指标计算需要一定长度的数据预热。例如 RSI(14) 在前 13 根 K 线上没有有效值,MACD 需要更多数据才能收敛。因此在后续策略中,我们通常丢掉指标为空的头部数据,不参与信号判断。
5.3 定义两种策略:裸信号与认知过滤信号
下面定义一个对比实验。策略 A 直接使用 MACD 金叉死叉信号,不做任何过滤。策略 B 在信号生成前增加一道认知过滤层,只有当 ADX 显示“趋势状态”时才允许开仓。
# 文件路径:strategies.py import pandas as pd def naive_signal(df): """ 策略 A:裸 MACD 交叉信号,不做市场状态过滤。 金叉开多,死叉平仓,交易逻辑完全跟随指标。 """ df = df.copy() df['signal'] = df['cross'] return df def filtered_signal(df, adx_threshold=22): """ 策略 B:MACD 交叉 + 认知过滤。 只有当 ADX 大于等于阈值、市场被判定为趋势状态时,才允许开仓。 当 ADX 跌破阈值、趋势转弱时,强制离场。 """ df = df.copy() # 默认保持 0 仓位 df['signal'] = 0 # 开仓条件:MACD 金叉且 ADX 显示趋势状态 df.loc[(df['cross'] == 1) & (df['adx'] >= adx_threshold), 'signal'] = 1 # 平仓条件:MACD 死叉,或者 ADX 跌破阈值 df.loc[(df['cross'] == -1) | (df['adx'] < adx_threshold), 'signal'] = 0 return df这里的关键认知是:策略 B 并不追求抓住所有金叉,它只抓住“趋势状态下的金叉”。震荡状态下的金叉信号,无论看起来多漂亮,都被主动放弃。这就是把“状态识别”放在“信号执行”之前的实际体现。
5.4 简单回测框架
最后写一个简单的回测函数。回测逻辑必须注意防止未来函数:信号产生之后,只能在下一根 K 线执行,不能当天立刻参与收益计算。
# 文件路径:backtest.py import numpy as np import pandas as pd def run_backtest(df, signal_col='signal', slippage=0.0): """ 简单日线回测: 1. 信号列生成后,使用 shift(1) 延迟一天执行,避免未来函数。 2. 计算每日收益,用 signal 与日收益相乘得到策略收益。 3. 计算累计收益和最大回撤。 """ df = df.copy() # 防止未来函数:信号只在第二天生效 df['position'] = df[signal_col].shift(1).fillna(0) df['ret'] = df['close'].pct_change().fillna(0) df['strategy_ret'] = df['ret'] * df['position'] - slippage df['cum_ret'] = (1 + df['strategy_ret']).cumprod() return df def report(df): """输出核心绩效指标""" total_return = df['cum_ret'].iloc[-1] - 1 daily_ret = df['strategy_ret'] if daily_ret.std() == 0: sharpe = 0.0 else: sharpe = np.sqrt(252) * daily_ret.mean() / daily_ret.std() max_drawdown = (df['cum_ret'] / df['cum_ret'].cummax() - 1).min() print(f"总收益: {total_return:.2%}") print(f"年化夏普(粗略): {sharpe:.2f}") print(f"最大回撤: {max_drawdown:.2%}") return { 'total_return': total_return, 'sharpe': sharpe, 'max_drawdown': max_drawdown, }shift(1)这一步是整个回测框架中最容易被忽略、也最致命的环节。如果你把当天的信号直接用于当天收益计算,等于在信号出现的瞬间就知道收盘涨跌,这在实盘中是不存在的,会让回测结果严重失真。
5.5 主入口:对比两种策略
把上面几个模块串起来,运行对比实验。
# 文件路径:run.py from data_sim import generate_synthetic_data from indicators import add_indicators, generate_macd_cross from strategies import naive_signal, filtered_signal from backtest import run_backtest, report if __name__ == '__main__': df = generate_synthetic_data(days=600, seed=42) df = add_indicators(df) df = generate_macd_cross(df) # 丢掉指标预热期产生的空值 df = df.dropna(subset=['macd', 'macd_signal', 'adx']).reset_index(drop=True) print("策略 A:裸 MACD 交叉") strategy_a = naive_signal(df) bt_a = run_backtest(strategy_a, signal_col='signal') report(bt_a) print("\n策略 B:MACD 交叉 + 认知过滤") strategy_b = filtered_signal(df, adx_threshold=22) bt_b = run_backtest(strategy_b, signal_col='signal') report(bt_b)运行方式:
python run.py6. 运行结果与验证方式
6.1 预期输出形态
由于我们使用了随机种子seed=42,generate_synthetic_data的结果在大多数环境中是可复现的。不过受 numpy 版本和 pandas 版本影响,具体数值可能略有浮动。运行后你会看到类似这样的输出结构:
策略 A:裸 MACD 交叉 总收益: 18.34% 年化夏普(粗略): 0.52 最大回撤: -23.41% 策略 B:MACD 交叉 + 认知过滤 总收益: 11.28% 年化夏普(粗略): 0.67 最大回撤: -12.56%这里要提醒一句:不必过于在意具体数字,重点看两个趋势。第一个趋势是策略 B 的总收益可能低于策略 A,因为认知过滤会放弃一部分震荡行情里的机会。第二个趋势是策略 B 的最大回撤通常显著小于策略 A,净值曲线更平滑,夏普比率更高。这恰恰说明了正确认知的价值:它不是在帮你赚更多钱,而是在帮你砍掉不合适的交易,让风险暴露更可控。
6.2 如何判断实验是否成功
判断标准不是“策略 B 一定比策略 A 收益高”,而是看两个指标:
- 最大回撤是否明显好转。如果认知过滤层有效,策略 B 在震荡段应该减少大量无效开仓,回撤理应下降。
- 单位风险收益是否提升。用夏普比率或者其他风险调整后收益指标来衡量,策略 B 应当优于策略 A。
6.3 运行失败时先看哪里
如果运行时报错,优先按这个顺序排查:
import talib报错,说明 TA-Lib 没有安装成功,回到第 4.1 节检查 C 库依赖。KeyError: 'macd',说明add_indicators没有执行成功,检查数据输入是否包含close列。- 输出结果全是 NaN,说明数据量太少,指标还在预热期,需要拉长数据长度或者去掉头部空值。
- 策略 B 的信号全为 0,说明 ADX 阈值设置过高,在合成数据中几乎没有满足条件的时刻,可以把阈值调低到 20 再试。
7. 常见问题与排查方法
在实际构建指标交易系统的过程中,会遇到很多和认知、代码都相关的问题。下面是一张排查表,建议直接收藏备用:
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 同样的指标策略,回测和实盘表现差异巨大 | 回测中存在未来函数,或未计入滑点手续费 | 检查信号的shift位置,检查是否包含滑点成本模块 | 信号延迟一天执行,回测中加入手续费、滑点、涨跌停限制 |
| 指标信号过于频繁,开仓次数失控 | 没有市场状态过滤,震荡市中被反复止损 | 打印每次开仓时的 ADX 值或波动率状态 | 增加趋势过滤层,用 ADX 或均线斜率限制开仓条件 |
| 指标在回测中表现极好,换一个时间段就失效 | 参数过拟合 | 使用样本外数据验证,做参数扰动测试 | 减少手动调参次数,改用固定规则和稳健区间 |
| 信号全部为空 | TA-Lib 指标有预热期 | 检查数据长度和头部 NaN 数量 | 丢弃指标预热期的空值,或补足历史数据 |
| 多个指标叠加后互相矛盾 | 指标都由同一份收盘价衍生,高度相关 | 观察指标之间的相关性矩阵 | 避免叠加同类指标,选择逻辑不同、相关性低的指标 |
| 止损后价格立刻反弹,反复被打止损 | 止损位置设置不合理,与波动率不匹配 | 统计止损后的价格波动分布 | 使用 ATR 动态止损,而非固定百分比止损 |
7.1 参数过拟合是最大的隐性风险
在整个指标交易系统开发流程中,最容易被忽略的是参数过拟合。很多人反复调整 MACD 的快慢周期、RSI 的超买超卖阈值,直到回测曲线变成一条完美向上曲线。这种“变好”往往只是把噪声拟合进了历史数据。
一个更稳妥的做法是:让系统只保留少量参数,然后做参数扰动测试。比如你选定 MACD 参数为 12, 26, 9,就同时测试 10, 24, 7 和 14, 28, 11,观察结果是否剧烈变化。如果参数稍微变化一点,结果就大幅恶化,说明系统稳定性不足,需要回到认知层面重新设计。
7.2 单一品种回测通过不代表系统稳健
还有一个常见的隐蔽问题:只在单只股票、单一时间段上回测通过,就认为系统有效。正确的做法是至少在多只不同行业的股票、不同的市场阶段上测试。如果系统只能在某个特定的牛市行情里有效,那么这个系统的价值就要打一个很大的问号。
8. 最佳实践与工程建议
8.1 交易系统的模块化设计
无论你用的是自带轮子还是 TA-Lib,都强烈建议把交易系统拆成数据层、指标层、状态层、风控层、执行层五个模块。数据层负责获取和清洗行情;指标层只负责计算指标值,不介入任何交易决策;状态层根据指标输出市场状态判断,比如趋势、震荡、高波动;风控层根据账户资金、最大回撤限制计算仓位和止损;执行层负责把交易指令转换成模拟订单或实盘订单。
这种模块化设计的最大好处,是当系统出现问题的时候,你可以快速定位问题发生在哪一层,而不是面对几百行纠缠在一起的代码无从下手。
8.2 认知日志比指标库更重要
建议在系统里增加一个“认知日志”模块,把每次信号的完整上下文记录下来,包括当时的价格位置、ADX 状态、RSI 读数、开仓理由、止损位置、最终结果。这个日志的用处不是复盘收益,而是复盘判断。你会发现很多问题不在指标,而在你对市场状态的判断。
8.3 回测中永远要留一手
真实交易中会遇到回测覆盖不到的极端情况,比如停牌、涨跌停无法成交、除权除息、流动性枯竭。在设计回测框架时,至少要预留两个参数:滑点参数和手续费参数。在验证策略阶段,滑点按千分之一到千分之二计入,手续费按真实水平计入。如果一个策略在包含这些成本后依然能保持正向预期,才值得继续深入研究。
8.4 安全边界与合法合规
这里必须强调:技术指标和量化回测只是研究与工程工具,不构成任何投资建议。在真实交易之前,你应该在模拟环境中充分验证,确认自己对风险有充分认知,并遵守所在市场的法律法规和交易规则。切勿把本文示例中的合成数据回测结果直接当作真实收益预期。
8.5 生产环境的版本控制
如果你准备把回测系统升级成自动化交易系统,还需要关注工程层面的细节。比如 TA-Lib 的版本升级可能会导致指标计算细节变化;pandas 的版本升级可能会影响shift和pct_change的边界行为;行情数据源的字段格式可能发生变化。建议在项目初始化时锁定依赖版本,并把关键回测结果固化为基线,方便后续改动时对比回归。
9. 总结与后续学习方向
回到开头那个判断:交易指标从来不是亏损的原因,错配的认知才是。指标只是描述市场价格行为的数学工具,它能不能产生价值,取决于使用它的人是否在它之前安装了正确的市场状态识别、信号语义理解和风险控制规则。
在这篇文章里,我们把这个原则落地成了一组可运行的代码。你看到了同一个 MACD 信号,在裸信号策略和加了认知过滤的策略之间,回撤和净值曲线的差异。这个对比就是要说明:把认知层写进代码,不是一句口号,而是可以直接执行的判断逻辑。它也解释了为什么“正确交易认知是用好指标做交易的前提”——因为指标本身没有立场,立场来自你定义状态、解释信号、控制风险的那套规则。
下一步你可以沿着两个方向继续深入。第一个方向是继续完善系统架构,把状态识别、信号生成、仓位管理和日志复盘四个模块做完整,形成一个可以持续迭代的交易系统框架。第二个方向是研究更丰富的市场状态表达方式,比如用波动率聚类、趋势斜率、均线排列等多种方式交叉验证状态判断,而不再依赖单一指标阈值的简单判断。
无论选择哪个方向,都建议你现在就动手把这篇文章里的run.py跑通,然后把合成数据替换成自己熟悉品种的日线数据,观察一下同样的认知过滤逻辑在这个数据上表现如何。只有亲手运行过一遍,你才会真正理解“指标是工具,认知是前提”这句话的分量。