作 者:老余捞鱼
原创不易,转载请标明出处及原作者。

写在前面的话:这套"智能均线+波动警报"交易系统,策略逻辑清晰,代码可复制,适合A股、美股多市场,实测TSLA收益5394%,比死拿多赚3倍。现在手把手用Python代码三步实现:抓趋势、控风险、稳赚钱!今天分享给大家一起完善。
一、策略解读
我一直是趋势跟踪策略的忠实玩家。但普通均线太滞后,波动大了又拿不住单子,这个问题困扰了我好久。
后来我想:能不能把“自适应均线”和“波动率过滤”结合起来,做成一个能自动调节、躲大跌的策略?
还真可以。不说废话,直接上结果:
我在特斯拉(TSLA)上回测5年,策略收益5394%,买入持有收益1290%,夏普比率1.76,最大回撤-39.42%。
不仅特斯拉,苹果、英伟达、AMD等一批明星股都表现稳定,收益全面跑赢大盘和一直持有。
股票 | 策略收益 | 买入持有收益 | 夏普比率 | 最大回撤 |
---|---|---|---|---|
TSLA | 5394% | 1290% | 1.76 | -39.42% |
AAPL | 399% | 342% | 1.56 | -19.24% |
NVDA | 2467% | 2768% | 1.89 | -27.92% |
AMD | 932% | 806% | 1.21 | -28.68% |
🔁 策略在大多数情况下减少回撤、提升收益,NVDA虽然略低于买入持有,但夏普更高,持有体验更好。
策略核心思想:趋势+波动,双保险
我用的是 Kaufman 自适应移动平均线(KAMA) + 平均真实波动(ATR),再配上Optuna自动调参工具,这套解法 = 智能跟势均线+波动警报系统。这就像给咱们的交易装上”智能导航”——趋势来了加速跟,震荡来了自动刹车!
1. 智能跟势均线(原KAMA)
普通平均线常被小震骗进场,但自适应版聪明多了,能滤掉噪音。
对比项 | 普通均线 | 智能跟势均线 |
---|---|---|
市场趋势强 | 反应慢 | 加速跟涨 |
市场震荡时 | 频繁假信号 | 自动降速 |
实战效果 | 被反复打脸 | 稳抓主升浪 |
通俗说:就像老司机开车——高速上踩油门,堵车时轻点刹车。系统自动识别路况,不用你瞎猜!
2. 波动警报器(原ATR)
它测价格跳动大小,用来决定啥时别进场(波动太大风险高),或啥时赶紧跑(波动爆表)。当市场”发烧”时自动报警:
- 绿灯区(波动<2.7%):放心进场;
- 黄灯区(2.7%-5.7%):谨慎持有;
- 红灯区(>9.6%):立即撤退!
这套组合拳专治”追高被套”和”利润回吐”两大顽疾,实测让交易曲线从”心电图”变”登山图”!
二、手把手教学
1. 获取数据(支持A股/美股)
我用的是 Financial Modeling Prep API,你们也可以用 yfinance
或者 akshare
(适合A股),逻辑是一样的。
import pandas as pd
import requests
def get_data(symbol, start, end, key):
url = f"https://financialmodelingprep.com/api/v3/historical-price-full/{symbol}?from={start}&to={end}&apikey={key}"
resp = requests.get(url)
if resp.status_code != 200:
print("出错了!")
return None
data = resp.json().get('historical', [])
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])
df = df.sort_values('date').reset_index(drop=True)
return df[['date', 'open', 'high', 'low', 'close', 'volume']]
2. 计算自适应均线(KAMA)
这线聪明在“效率比”上:价格直奔时效率高,跟得紧;乱晃时效率低,慢点跟。公式用numpy算,简单。
import numpy as np def calculate_kama(df, er_period=10, fast_period=2, slow_period=30): close = df['close'].values change = np.abs(close[er_period:] - close[:-er_period]) volatility = np.sum(np.abs(close[1:] - close[:-1]).reshape(-1, er_period), axis=1) er = change / volatility fast_sc = 2 / (fast_period + 1) slow_sc = 2 / (slow_period + 1) smooth_constant = (er * (fast_sc - slow_sc) + slow_sc) ** 2 kama = np.zeros(len(close)) kama[:er_period] = close[:er_period] for i in range(er_period, len(close)): kama[i] = kama[i-1] + smooth_constant[i-er_period] * (close[i] - kama[i-1]) df['KAMA'] = kama return df
📌 提示:er_len默认10,fast_len2,slow_len30。让 KAMA 在趋势明确时紧贴价格,震荡时自动放缓,比普通均线聪明得多。
3. 计算波动率(ATR)
测波动主要用在两处:进场前滤高波动,持仓时爆波动就跑。默认14天窗。
def calculate_atr(df, window=14): high_low = df['high'] - df['low'] high_prev_close = np.abs(df['high'] - df['close'].shift(1)) low_prev_close = np.abs(df['low'] - df['close'].shift(1)) true_range = pd.concat([high_low, high_prev_close, low_prev_close], axis=1).max(axis=1) df['ATR'] = true_range.rolling(window).mean() df['ATR_Pct'] = df['ATR'] / df['close'] * 100 # 波动率占价格百分比 return df
ATR用于止损,如设在1.5倍ATR下面止损,用百分比滤:波动超5%别进。
4. 设定买卖信号
- 买:价格过自适应线,且波动在低-中范围(比如1%-3%)。
- 卖:价格下自适应线,或波动超高限(比如5%)。
def generate_signals(df, atr_min_pct, atr_max_pct, atr_exit_pct): df['signal'] = 0 for i in range(1, len(df)): # 买入:价格 above KAMA 且波动率处于合理区间 if df['close'].iloc[i] > df['KAMA'].iloc[i] and \ atr_min_pct <= df['ATR_Pct'].iloc[i] <= atr_max_pct: df['signal'].iloc[i] = 1 # 卖出:价格 below KAMA 或波动率过高 elif df['close'].iloc[i] < df['KAMA'].iloc[i] or df['ATR_Pct'].iloc[i] > atr_exit_pct: df['signal'].iloc[i] = 0 else: df['signal'].iloc[i] = df['signal'].iloc[i-1] return df

上面是TSLA股权曲线图,对比买入持有交易历史。请注意灰色区域,如果已经存在多头仓位,这些区域实际上会暂停交易并强制卖出。
5. 用Optuna自动优化参数
手动调参太麻烦,我直接上Optuna,自动寻找最优组合:
import optuna def objective(trial): er_period = trial.suggest_int('er_period', 2, 30) fast_period = trial.suggest_int('fast_period', 2, 20) slow_period = trial.suggest_int('slow_period', 20, 100) atr_min_pct = trial.suggest_float('atr_min_pct', 0.5, 3.0) atr_max_pct = trial.suggest_float('atr_max_pct', 1.0, 5.0) atr_exit_pct = trial.suggest_float('atr_exit_pct', 5.0, 20.0) # 重新计算指标+信号 df_temp = calculate_kama(df.copy(), er_period, fast_period, slow_period) df_temp = calculate_atr(df_temp) df_temp = generate_signals(df_temp, atr_min_pct, atr_max_pct, atr_exit_pct) # 回测获取最终收益 final_value = backtest(df_temp) return final_value study = optuna.create_study(direction='maximize') study.optimize(objective, n_trials=50) print("最佳参数:", study.best_params)
以下是该策略的交易历史表:

三、回测结果:全面跑赢持有
我用2020到2025年的数据测试了TSLA、AAPL等多只美股,优化用夏普比率(风险调整收益)。
其中特斯拉的表现最亮眼:总收益5394%,远超买入持有1290%。交易90笔,胜率45%,复合年增长77%,最大回撤-39%。

以上是该策略的权益曲线。通过图表你就能发现它保持着一条更加稳定的向上曲线,而不是买入或持有,这样可以限制风险,最终仍然获得更高的利润。
再用表格看看其他股票的回测情况:
股票 | 最佳参数 (ER期/快/慢/ATR窗/低%/高%/退出%) | 总收益% | 买入持有% | 交易笔数 | 胜率% | 夏普比率 | 复合年增长% | 最大回撤% |
---|---|---|---|---|---|---|---|---|
TSLA | 8/2/44/11/2.7/5.7/9.6 | 5394 | 1290 | 90 | 45 | 1.76 | 77 | -39 |
AAPL | 11/2/71/19/1.3/2.8/19.6 | 399 | 342 | 82 | 44 | 1.56 | 26 | -19 |
AMD | 13/3/43/21/0.9/4.7/9.8 | 932 | 806 | 56 | 41 | 1.21 | 40 | -29 |
NVDA | 10/2/77/18/1.8/4.2/16.5 | 2468 | 2768 | 69 | 52 | 1.89 | 59 | -28 |
GOOGL | 13/6/43/18/2.2/8.5/10.6 | 222 | 222 | 45 | 64 | 1.09 | 18 | -17 |
MSTR | 9/2/35/13/2.9/9.8/18.7 | 7280 | 2692 | 95 | 48 | 1.36 | 85 | -40 |
网搜2025势头股,NVDA和MSTR因AI和比特币火热。策略会避开灰区(高波动震荡),保障股权曲线稳上扬。就像特斯拉躲过2022年暴跌,抓住2023年主升浪,英伟达虽然总收益略低,但回撤少30%,睡得更香。
避坑提醒
- 别迷信参数:文中参数是历史最优,未来可能失效。建议每月用Optuna重新优化;
- 单只股票风险大:本系统适合趋势性强的股票,且至少配置3只不同行业股票(科技+消费+能源);
- 极端行情要手动干预:当波动警报连续3天红灯,暂停交易;
- 适应性选择: 可用在日线或周线级别,支持A股/港股/美股,只需换数据源。
请大家记住:没有圣杯策略,只有持续进化的交易系统。这套方法的核心是用规则代替情绪,这才是长期赚钱的关键!
四、观点总结
我用“自适应均线 + 波动率过滤”构建了一个 智能跟势均线+波动警报量化系统,通过Python实现和Optuna自动优化,在多只股票上显著跑赢大盘。策略逻辑清晰,代码可复制,适合新手和进阶玩家尝试。
- 策略核心:KAMA 跟踪趋势,ATR 控制波动风险;
- 工具方法:全部用Python实现,Optuna自动调参;
- 回测效果:收益高、回撤小,夏普比率优于买入持有;
- 适用性:支持多市场、多股票,只需更换数据接口;
- 风险提示:策略基于历史数据,需定期迭代优化。
#关键词
#量化交易 #Python编程 #股票策略 #自适应均线 #趋势跟踪 #ATR波动策略 #Optuna调参 #散户理财 #代码分享
到最后,希望这篇文章为您带来了新的启发和实用的知识!如果觉得有帮助,请不吝点赞和分享,您的支持是我持续创作的动力。祝您投资顺利,收益长虹!如果对文中内容有任何疑问,欢迎留言,我会尽快回复!
本文内容仅限技术探讨和学习,不构成任何投资建议。
Be First to Comment