记录一些股票常用的指标计算——python实现

做毕设要用到一些股票指标作为ELM的输入值,一共17个。稍微找了一下talib里的一些函数,跟我需要用到的指标还差那么一点,只好自己找公式实现了。但其实那些指标背后的公式都很简单。这里顺便把用到的talib里的函数也一起放上了。

指标

先把要用指标放上来

缩写描述
KKDJ中的K值
DKDJ中的D值
JKDJ中的J值
MACD异同移动平均线
MOM动量线
BIAS乖离率
CMO钱德动量摆动指标
TRIX三重指数平滑平均线
OBV能量潮
ROC变动率指标
AMA移动平均平行线差指标
VR成交量变异率
PSY心理线指标
Force Index强力指数指标
DPO区间震荡线
VHF十字过滤线指标
RVI相对活力指数

实现

先导入几个包,除了talib、numpy和pandas以外还有stockstats、pandas_talib

import pandas as pd
import numpy as np
import talib
import stockstats
import pandas_talib
'''
	这里虽然没有定义df这个变量,但这很明显就是dateframe格式的某只股票基础数据
	包括开盘价、收盘价、最高价、最低价和成交量
	建议用tushare来获取数据(当然仅限日数据)
'''
stockStat = stockstats.StockDataFrame.retype(df)
close = df.close
highPrice = df.high
lowPrice = df.low
volume = df.volume

然后把一些人家库已经实现好的指标放出来

df.rename(columns={'close': 'Close', 'volume': 'Volume'}, inplace=True)

sig_k , sig_d  = talib.STOCH(np.array(highPrice), np.array(lowPrice), 
							 np.array(close), fastk_period=9,slowk_period=3, 
							 slowk_matype=0, slowd_period=3, slowd_matype=0)
sig_j = sig_k * 3 - sig_d  * 2
sig = pd.concat([sig_k, sig_d, sig_j], axis=1, keys=['K', 'D', 'J'])
sig['MACD'], MACDsignal, MACDhist = talib.MACD(np.array(close), fastperiod=6, 
												slowperiod=12, signalperiod=9)
sig['MOM'] = talib.MOM(np.array(close), timeperiod=5)
sig['CMO'] = talib.CMO(close, timeperiod=10)
sig['TRIX'] = talib.TRIX(close, timeperiod=14)
sig['OBV'] = talib.OBV(close, volume)
sig['ROC'] = talib.ROC(close, timeperiod=10)
sig['VR'] = stockStat['vr']
sig['Force_Index'] = pandas_talib.FORCE(df, 12)['Force_12']

然后就是自己实现的指标了。

BIAS

def BIAS(close, timeperiod=20):
    if isinstance(close,np.ndarray):
        pass
    else:
        close = np.array(close)
    MA = talib.MA(close,timeperiod=timeperiod)
    return (close-MA)/MA

AMA

def AMA(stockStat):
    return talib.MA(stockStat['dma'],  timeperiod=10)

PSY

def PSY(priceData, period):
    difference = priceData[1:] - priceData[:-1]
    difference = np.append(0, difference)
    difference_dir = np.where(difference > 0, 1, 0)
    psy = np.zeros((len(priceData),))
    psy[:period] *= np.nan
    for i in range(period, len(priceData)):
        psy[i] = (difference_dir[i-period+1:i+1].sum()) / period
    return psy*100

DPO

def DPO(close):
    p = talib.MA(close, timeperiod=11)
    p.shift()
    return close-p

VHF

def VHF(close):
    LCP = talib.MIN(close, timeperiod=28)
    HCP = talib.MAX(close, timeperiod=28)
    NUM = HCP - LCP
    pre = close.copy()
    pre = pre.shift()
    DEN = abs(close-close.shift())
    DEN = talib.MA(DEN, timeperiod=28)*28
    return NUM.div(DEN)

RVI

def RVI(df):
    close = df.close
    open = df.open
    high = df.high
    low = df.low
    X = close-open+2*(close.shift()-open.shift())+
    	2*(close.shift(periods=2)-open.shift(periods=2))*(close.shift(periods=3)-
    	open.shift(periods=3))/6
    Y = high-low+2*(high.shift()-low.shift())+
    	2*(high.shift(periods=2)-low.shift(periods=2))*(high.shift(periods=3)-
    	low.shift(periods=3))/6
    Z = talib.MA(X, timeperiod=10)*10
    D = talib.MA(Y, timeperiod=10)*10
    return Z/D
### 如何用Python计算和绘制股票技术指标 #### 计算并绘制KDJ指标线 为了计算并绘制KDJ指标线,可以使用`ta-lib`库来简化操作。以下是具体实现方式: ```python import talib as ta import pandas as pd import matplotlib.pyplot as plt def calculate_kdj(data): high = data['high'] low = data['low'] close = data['close'] k, d = ta.STOCH(high, low, close, fastk_period=9, slowk_period=3, slowd_period=3) j = 3 * k - 2 * d result = pd.DataFrame({ 'K': k, 'D': d, 'J': j }) return result data = ... # 历史行情数据加载部分省略 kdj_data = calculate_kdj(data) plt.figure(figsize=(10, 6)) plt.plot(kdj_data.index, kdj_data[['K', 'D', 'J']]) plt.title('KDJ Indicator') plt.legend(['K Line', 'D Line', 'J Line']) plt.show() ``` 此段代码展示了如何利用`talib`函数快速完成KDJ三个分量的计算,并通过matplotlib绘制成图表[^1]。 #### 绘制带技术指标的K线图 对于更复杂的可视化需求,比如同时展示K线图和其他多个技术指标,则推荐采用`mplfinance`库来进行绘制工作。下面是一个例子,说明怎样画出带有布林带和技术指标MACD的K线图: ```python from mplfinance.original_flavor import candlestick_ohlc import matplotlib.dates as mdates import akshare as ak stock_code = "603228" start_date = "2024-06-01" end_date = "2024-07-02" df = ak.stock_zh_a_hist(symbol=stock_code, start_date=start_date, end_date=end_date).iloc[::-1] fig, (ax1, ax2) = plt.subplots(2, sharex=True, figsize=(15, 10)) candlestick_ohlc(ax1, df.values, width=.6, colorup='red', colordown='green') macd_diff_dea = ta.MACDEXT(df['收盘'], fastperiod=12, fastmatype=1, slowperiod=26, slowmatype=1, signalperiod=9) macd_line, macd_signal, _ = zip(*[(diff, dea, hist) for diff, dea, hist in macd_diff_dea]) ax2.plot(macd_line, label="MACD", alpha=0.75) ax2.plot(macd_signal, label="Signal line", linestyle="--") upper_band, mid_band, lower_band = ta.BBANDS(df['收盘']) ax1.fill_between(mdates.datestr2num(df.index), upper_band, lower_band, facecolor='#adccff', alpha=0.5) for axis in [ax1, ax2]: plt.sca(axis) plt.xticks(rotation=45) plt.tight_layout() plt.show() ``` 这段脚本首先调用了akshare接口取得指定时间段内的历史交易记录;接着分别构建了两个子图用于呈现不同类型的市场信息——上方显示的是标准形式的日K线形态,下方则聚焦于反映短期价格变动趋势特征的MACD曲线及其对应的信号线条。此外还加入了上下轨作为辅助判断工具之一的布林通道[Bollinger Bands][^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值