用ny进行MACD、KDJ、RSI指标计算并进行股票回测的代码实现
时间: 2023-08-11 21:03:46 浏览: 75
以下是使用Python和ny进行MACD、KDJ、RSI指标计算和股票回测的代码实现:
1. 导入必要的库
```
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import talib
```
2. 计算MACD、KDJ、RSI指标
```
# 读取股票价格数据
df = pd.read_csv('stock.csv')
# 计算MACD指标
df['MACD'], df['MACDsignal'], df['MACDhist'] = talib.MACD(df['close'], fastperiod=12, slowperiod=26, signalperiod=9)
# 计算KDJ指标
df['K'], df['D'], df['J'] = talib.STOCH(df['high'], df['low'], df['close'], fastk_period=9, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0)
# 计算RSI指标
df['RSI'] = talib.RSI(df['close'], timeperiod=14)
```
3. 定义股票回测函数
```
def backtest(df, buy_signal, sell_signal):
"""
股票回测函数
"""
position = 0
buy_price = 0
buy_dates = []
sell_dates = []
returns = []
for i in range(len(df)):
# 如果有买入信号并且当前没有持仓,则买入
if buy_signal[i] and position == 0:
position = 1
buy_price = df['close'][i]
buy_dates.append(df.index[i])
# 如果有卖出信号并且当前持仓,则卖出
elif sell_signal[i] and position == 1:
position = 0
sell_price = df['close'][i]
sell_dates.append(df.index[i])
# 计算收益率并记录
returns.append((sell_price - buy_price) / buy_price)
# 如果最后一天还持有股票,则在收盘价卖出
if position == 1:
sell_price = df['close'][-1]
sell_dates.append(df.index[-1])
returns.append((sell_price - buy_price) / buy_price)
# 绘制买卖信号和收益曲线
plt.figure(figsize=(12, 6))
plt.plot(df.index, df['close'], label='Price')
plt.plot(df.index, buy_signal * df['close'], '^', markersize=10, color='m', label='Buy')
plt.plot(df.index, sell_signal * df['close'], 'v', markersize=10, color='k', label='Sell')
plt.legend()
plt.title('Returns: {:.2f}%'.format(sum(returns) * 100))
for buy_date in buy_dates:
plt.axvline(buy_date, color='g', linestyle='--')
for sell_date in sell_dates:
plt.axvline(sell_date, color='r', linestyle='--')
plt.show()
```
4. 定义买卖信号生成函数
```
def generate_signals(df):
"""
生成买卖信号
"""
# 生成MACD信号
df['MACD'], df['MACDsignal'], df['MACDhist'] = talib.MACD(df['close'], fastperiod=12, slowperiod=26, signalperiod=9)
df['MACDsignal'] = df['MACDsignal'].fillna(method='backfill')
df['MACDhist'] = df['MACDhist'].fillna(method='backfill')
macd_buy_signal = (df['MACD'] > df['MACDsignal']) & (df['MACDhist'] > 0)
macd_sell_signal = (df['MACD'] < df['MACDsignal']) & (df['MACDhist'] < 0)
# 生成KDJ信号
df['K'], df['D'], df['J'] = talib.STOCH(df['high'], df['low'], df['close'], fastk_period=9, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0)
kdj_buy_signal = (df['K'] < 20) & (df['D'] < 20) & (df['J'] < 20)
kdj_sell_signal = (df['K'] > 80) & (df['D'] > 80) & (df['J'] > 80)
# 生成RSI信号
df['RSI'] = talib.RSI(df['close'], timeperiod=14)
rsi_buy_signal = df['RSI'] < 30
rsi_sell_signal = df['RSI'] > 70
# 合并信号
buy_signal = macd_buy_signal | kdj_buy_signal | rsi_buy_signal
sell_signal = macd_sell_signal | kdj_sell_signal | rsi_sell_signal
return buy_signal.astype(int), sell_signal.astype(int)
```
5. 进行回测并绘制结果
```
# 生成买卖信号
buy_signal, sell_signal = generate_signals(df)
# 进行回测
backtest(df, buy_signal, sell_signal)
```
以上代码实现了MACD、KDJ、RSI指标的计算和股票回测,使用时需要传入包含股票价格信息的DataFrame,例如:
```
df = pd.read_csv('stock.csv')
buy_signal, sell_signal = generate_signals(df)
backtest(df, buy_signal, sell_signal)
```
其中'stock.csv'是包含股票价格信息的CSV文件,包含'open'、'high'、'low'、'close'等列。