运用Backtrader框架、Backtrader_plotting模块和akshare库,构建量化投资策略。代码需要详细注释
时间: 2024-03-26 13:35:39 浏览: 141
好的,我会尽力回答你的问题。
首先,我们需要安装Backtrader、Backtrader_plotting和akshare库,可以通过以下命令进行安装:
```
pip install backtrader backtrader_plotting akshare
```
接下来,我们先导入需要用到的库:
```python
import backtrader as bt
import backtrader_plotting as btp
import akshare as ak
import pandas as pd
```
然后,我们需要定义一个策略类,这里我们以双均线策略为例:
```python
class DoubleMA(bt.Strategy):
params = (("p1", 5), ("p2", 20), ("p3", 10), ("p4", 0.01))
def __init__(self):
self.ma1 = bt.indicators.SMA(self.data.close, period=self.params.p1)
self.ma2 = bt.indicators.SMA(self.data.close, period=self.params.p2)
self.ma3 = bt.indicators.SMA(self.data.close, period=self.params.p3)
self.buy_signal = bt.indicators.CrossOver(self.ma1, self.ma2)
self.sell_signal = bt.indicators.CrossDown(self.ma1, self.ma2)
def next(self):
if not self.position:
if self.buy_signal > 0:
self.buy(size=self.params.p4 * self.broker.cash)
elif self.sell_signal > 0:
self.close()
```
在这个策略类中,我们定义了四个参数:p1、p2、p3和p4,分别表示短期均线、长期均线、中期均线和买入比例。在`__init__`函数中,我们定义了三个移动平均线指标,并使用`CrossOver`和`CrossDown`指标定义了买入和卖出信号。在`next`函数中,我们根据买入和卖出信号进行交易。
接下来,我们需要获取股票数据并进行回测。这里我们以获取上证指数数据为例:
```python
df = ak.stock_zh_index_daily(symbol="sh000001")
df.index = pd.to_datetime(df.index)
data = bt.feeds.PandasData(dataname=df)
```
通过akshare库获取上证指数数据,并将日期转换为时间戳后,使用PandasData将数据传递给Backtrader。
接下来,我们可以创建一个Cerebro对象并将策略和数据添加到其中:
```python
cerebro = bt.Cerebro()
cerebro.addstrategy(DoubleMA)
cerebro.adddata(data)
```
然后,我们可以设置回测参数并运行回测:
```python
cerebro.broker.setcash(1000000.0)
cerebro.broker.setcommission(commission=0.002)
cerebro.run()
```
这里我们设置了初始资金为100万,佣金费率为0.2‰,然后运行回测。
最后,我们可以使用`btp.plot`函数进行可视化:
```python
btp.plot(cerebro)
```
这样就完成了一个简单的量化投资策略的构建。完整代码如下:
```python
import backtrader as bt
import backtrader_plotting as btp
import akshare as ak
import pandas as pd
class DoubleMA(bt.Strategy):
params = (("p1", 5), ("p2", 20), ("p3", 10), ("p4", 0.01))
def __init__(self):
self.ma1 = bt.indicators.SMA(self.data.close, period=self.params.p1)
self.ma2 = bt.indicators.SMA(self.data.close, period=self.params.p2)
self.ma3 = bt.indicators.SMA(self.data.close, period=self.params.p3)
self.buy_signal = bt.indicators.CrossOver(self.ma1, self.ma2)
self.sell_signal = bt.indicators.CrossDown(self.ma1, self.ma2)
def next(self):
if not self.position:
if self.buy_signal > 0:
self.buy(size=self.params.p4 * self.broker.cash)
elif self.sell_signal > 0:
self.close()
df = ak.stock_zh_index_daily(symbol="sh000001")
df.index = pd.to_datetime(df.index)
data = bt.feeds.PandasData(dataname=df)
cerebro = bt.Cerebro()
cerebro.addstrategy(DoubleMA)
cerebro.adddata(data)
cerebro.broker.setcash(1000000.0)
cerebro.broker.setcommission(commission=0.002)
cerebro.run()
btp.plot(cerebro)
```
阅读全文