写一个“MACD+均线”的量化策略,数据从csv文件导入,用backtrader进行回测。
时间: 2024-03-03 18:47:20 浏览: 142
好的,我可以为你提供一个基于 Python 的 MACD+均线策略的示例代码,并使用 backtrader 库进行回测。在开始之前,需要安装 backtrader 和 pandas 库。请使用以下命令安装:
```python
pip install backtrader
pip install pandas
```
假设你已经有一份名为 `data.csv` 的数据文件,可以通过以下代码导入并进行回测:
```python
import backtrader as bt
import pandas as pd
class MyStrategy(bt.Strategy):
params = (
('short_period', 12),
('long_period', 26),
('signal_period', 9),
)
def __init__(self):
self.dataclose = self.datas[0].close
# Add indicators
self.short_ma = bt.indicators.SMA(
self.data, period=self.params.short_period)
self.long_ma = bt.indicators.SMA(
self.data, period=self.params.long_period)
self.macd = bt.indicators.MACD(
self.data, period_me1=self.params.short_period,
period_me2=self.params.long_period,
period_signal=self.params.signal_period)
def next(self):
if not self.position:
if self.macd.lines.macd[0] > self.macd.lines.signal[0] \
and self.macd.lines.macd[-1] <= self.macd.lines.signal[-1]:
# Buy signal
self.buy()
elif self.macd.lines.macd[0] < self.macd.lines.signal[0] \
and self.macd.lines.macd[-1] >= self.macd.lines.signal[-1]:
# Sell signal
self.sell()
if __name__ == '__main__':
cerebro = bt.Cerebro()
cerebro.addstrategy(MyStrategy)
# Load the data
data = pd.read_csv('data.csv', index_col=0, parse_dates=True)
data.columns = ['open', 'high', 'low', 'close', 'volume']
data = bt.feeds.PandasData(dataname=data)
cerebro.adddata(data)
# Set the commission
cerebro.broker.setcommission(commission=0.001)
# Set the cash and size
cerebro.broker.setcash(100000.0)
cerebro.addsizer(bt.sizers.PercentSizer, percents=10)
# Run the backtest
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
cerebro.run()
print('Ending Portfolio Value: %.2f' % cerebro.broker.getvalue())
```
在这个示例中,我们定义了一个名为 `MyStrategy` 的策略类,该类继承了 `bt.Strategy` 类。我们还定义了三个参数 `short_period`、`long_period` 和 `signal_period`,分别代表短期移动平均线的周期、长期移动平均线的周期和信号线的周期。
在 `__init__` 方法中,我们使用 `bt.indicators` 模块添加了三个指标:短期移动平均线、长期移动平均线和 MACD 指标。在 `next` 方法中,我们使用 MACD 指标的值来判断买入和卖出信号。
在 `if __name__ == '__main__':` 中,我们创建了一个 `Cerebro` 对象,并添加了我们的策略。然后,我们通过 `PandasData` 加载了数据,并将其添加到 `Cerebro` 对象中。我们还设置了佣金、初始资金和交易大小,并运行了回测。
请注意,这只是一个简单的示例代码,你可以根据自己的需求进行修改和扩展。同时,回测结果并不代表实际交易结果,你需要进行风险评估并做好交易管理。
阅读全文