
等级: 新手上路
- 注册:
- 2025-2-18
- 曾用名:
|
import backtrader as bt
import datetime
class ImprovedMovingAverageCrossStrategy(bt.Strategy):
params = (
('short_period', 5),
('long_period', 20),
('filter_period', 200),
('stop_loss', 0.02), # 2% stop loss
('take_profit', 0.05), # 5% take profit
)
def __init__(self):
self.short_ma = bt.indicators.SimpleMovingAverage(
self.data.close, period=self.params.short_period)
self.long_ma = bt.indicators.SimpleMovingAverage(
self.data.close, period=self.params.long_period)
self.filter_ma = bt.indicators.SimpleMovingAverage(
self.data.close, period=self.params.filter_period)
self.order = None
def next(self):
if self.order:
return # 如果有未完成的订单,不执行任何操作
if not self.position: # 没有持仓
if (self.short_ma > self.long_ma) and (self.data.close > self.filter_ma):
self.order = self.buy()
else: # 有持仓
if self.data.close < self.short_ma:
self.order = self.sell()
elif self.data.close >= self.data.close * (1 + self.params.take_profit):
self.order = self.sell()
elif self.data.close <= self.data.close * (1 - self.params.stop_loss):
self.order = self.sell()
def notify_order(self, order):
if order.status in [order.Completed, order.Canceled, order.Margin]:
self.order = None
# 初始化Cerebro引擎
cerebro = bt.Cerebro()
# 添加策略
cerebro.addstrategy(ImprovedMovingAverageCrossStrategy)
# 加载数据
data = bt.feeds.YahooFinanceData(
dataname='AAPL',
fromdate=datetime.datetime(2020, 1, 1),
todate=datetime.datetime(2023, 1, 1),
timeframe=bt.TimeFrame.Days)
cerebro.adddata(data)
# 设置初始资金
cerebro.broker.set_cash(10000.0)
# 设置佣金
cerebro.broker.setcommission(commission=0.001)
# 运行回测
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
cerebro.run()
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
# 绘制结果
cerebro.plot() |
|