1
0
Files
leopard-analysis/strategy.py
2026-01-27 18:30:41 +08:00

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() # 开空仓