1
0

修复代码问题

This commit is contained in:
2026-01-28 09:46:44 +08:00
parent 9a46bd7e4c
commit 5cc140259e
3 changed files with 86 additions and 113 deletions

View File

@@ -2,28 +2,27 @@
MACD 趋势跟踪策略
策略逻辑:
- 当 MACD 线上穿信号线时 (金叉),且价格 > EMA200 时,买入
- 当 MACD 线下穿信号线时 (死叉),或价格 < EMA200 时,卖出
- 当 MACD 线上穿信号线时 (金叉),且价格 > EMA 时,买入
- 当 MACD 线下穿信号线时 (死叉),或价格 < EMA 时,卖出
指标计算:
- MACD(10, 20, 9): 快线 10 日,慢线 20 日,信号线 9 日
- EMA200: 200 日指数移动平均线(趋势确认)
- EMA: 200 日指数移动平均线(趋势确认)
参数选择理由:
- 快线 10: 比标准 12 更敏感,适应 A 股较高波动性
- 慢线 20: 比标准 26 更快响应,同时保持趋势跟踪稳定性
- 信号线 9: 保持标准,避免信号过于频繁
- EMA200: 被广泛认可为牛熊分界线,避免逆势交易
- EMA: 被广泛认可为牛熊分界线,避免逆势交易
趋势过滤:
- EMA200 上方: 确认为上升趋势,允许开多仓
- EMA200 下方: 确认为下降趋势,不开多仓,强制平仓
- EMA 上方: 确认为上升趋势,允许开多仓
- EMA 下方: 确认为下降趋势,不开多仓,强制平仓
Author: Sisyphus
Date: 2025-01-27
"""
import pandas as pd
from backtesting import Strategy
from backtesting.lib import crossover
@@ -32,32 +31,30 @@ def calculate_indicators(data):
"""
计算策略所需的技术指标
使用 ta-lib 库计算 MACD 和 EMA200 指标
使用 ta-lib 库计算 MACD 和 EMA 指标
参数:
data: DataFrame, 包含 [Open, High, Low, Close, Volume, factor]
返回:
DataFrame, 添加了指标列:
- MACD_10_20_9: MACD 线 (DIF)
- MACDs_10_20_9: MACD 信号线 (DEA)
- MACDh_10_20_9: MACD 柱状图 (Histogram)
- EMA_200: 200 日指数移动平均线
- dif: MACD 线 (dif)
- signal: MACD 信号线 (DEA)
- hist: MACD 柱状图 (Histogram)
- ema: 日指数移动平均线
"""
data = data.copy()
# 计算 MACD 指标 (10, 20, 9)
# talib.MACD 返回三个值: (macd, macdsignal, macdhist)
macd, macdsignal, macdhist = talib.MACD(
data["Close"], fastperiod=10, slowperiod=20, signalperiod=9
)
macd, macdsignal, macdhist = talib.MACD(data["Close"], fastperiod=10, slowperiod=20, signalperiod=9)
data["MACD_10_20_9"] = macd
data["MACDs_10_20_9"] = macdsignal
data["MACDh_10_20_9"] = macdhist
data["dif"] = macd
data["signal"] = macdsignal
data["hist"] = macdhist
# 计算 EMA200 趋势线
data["EMA_200"] = talib.EMA(data["Close"], timeperiod=200)
# 计算 EMA 趋势线
data["ema"] = talib.SMA(data["Close"], timeperiod=120)
return data
@@ -76,7 +73,7 @@ class MacdTrendStrategy(Strategy):
"""
MACD 趋势跟踪策略
结合 MACD 金叉/死叉信号和 EMA200 趋势过滤
结合 MACD 金叉/死叉信号和 EMA 趋势过滤
参数:
fast_period: MACD 快线周期 (默认: 10)
@@ -95,13 +92,13 @@ class MacdTrendStrategy(Strategy):
注册指标到 backtesting 框架
"""
# 注册 MACD 线
self.macd = self.I(lambda x: x, self.data.MACD_10_20_9)
self.macd = self.I(lambda x: x, self.data.dif)
# 注册 MACD 信号线
self.macd_signal = self.I(lambda x: x, self.data.MACDs_10_20_9)
self.macd_signal = self.I(lambda x: x, self.data.signal)
# 注册 EMA200 趋势线
self.ema200 = self.I(lambda x: x, self.data.EMA_200)
# 注册 EMA 趋势线
self.ema = self.I(lambda x: x, self.data.ema)
def next(self):
"""
@@ -109,25 +106,19 @@ class MacdTrendStrategy(Strategy):
买入条件:
- MACD 金叉 (MACD 线上穿信号线)
- 价格 > EMA200 (确认上升趋势)
- 价格 > EMA (确认上升趋势)
卖出条件:
- MACD 死叉 (MACD 线下穿信号线)
- 或价格 < EMA200 (趋势转向,强制平仓)
- 或价格 < EMA (趋势转向,强制平仓)
"""
# 买入条件: MACD 金叉 AND 价格 > EMA200
if (
crossover(self.macd, self.macd_signal)
and self.data.Close[-1] > self.ema200[-1]
):
# 买入条件: MACD 金叉 AND 价格 > EMA
if crossover(self.macd, self.macd_signal) and self.data.Close[-1] > self.ema[-1]:
self.position.close() # 先平掉现有仓位
self.buy() # 开多仓
# 卖出条件: MACD 死叉 OR 价格 < EMA200
elif (
crossover(self.macd_signal, self.macd)
or self.data.Close[-1] < self.ema200[-1]
):
# 卖出条件: MACD 死叉 OR 价格 < EMA
elif crossover(self.macd_signal, self.macd) or self.data.Close[-1] < self.ema[-1]:
self.position.close() # 平掉多仓