88 lines
2.1 KiB
Python
88 lines
2.1 KiB
Python
"""
|
|
SMA 双均线交叉策略
|
|
|
|
策略逻辑:
|
|
- 当短期均线上穿长期均线时 (金叉),买入
|
|
- 当短期均线下穿长期均线时 (死叉),卖出
|
|
|
|
指标计算:
|
|
- SMA10: 10 日简单移动平均线
|
|
- SMA30: 30 日简单移动平均线
|
|
- SMA60: 60 日简单移动平均线
|
|
- SMA120: 120 日简单移动平均线
|
|
"""
|
|
|
|
import pandas as pd
|
|
from backtesting import Strategy
|
|
from backtesting.lib import crossover
|
|
|
|
|
|
def calculate_indicators(data):
|
|
"""
|
|
计算策略所需的技术指标
|
|
|
|
参数:
|
|
data: DataFrame, 包含 [Open, High, Low, Close, Volume, factor]
|
|
|
|
返回:
|
|
DataFrame, 添加了指标列
|
|
"""
|
|
data = data.copy()
|
|
|
|
# 计算不同周期的移动平均线
|
|
data["sma10"] = data["Close"].rolling(window=10).mean()
|
|
data["sma30"] = data["Close"].rolling(window=30).mean()
|
|
data["sma60"] = data["Close"].rolling(window=60).mean()
|
|
data["sma120"] = data["Close"].rolling(window=120).mean()
|
|
|
|
return data
|
|
|
|
|
|
def get_strategy():
|
|
"""
|
|
返回策略类
|
|
|
|
返回:
|
|
SmaCross 类
|
|
"""
|
|
return SmaCross
|
|
|
|
|
|
class SmaCross(Strategy):
|
|
"""
|
|
SMA 双均线交叉策略
|
|
|
|
参数:
|
|
short_period: 短期均线周期 (默认: 10)
|
|
long_period: 长期均线周期 (默认: 30)
|
|
"""
|
|
|
|
# 可配置参数
|
|
short_period = 10
|
|
long_period = 30
|
|
|
|
def init(self):
|
|
"""
|
|
初始化策略
|
|
注册指标到 backtesting 框架
|
|
"""
|
|
self.sma_short = self.I(lambda x: x, self.data.sma10)
|
|
self.sma_long = self.I(lambda x: x, self.data.sma30)
|
|
|
|
def next(self):
|
|
"""
|
|
每个时间步的决策逻辑
|
|
|
|
金叉: 短期均线上穿长期均线 → 买入
|
|
死叉: 短期均线下穿长期均线 → 卖出
|
|
"""
|
|
# 金叉:短期均线上穿长期均线
|
|
if crossover(self.data.sma10, self.data.sma30):
|
|
self.position.close() # 先平掉现有仓位
|
|
self.buy() # 开多仓
|
|
|
|
# 死叉:短期均线下穿长期均线
|
|
elif crossover(self.data.sma30, self.data.sma10):
|
|
self.position.close() # 先平掉现有仓位
|
|
self.sell() # 开空仓
|