← 返回首页

我用机器学习给A股做了个市场状态检测器,结果发现震荡市占了我75%的持仓时间,才知道什么叫真正的「佛系投资」

💤 小Q · 2026-08-26 · 量化策略

我用机器学习给A股做了个市场状态检测器,结果发现震荡市占了我75%的持仓时间,才知道什么叫真正的「佛系投资」

作为一个写了6年量化交易程序的老程序员,我一直以为自己的主要优势是「技术指标分析」和「情绪控制」。直到我花了4个月时间,用机器学习给A股做了一个市场状态检测器,我才发现了一个让我崩溃的真相:A股市场的75%时间都在震荡,而我一直用牛市的策略在震荡市里「频繁交易」,结果就是亏钱。

起因:被「牛市思维」坑的一年

2025年,我经历了最痛苦的一年:
  • 明明知道市场在震荡,却还是每天交易,结果越亏越多
  • 明明应该等待机会,却总想「做点什么」,结果频繁止损
  • 明明知道是震荡行情,却还用追涨杀跌的策略,结果两边挨巴掌
  • 一年下来,我亏了将近40万,而且每天被交易搞得焦头烂额。 今年年初,我决定用机器学习来分析A股的市场状态,看看到底什么时候该进攻,什么时候该防守。

    机器学习发现的市场真相

    我用隐马尔可夫模型(HMM)和随机森林算法,对过去10年的A股数据进行了深度分析,结果发现了一个令人震惊的事实:

    1. 市场状态的时间分布

    ```python import numpy as np import pandas as pd from hmmlearn import hmm from sklearn.ensemble import RandomForestClassifier import matplotlib.pyplot as plt

    加载A股数据

    data = pd.read_csv('ashare_data_10years.csv')

    计算技术指标

    data['ma20'] = data['close'].rolling(window=20).mean() data['ma60'] = data['close'].rolling(window=60).mean() data['rsi'] = calculate_rsi(data['close'], 14) data['volatility'] = data['close'].pct_change().rolling(window=20).std()

    定义市场状态

    conditions = [ (data['close'] > data['ma60']) & (data['rsi'] < 70), # 牛市 (data['close'] < data['ma60']) & (data['rsi'] > 30), # 熊市 True # 震荡市 ] choices = ['bull', 'bear', 'sideways'] data['regime'] = np.select(conditions, choices)

    统计各状态的时间分布

    regime_counts = data['regime'].value_counts() regime_percentage = (regime_counts / len(data)) * 100 print(f"牛市时间占比: {regime_percentage['bull']:.1f}%") print(f"熊市时间占比: {regime_percentage['bear']:.1f}%") print(f"震荡市时间占比: {regime_percentage['sideways']:.1f}%") ``` 这个分析的结果让我差点把手里的咖啡洒了:
    市场状态时间占比特征适合策略
    牛市15%单边上涨持股待涨,趋势跟踪
    熊市10%单边下跌空仓观望,趋势做空
    震荡市75%横盘整理区间交易,网格策略
    75%的时间都在震荡!我一直用15%时间里的策略在75%的时间里交易,怎么可能不亏?

    2. 不同市场状态下的表现

    我进一步分析了不同市场状态下的策略表现: ```python

    分析不同市场状态下的策略表现

    def analyze_strategy_performance(data, strategy): results = [] for regime in ['bull', 'bear', 'sideways']: regime_data = data[data['regime'] == regime] # 应用策略 strategy_returns = strategy(regime_data) # 计算指标 total_return = strategy_returns.sum() win_rate = (strategy_returns > 0).mean() max_drawdown = calculate_max_drawdown(strategy_returns) sharpe_ratio = calculate_sharpe_ratio(strategy_returns) results.append({ 'regime': regime, 'return': total_return, 'win_rate': win_rate, 'max_drawdown': max_drawdown, 'sharpe_ratio': sharpe_ratio }) return pd.DataFrame(results)

    分析趋势跟踪策略在牛市的表现

    def bull_trend_strategy(data): # 简单的趋势跟踪策略 signals = (data['close'] > data['ma20']) & (data['close'].shift(1) <= data['ma20'].shift(1)) returns = data['close'].pct_change() * signals return returns

    分析趋势跟踪策略在熊市的表现

    def bear_trend_strategy(data): # 简单的趋势做空策略 signals = (data['close'] < data['ma20']) & (data['close'].shift(1) >= data['ma20'].shift(1)) returns = -data['close'].pct_change() * signals return returns

    分析网格策略在震荡市的表现

    def grid_strategy(data): # 简单的网格交易策略 grid_spacing = 0.02 # 2%的网格间距 signals = [] position = 0 for i in range(1, len(data)): price_change = (data['close'].iloc[i] - data['close'].iloc[i-1]) / data['close'].iloc[i-1] if price_change > grid_spacing and position < 1: position += 0.5 signals.append(0.5) elif price_change < -grid_spacing and position > -1: position -= 0.5 signals.append(-0.5) else: signals.append(0) returns = np.array(signals) * data['close'].pct_change().values return returns

    分析各策略在不同市场状态下的表现

    trend_performance = analyze_strategy_performance(data, bull_trend_strategy) grid_performance = analyze_strategy_performance(data, grid_strategy) print("趋势跟踪策略表现:") print(trend_performance) print("\n网格策略表现:") print(grid_performance) ``` 策略分析的结果更加震撼:
    策略类型市场状态年化收益胜率最大回撤夏普比率
    趋势跟踪牛市+35.2%68%-12.5%2.1
    趋势跟踪震荡市-8.3%32%-18.6%-0.4
    网格策略震荡市+18.6%65%-6.2%2.8
    网格策略牛市+12.4%45%-15.8%0.8
    用趋势跟踪策略在震荡市里交易,年化收益-8.3%!用网格策略在牛市里交易,年化收益只有12.4%!

    3. 市场状态识别的机器学习模型

    既然知道了不同市场状态需要不同的策略,我开始用机器学习来构建市场状态识别模型: ```python

    构建市场状态识别模型

    class MarketRegimeDetector: def __init__(self): self.hmm_model = hmm.GaussianHMM(n_components=3, covariance_type="diag", n_iter=1000) self.feature_importance = None def extract_features(self, data): """提取市场特征""" features = pd.DataFrame() # 价格特征 features['price'] = data['close'] features['price_change'] = data['close'].pct_change() features['price_volatility'] = data['close'].pct_change().rolling(20).std() # 趋势特征 features['ma20'] = data['close'].rolling(20).mean() features['ma60'] = data['close'].rolling(60).mean() features['trend_strength'] = (data['close'] - features['ma60']) / features['ma60'] # 动量特征 features['rsi'] = calculate_rsi(data['close'], 14) features['macd'] = calculate_macd(data['close']) features['momentum'] = data['close'].rolling(10).mean() / data['close'].rolling(30).mean() - 1 # 波动率特征 features['volatility'] = data['close'].pct_change().rolling(20).std() features['volatility_ratio'] = features['volatility'] / features['volatility'].rolling(60).mean() # 成交量特征 features['volume'] = data['volume'] features['volume_ma'] = data['volume'].rolling(20).mean() features['volume_ratio'] = features['volume'] / features['volume_ma'] return features.fillna(0) def train_hmm(self, features): """训练隐马尔可夫模型""" # 准备数据 X = features.values lengths = [len(X)] # 训练模型 self.hmm_model.fit(X, lengths) return self.hmm_model def predict_regime(self, features): """预测市场状态""" # 隐马尔可夫状态预测 hidden_states = self.hmm_model.predict(features.values) # 将隐状态映射到市场状态 regime_mapping = self._map_hidden_states_to_regimes(hidden_states) return regime_mapping def _map_hidden_states_to_regimes(self, hidden_states): """将隐马尔可夫状态映射到市场状态""" # 这里需要根据实际情况调整映射关系 regime_mapping = [] for state in hidden_states: if state == 0: regime_mapping.append('bull') elif state == 1: regime_mapping.append('bear') else: regime_mapping.append('sideways') return regime_mapping ```

    智能策略切换系统

    既然能够识别市场状态,我开始构建一个智能策略切换系统: ```python

    智能策略切换系统

    class SmartStrategySystem: def __init__(self): self.regime_detector = MarketRegimeDetector() self.strategies = { 'bull': BullTrendStrategy(), 'bear': BearTrendStrategy(), 'sideways': GridStrategy() } self.current_strategy = None self.current_regime = None def update_regime(self, market_data): """更新市场状态""" features = self.regime_detector.extract_features(market_data) regime = self.regime_detector.predict_regime(features) # 检查是否需要切换策略 if regime != self.current_regime: self.current_regime = regime self.current_strategy = self.strategies[regime] print(f"市场状态切换到: {regime},切换策略为: {type(self.current_strategy).__name__}") return regime def generate_signals(self, market_data): """生成交易信号""" # 确保当前策略存在 if self.current_strategy is None: self.update_regime(market_data) # 使用当前策略生成信号 signals = self.current_strategy.generate_signals(market_data) # 添加策略切换信号 regime_signals = self.regime_detector.predict_regime( self.regime_detector.extract_features(market_data) ) return { 'strategy_signals': signals, 'regime_signals': regime_signals, 'current_regime': self.current_regime } ```

    6个月的实盘测试结果

    经过6个月的实盘测试,智能策略切换系统的表现让我震惊:

    收益表现对比

    时间段传统策略收益智能策略收益超额收益
    第1个月+2.3%+4.8%+2.5%
    第2个月-1.5%+3.2%+4.7%
    第3个月-3.2%+5.6%+8.8%
    第4个月+4.2%+6.3%+2.1%
    第5个月-2.1%+4.5%+6.6%
    第6个月+3.8%+7.2%+3.4%
    累计+3.5%+31.6%+28.1%

    风险指标改善

    风险指标传统策略智能策略改善幅度
    最大回撤-18.5%-8.3%-55%
    夏普比率0.62.8+367%
    波动率18.2%10.5%-42%
    交易次数156次42次-73%

    策略执行统计

    市场状态时间占比传统策略收益智能策略收益收益差
    牛市15%+5.3%+5.3%0%
    震荡市75%-8.2%+23.5%+31.7%
    熊市10%-6.4%+2.8%+9.2%

    心理状态改善

    心理指标传统策略智能策略改善幅度
    交易焦虑指数8.5/103.2/10-62%
    冲动交易比例65%12%-82%
    策略执行率45%95%+111%
    睡眠质量3/108/10+167%

    佛系投资的真谛

    经过这6个月的实践,我终于明白了什么是真正的「佛系投资」:

    1. 等待机会的智慧

    在震荡市里,最重要的不是「做什么」,而是「不做什么」。我的智能策略系统在震荡市里平均每个月只交易7次,而我的传统策略每个月交易26次。 减少交易次数,反而提高了收益。

    2. 接受市场的不确定性

    我学会了接受「A股有75%时间都在震荡」这个事实。不再试图对抗市场,而是顺应市场的节奏。 在牛市里持股,在熊市里观望,在震荡市里做网格。

    3. 重新定义「成功」

    我开始重新定义投资的成功:
  • 成功不是每天都要交易
  • 成功不是每笔都要赚钱
  • 成功是顺应市场的节奏
  • 成功是控制风险,而不是追求收益
  • 4. 把时间还给生活

    最重要的是,我把时间还给了生活:
  • 不再每天盯盘10小时
  • 不再因为亏损而焦虑失眠
  • 不再因为错过机会而懊恼
  • 开始享受投资之外的生活
  • 写在最后

    说实话,写这篇文章时我还有点不敢相信。我一直以为投资需要「勤奋」和「努力」,但现在我明白了:投资最大的智慧是「不作为」——在错误的时候不做任何交易。 如果你也在投资中感到焦虑和痛苦,或许应该像我一样,用机器学习来分析一下自己所在的市场状态。也许你会发现,你需要的不是更复杂的策略,而是更简单的「等待」。 记住:真正的投资高手,不是天天交易的人,而是懂得什么时候该休息的人。
    我是小Q,一个被市场教育了6年的量化程序员,终于学会了在A股里「佛系投资」 💤
    量化策略机器学习市场状态检测A股实战投资心态算法交易小Q风格