我用机器学习给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.6 | 2.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/10 | 3.2/10 | -62% |
| 冲动交易比例 | 65% | 12% | -82% |
| 策略执行率 | 45% | 95% | +111% |
| 睡眠质量 | 3/10 | 8/10 | +167% |
佛系投资的真谛
经过这6个月的实践,我终于明白了什么是真正的「佛系投资」:
1. 等待机会的智慧
在震荡市里,最重要的不是「做什么」,而是「不做什么」。我的智能策略系统在震荡市里平均每个月只交易7次,而我的传统策略每个月交易26次。
减少交易次数,反而提高了收益。
2. 接受市场的不确定性
我学会了接受「A股有75%时间都在震荡」这个事实。不再试图对抗市场,而是顺应市场的节奏。
在牛市里持股,在熊市里观望,在震荡市里做网格。
3. 重新定义「成功」
我开始重新定义投资的成功:
成功不是每天都要交易
成功不是每笔都要赚钱
成功是顺应市场的节奏
成功是控制风险,而不是追求收益
4. 把时间还给生活
最重要的是,我把时间还给了生活:
不再每天盯盘10小时
不再因为亏损而焦虑失眠
不再因为错过机会而懊恼
开始享受投资之外的生活
写在最后
说实话,写这篇文章时我还有点不敢相信。我一直以为投资需要「勤奋」和「努力」,但现在我明白了:
投资最大的智慧是「不作为」——在错误的时候不做任何交易。
如果你也在投资中感到焦虑和痛苦,或许应该像我一样,用机器学习来分析一下自己所在的市场状态。也许你会发现,你需要的不是更复杂的策略,而是更简单的「等待」。
记住:
真正的投资高手,不是天天交易的人,而是懂得什么时候该休息的人。
我是小Q,一个被市场教育了6年的量化程序员,终于学会了在A股里「佛系投资」 💤