用python写一个双指标且夏普率大于1的策略,并用backtrader进行回测
时间: 2024-02-13 12:06:15 浏览: 172
backtrader程序基本用法
好的,我可以帮你回答这个问题。
首先,双指标策略是指同时使用两个或更多的技术指标来决定交易信号。这些指标可以是任何你认为有用的指标,例如移动平均线、相对强弱指数(RSI)、布林带等等。
夏普率是一个用来评估投资组合收益与风险之间的平衡的指标。夏普率越高,表示在承担相同的风险的情况下,投资组合获得的收益越高。
接下来,我们来看一下如何用Python编写一个双指标策略并进行回测。
首先,我们需要导入一些必要的Python库,例如pandas和backtrader:
``` python
import pandas as pd
import backtrader as bt
```
接下来,我们需要定义一个策略类,这个策略类将继承backtrader库中的bt.Strategy类。在这个策略类中,我们将定义我们的交易策略。这里我使用了移动平均线和RSI指标。
``` python
class MyStrategy(bt.Strategy):
params = (
('sma1', 20),
('sma2', 50),
('rsi_period', 14),
('rsi_upper', 70),
('rsi_lower', 30),
('printlog', False),
)
def __init__(self):
self.sma1 = bt.indicators.SimpleMovingAverage(
self.data.close, period=self.params.sma1)
self.sma2 = bt.indicators.SimpleMovingAverage(
self.data.close, period=self.params.sma2)
self.rsi = bt.indicators.RSI(
self.data.close, period=self.params.rsi_period)
self.buy_signal = bt.indicators.CrossOver(self.sma1, self.sma2)
self.sell_signal = bt.indicators.CrossDown(self.sma1, self.sma2)
def next(self):
if not self.position:
if self.buy_signal > 0 and self.rsi < self.params.rsi_lower:
self.buy()
else:
if self.sell_signal > 0 and self.rsi > self.params.rsi_upper:
self.sell()
```
在这个策略类中,我们首先定义了一些参数,包括两个移动平均线的周期、RSI指标的周期和上下限以及一个打印日志的布尔值。
然后在__init__方法中,我们使用backtrader内置的SimpleMovingAverage和RSI指标计算移动平均线和RSI指标,并使用CrossOver和CrossDown指标计算买入和卖出信号。
最后,在next方法中,我们根据买入和卖出信号来执行交易操作。
接下来,我们需要读取我们的交易数据并创建backtrader的Cerebro实例。在这里,我们使用Yahoo Finance API来获取AAPL的历史价格数据:
``` python
data = bt.feeds.YahooFinanceData(dataname='AAPL', fromdate=datetime(2010, 1, 1), todate=datetime(2020, 12, 31))
cerebro = bt.Cerebro()
cerebro.adddata(data)
cerebro.addstrategy(MyStrategy)
cerebro.broker.setcash(100000.0)
cerebro.broker.setcommission(commission=0.001)
```
在这里,我们使用了YahooFinanceData数据源来读取AAPL的历史价格数据,并将数据源添加到Cerebro实例中。
然后,我们将我们刚刚定义的策略类添加到Cerebro实例中,并设置初始资金和佣金。
最后,我们运行回测并输出结果:
``` python
cerebro.run()
cerebro.plot()
```
这将运行回测并输出回测结果和图表。
要计算夏普率,我们可以使用backtrader内置的analyzer来计算。在这里,我们将使用SharpeRatioAnalyzer来计算夏普率:
``` python
from backtrader.analyzers import SharpeRatio
cerebro.addanalyzer(SharpeRatio, _name='mysharpe')
results = cerebro.run()
sharpe_ratio = results[0].analyzers.mysharpe.get_analysis()['sharperatio']
```
这里我们将SharpeRatioAnalyzer添加到Cerebro实例中,并运行回测。然后,我们可以使用get_analysis方法来获取夏普率。
最后,我们可以将以上代码整合到一个完整的Python脚本中并运行:
``` python
import pandas as pd
import backtrader as bt
from datetime import datetime
from backtrader.analyzers import SharpeRatio
class MyStrategy(bt.Strategy):
params = (
('sma1', 20),
('sma2', 50),
('rsi_period', 14),
('rsi_upper', 70),
('rsi_lower', 30),
('printlog', False),
)
def __init__(self):
self.sma1 = bt.indicators.SimpleMovingAverage(
self.data.close, period=self.params.sma1)
self.sma2 = bt.indicators.SimpleMovingAverage(
self.data.close, period=self.params.sma2)
self.rsi = bt.indicators.RSI(
self.data.close, period=self.params.rsi_period)
self.buy_signal = bt.indicators.CrossOver(self.sma1, self.sma2)
self.sell_signal = bt.indicators.CrossDown(self.sma1, self.sma2)
def next(self):
if not self.position:
if self.buy_signal > 0 and self.rsi < self.params.rsi_lower:
self.buy()
else:
if self.sell_signal > 0 and self.rsi > self.params.rsi_upper:
self.sell()
data = bt.feeds.YahooFinanceData(dataname='AAPL', fromdate=datetime(2010, 1, 1), todate=datetime(2020, 12, 31))
cerebro = bt.Cerebro()
cerebro.adddata(data)
cerebro.addstrategy(MyStrategy)
cerebro.broker.setcash(100000.0)
cerebro.broker.setcommission(commission=0.001)
cerebro.addanalyzer(SharpeRatio, _name='mysharpe')
results = cerebro.run()
sharpe_ratio = results[0].analyzers.mysharpe.get_analysis()['sharperatio']
print('Sharpe Ratio:', sharpe_ratio)
cerebro.plot()
```
这将输出回测结果和图表,并输出夏普率。
希望这个例子可以帮助你理解如何用Python编写一个双指标策略并进行回测。
阅读全文