用python写一个“MACD加移动平均线”且夏普率大于1的策略,并进行回测
时间: 2024-02-13 21:06:11 浏览: 239
【量化投资】成功率极高的MACD策略python编程实现
5星 · 资源好评率100%
好的,我会给您提供一个用Python实现的“MACD加移动平均线”的交易策略,并进行回测。需要说明的是,这只是一个示例策略,实际应用中需要根据具体情况进行修改和优化。
首先,我们需要导入需要的库和数据。这里我使用的是tushare获取的上证指数历史数据,您可以根据自己的需要进行修改。
```python
import tushare as ts
import pandas as pd
import numpy as np
import talib
# 获取上证指数历史数据
pro = ts.pro_api()
df = pro.index_daily(ts_code='000001.SH', start_date='20100101', end_date='20201231')
df = df[['trade_date', 'close']]
df = df.sort_values('trade_date')
df['trade_date'] = pd.to_datetime(df['trade_date'])
df.set_index('trade_date', inplace=True)
# 计算移动平均线和MACD指标
df['ma5'] = talib.SMA(df['close'], timeperiod=5)
df['ma10'] = talib.SMA(df['close'], timeperiod=10)
df['dif'], df['dea'], df['macd'] = talib.MACD(df['close'], fastperiod=12, slowperiod=26, signalperiod=9)
```
接下来,我们需要根据策略进行交易信号的生成。这里我们的策略是当短期移动平均线(5日均线)上穿长期移动平均线(10日均线)且MACD指标出现金叉时买入,当短期移动平均线下穿长期移动平均线且MACD指标出现死叉时卖出。
```python
# 生成交易信号
df['position'] = np.where((df['ma5'] > df['ma10']) & (df['dif'] > df['dea']), 1, 0) # 买入信号
df['position'] = np.where((df['ma5'] < df['ma10']) & (df['dif'] < df['dea']), -1, df['position']) # 卖出信号
df['position'] = df['position'].fillna(method='ffill') # 用前一天的持仓量填充当天的持仓量
```
接下来,我们需要计算每天的收益率,并计算策略的夏普率。
```python
# 计算每天的收益率
df['pct_change'] = df['close'].pct_change() * df['position'].shift(1)
df['pct_change'] = df['pct_change'].fillna(0)
# 计算策略的夏普率
annual_return = df['pct_change'].mean() * 252
annual_volatility = df['pct_change'].std() * np.sqrt(252)
sharpe_ratio = annual_return / annual_volatility
```
最后,我们可以进行回测并得出策略的收益率。
```python
# 进行回测
df['cum_return'] = (1 + df['pct_change']).cumprod()
# 输出结果
print('夏普率:', sharpe_ratio)
print('累计收益率:', df['cum_return'][-1])
```
完整代码如下:
```python
import tushare as ts
import pandas as pd
import numpy as np
import talib
# 获取上证指数历史数据
pro = ts.pro_api()
df = pro.index_daily(ts_code='000001.SH', start_date='20100101', end_date='20201231')
df = df[['trade_date', 'close']]
df = df.sort_values('trade_date')
df['trade_date'] = pd.to_datetime(df['trade_date'])
df.set_index('trade_date', inplace=True)
# 计算移动平均线和MACD指标
df['ma5'] = talib.SMA(df['close'], timeperiod=5)
df['ma10'] = talib.SMA(df['close'], timeperiod=10)
df['dif'], df['dea'], df['macd'] = talib.MACD(df['close'], fastperiod=12, slowperiod=26, signalperiod=9)
# 生成交易信号
df['position'] = np.where((df['ma5'] > df['ma10']) & (df['dif'] > df['dea']), 1, 0) # 买入信号
df['position'] = np.where((df['ma5'] < df['ma10']) & (df['dif'] < df['dea']), -1, df['position']) # 卖出信号
df['position'] = df['position'].fillna(method='ffill') # 用前一天的持仓量填充当天的持仓量
# 计算每天的收益率
df['pct_change'] = df['close'].pct_change() * df['position'].shift(1)
df['pct_change'] = df['pct_change'].fillna(0)
# 计算策略的夏普率
annual_return = df['pct_change'].mean() * 252
annual_volatility = df['pct_change'].std() * np.sqrt(252)
sharpe_ratio = annual_return / annual_volatility
# 进行回测
df['cum_return'] = (1 + df['pct_change']).cumprod()
# 输出结果
print('夏普率:', sharpe_ratio)
print('累计收益率:', df['cum_return'][-1])
```
希望这个示例策略能对您有所帮助,如果您有任何问题或建议,请随时与我联系。
阅读全文