面向对象用python写出基于backtrader的股票策略
时间: 2024-05-16 10:16:49 浏览: 165
好的,下面是一个基于backtrader库实现的简单均线策略示例:
```python
import backtrader as bt
class MovingAverageStrategy(bt.Strategy):
params = dict(
ma_period=20,
buy_signal=1.0,
sell_signal=-1.0,
stop_loss=0.05,
take_profit=0.1
)
def __init__(self):
self.ma = bt.indicators.SimpleMovingAverage(self.data, period=self.params.ma_period)
def next(self):
if self.position.size == 0:
if self.data.close[0] > self.ma[0] * self.params.buy_signal:
# 开多仓位
self.buy()
elif self.position.size > 0:
if self.data.close[0] < self.ma[0] * self.params.sell_signal:
# 平多仓位
self.close()
elif self.data.close[0] > (1 + self.params.take_profit) * self.position.price:
# 止盈
self.close()
elif self.data.close[0] < (1 - self.params.stop_loss) * self.position.price:
# 止损
self.close()
if __name__ == '__main__':
cerebro = bt.Cerebro()
data = bt.feeds.YahooFinanceData(dataname='AAPL', fromdate=datetime(2021, 1, 1),
todate=datetime(2021, 9, 30))
cerebro.adddata(data)
cerebro.addstrategy(MovingAverageStrategy)
cerebro.run()
cerebro.plot()
```
在这个示例中,我们定义了一个名为MovingAverageStrategy的类,继承了backtrader.Strategy类。该策略基于一个简单的均线交易策略:当股价上穿均线时开多仓位,当股价下穿均线时平多仓位。此外,我们还增加了一些风险管理的参数,如止损和止盈。
在策略中,我们首先在__init__方法中定义了一个20日的简单移动平均线(SMA),并在next方法中使用该指标进行交易决策。如果当前没有持仓,且股价突破20日SMA的buy_signal倍时开多仓位;如果当前持有多仓位,且股价跌破20日SMA的sell_signal倍时平多仓位;如果当前持有多仓位,且股价达到了止盈或止损的价位时,同样平多仓位。
最后,在主函数中,我们使用YahooFinanceData加载了AAPL在2021年1月1日至2021年9月30日之间的日线数据,并将该数据传入Cerebro中。然后,我们将MovingAverageStrategy添加到Cerebro中,并运行回测。最后,我们使用plot方法绘制了回测结果。
阅读全文