国内股票KDJ指标计算,Python实现KDJ指标计算,Talib实现KDJ指标计算

0 引言

KDJ指标是最为常见的指标之一,股票每日的K线数据通过Tushare、Baostock等平台能够获取到个股及指数的Open、High、Low、Close、Volume等数据,KDJ、MACD等技术指标虽然同花顺等财经网站都算好了,但是这写指标确没有接口给“量化宽客”们使用。

1 计算公式

KDJ计算主要有4步:

(1)计算RSV:RSV=(Close(当日值)-Low(9日最低值)) / (High(9日最高值)-Low(9日最低值))

(2)计算K:K=ema(RSV, com=2),ema为指数移动平均,参数com取2;

(3)计算D:D=ema(K, com=2),ema为指数移动平均,参数com取2;

(4)计算J:J=3.0*K-2.0*D

2 Python计算实现

Python实现KDJ指标的计算,主要基于Pandas库实现计算:

2.1 获取数据:

通过Baostock、Tushare、YahooFinance获取数据,这里以Baostock为例:

import baostock as bs
import pandas as pd

code = 'sh.600036'
start_date = '2021-01-01'
end_date = '2021-10-01'

#Step1: 获取数据
lg = bs.login()
rs = bs.query_history_k_data_plus(code,
                                  "date,code,open,high,low,close,volume",
                                  start_date=start_date, end_date=end_date, frequency="d", adjustflag='2')#注意adjustflag取2为前复权
data_list = 
  • 14
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
以下是使用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'等列。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值