• python_计算股票指标


    注:能使用talib包的,优先使用talib包计算;本文中指标图来自同花顺截图

    使用python计算常用的股票指标,本文涉及到的指标包括:RSI、OBV、MACD、 KDJ、 SAR、  VOL、 PSY、 ARBR、 CR、 EMV、 BOLL、 TRIX、 DMA、 BIAS、 CCI、 W%R、 ROC、 DMI

    目录

    导入需要的包

    RSI

    OBV

    MACD

    KDJ

    SAR

    VOL

    PSY

    ARBR

     CR

     EMV

    BOLL

    TRIX

    DMA

    BIAS

    CCI

    W%R

    ROC

    DMI

    数据


    导入需要的包

    1. import pandas as pd
    2. import math
    3. import talib

    RSI

    中文名:相对强弱指标

    计算公式:

    RSI有两种计算方法:

    第一种方法:

    假设A为N日内收盘价涨幅的正数之和,B为N日内收盘价涨幅的负数之和再乘以(-1),这样,A和B均为正,将A,B代入RSI计算公式,则:

    RSI(N) = A ÷ (A + B) × 100

    第二种方法:

    RS(相对强度) = N日内收盘价涨数和之均值 ÷ N日内收盘价跌数和之均值

    RSI = 100 - 100 ÷ (1+RS)

    1. df = pd.read_csv('E:/temp005/600660.csv',encoding='utf-8')
    2. # 删除停牌的数据
    3. df = df.loc[df['openPrice']>0].copy()
    4. df['openPrice'] = df['openPrice']*df['accumAdjFactor']
    5. df['closePrice'] = df['closePrice']*df['accumAdjFactor']
    6. df['highestPrice'] = df['highestPrice']*df['accumAdjFactor']
    7. df['lowestPrice'] = df['lowestPrice']*df['accumAdjFactor']
    8. df['rsi'] = talib.RSI(df['closePrice'], timeperiod=14)

    OBV

    中文名:能量潮

    计算公式:

    OBV = 前一天的OBV ± 当日成交量

    说明:(当日收盘价高于前日收盘价,成交量定位为正值,取加号;当日收盘价低于前日收盘价,成交量定义为负值,取减号;二者相等计为0)

    1. df = pd.read_csv('E:/temp005/600660.csv',encoding='utf-8')
    2. # 删除停牌的数据
    3. df = df.loc[df['openPrice']>0].copy()
    4. df['openPrice'] = df['openPrice']*df['accumAdjFactor']
    5. df['closePrice'] = df['closePrice']*df['accumAdjFactor']
    6. df['highestPrice'] = df['highestPrice']*df['accumAdjFactor']
    7. df['lowestPrice'] = df['lowestPrice']*df['accumAdjFactor']
    8. df['obv'] = talib.OBV(df['closePrice'],df['turnoverVol'])

    MACD

    中文名:指数平滑异同平均线

    计算公式:

    1) 简单移动平均MA

    说明:P1~PN为交易日的收盘价;N为移动平均的天数

    2) 加权移动平均EMA

    说明:W1~WN是权重系数,W1>W2>…>WN

    3) 快速时间窗口设为12日,慢速时间窗口设为26日,DIF参数设为9日,来完整计算一遍MACD

    3.1) 计算指数平滑移动平均值(EMA)

    12日EMA的计算公式为:

    EMA(12) = 昨日EMA(12)  ×  11 ÷ 13 + 今日收盘价 × 2 ÷ 13

    26日EMA的计算公式为:

    EMA(26) = 昨日EMA(26) × 25 ÷ 27 + 今日收盘价 × 2 ÷ 27

    3.2) 计算离差值(DIF)

    DIF = 今日EMA(12) – 今日EMA(26)

    3.3) 计算DIF的9日DEA

    根据差值计算其9日的DEA,即差值平均

    今日DEA = 昨日DEA × 8 ÷ 10 + 今日DIF × 2 ÷ 10

    1. df = pd.read_csv('E:/temp005/600660.csv',encoding='utf-8')
    2. # 删除停牌的数据
    3. df = df.loc[df['openPrice']>0].copy()
    4. df['openPrice'] = df['openPrice']*df['accumAdjFactor']
    5. df['closePrice'] = df['closePrice']*df['accumAdjFactor']
    6. df['highestPrice'] = df['highestPrice']*df['accumAdjFactor']
    7. df['lowestPrice'] = df['lowestPrice']*df['accumAdjFactor']
    8. df['DIFF'],df['DEA'],df['MACD'] = talib.MACD(close_list,fastperiod=12,slowperiod=26,signalperiod=9)

    KDJ

    中文名:随机指标

    计算公式:

    1) 以日KDJ数值的计算为例

    N日RSV = (CN – LN)÷(HN-LN) ×100

    说明:CN为第N日收盘价;LN为N日内的最低价;HN为N日内的最高价,RSV值始终在1~100间波动

    2) 计算K值与D值

    当日K值 = 2/3 × 前一日K值 + 1/3 × 当日RSV

    当日D值 = 2/3 × 前一日D值 + 1/3 × 当日K值

    如果没有前一日K值与D值,则可分别用50来代替

    3) 计算J值

    J = 3D – 2K

    1. df = pd.read_csv('E:/temp005/600660.csv',encoding='utf-8')
    2. # 删除停牌的数据
    3. df = df.loc[df['openPrice']>0].copy()
    4. df['openPrice'] = df['openPrice']*df['accumAdjFactor']
    5. df['closePrice'] = df['closePrice']*df['accumAdjFactor']
    6. df['highestPrice'] = df['highestPrice']*df['accumAdjFactor']
    7. df['lowestPrice'] = df['lowestPrice']*df['accumAdjFactor']
    8. df['kdj_k'],df['kdj_d'] = talib.STOCH(df['highestPrice'],df['lowestPrice'],df['closePrice'],fastk_period=5,slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0)
    9. df['kdj_j'] = 3*df['kdj_k'] - 2*df['kdj_d']

    SAR

    中文名:抛物转向

    计算过程:

    1)先选定一段时间判断为上涨或下跌

    2)如果是看涨,则第一天的SAR值必须是近期内的最低价;如果是看跌,则第一天的SAR值必须是近期的最高价。

    3)第二天的SAR值,则为第一天的最高价(看涨时)或是最低价(看跌时)与第一天的SAR值的差距乘上加速因子,再加上第一天的SAR值就可以求得。

    4)每日的SAR值都可用上述方法类推,公式归纳如下:

    SAR(N) = SAR(N-1) + AF × [(EP(N-1) – SAR(N-1))]

    SAR(N) = 第N日的SAR值

    SAR(N-1) = 第(N-1)日的SAR值

    说明:AF表示加速因子;EP表示极点价,如果是看涨一段期间,则EP为这段时间的最高价,如果是看跌一段期间,则EP为这段时间的最低价;EP(N-1)等于第(N-1)日的极点价

    5)加速因子第一次取0.02,假若第一天的最高价比前一天的最高价还高,则加速因子增加0.02,如无新高则加速因子沿用前一天的数值,但加速因子最高不能超过0.2。反之,下跌也类推

    6)如果是看涨期间,计算出某日的SAR值比当日或前一日的最低价高,则应以当日或前一日的最低价为某日之SAR值;如果是看跌期间,计算某日的SAR值比当日或前一日的最高价低,则应以当日或前一日的最高价为某日的SAR值。

    7)SAR指标基准周期的参数为2,如2日、2周、2月等,其计算周期的参数变动范围为2~8

    8)SAR指标在股价分析系统的主图上显示为“O”形点状图。

    1. df = pd.read_csv('E:/temp005/600660.csv',encoding='utf-8')
    2. # 删除停牌的数据
    3. df = df.loc[df['openPrice']>0].copy()
    4. df['openPrice'] = df['openPrice']*df['accumAdjFactor']
    5. df['closePrice'] = df['closePrice']*df['accumAdjFactor']
    6. df['highestPrice'] = df['highestPrice']*df['accumAdjFactor']
    7. df['lowestPrice'] = df['lowestPrice']*df['accumAdjFactor']
    8. df['sar'] = talib.SAR(df['highestPrice'],df['lowestPrice'])

    VOL

    中文:成交量

    柱状图是成交量,两条曲线是成交量的移动平均 

    1. df = pd.read_csv('E:/temp005/600660.csv',encoding='utf-8')
    2. # 删除停牌的数据
    3. df = df.loc[df['openPrice']>0].copy()
    4. df['openPrice'] = df['openPrice']*df['accumAdjFactor']
    5. df['closePrice'] = df['closePrice']*df['accumAdjFactor']
    6. df['highestPrice'] = df['highestPrice']*df['accumAdjFactor']
    7. df['lowestPrice'] = df['lowestPrice']*df['accumAdjFactor']
    8. df['vol5'] = talib.MA(df['turnoverVol'],timeperiod=5)
    9. df['vol10'] = talib.MA(df['turnoverVol'],timeperiod=10)

    PSY

    中文名:心理线

    计算公式:

    PSY(N) = A/N × 100

    说明:N为天数,A为在这N天之中股价上涨的天数

    1. df = pd.read_csv('E:/temp005/600660.csv',encoding='utf-8')
    2. # 删除停牌的数据
    3. df = df.loc[df['openPrice']>0].copy()
    4. df['openPrice'] = df['openPrice']*df['accumAdjFactor']
    5. df['closePrice'] = df['closePrice']*df['accumAdjFactor']
    6. df['highestPrice'] = df['highestPrice']*df['accumAdjFactor']
    7. df['lowestPrice'] = df['lowestPrice']*df['accumAdjFactor']
    8. df['ext_0'] = df['closePrice']-df['closePrice'].shift(1)
    9. df['ext_1'] = 0
    10. df.loc[df['ext_0']>0,'ext_1'] = 1
    11. df['ext_2'] = df['ext_1'].rolling(window=12).sum()
    12. df['psy'] = (df['ext_2']/12.0)*100

    ARBR

    中文:人气和意愿指标  AR:人气指标  BR:买卖意愿指标

    计算公式:

    AR(N) = N日内(H-O)之和 ÷ N日内(O-L)之和 × 100

    说明:H表示当天最高价;L表示当天最低价;O表示当天开盘价;N表示设定的时间参数,一般原始参数日缺省值为26日

    BR(N) = N日内(H-CY)之和 ÷ N日内(CY-L)之和 × 100

    说明:H表示当天最高价;L表示当天最低价;CY表示前一交易日的收盘价,N表示设定的时间参数,一般原始参数缺省值为26日

    1. df = pd.read_csv('E:/temp005/600660.csv',encoding='utf-8')
    2. # 删除停牌的数据
    3. df = df.loc[df['openPrice']>0].copy()
    4. df['openPrice'] = df['openPrice']*df['accumAdjFactor']
    5. df['closePrice'] = df['closePrice']*df['accumAdjFactor']
    6. df['highestPrice'] = df['highestPrice']*df['accumAdjFactor']
    7. df['lowestPrice'] = df['lowestPrice']*df['accumAdjFactor']
    8. df['h_o'] = df['highestPrice'] - df['openPrice']
    9. df['o_l'] = df['openPrice'] - df['lowestPrice']
    10. df['h_o_sum'] = df['h_o'].rolling(window=26).sum()
    11. df['o_l_sum'] = df['o_l'].rolling(window=26).sum()
    12. df['ar'] = (df['h_o_sum']/df['o_l_sum'])*100
    13. df['h_c'] = df['highestPrice'] - df['closePrice']
    14. df['c_l'] = df['closePrice'] - df['lowestPrice']
    15. df['h_c_sum'] = df['h_c'].rolling(window=26).sum()
    16. df['c_l_sum'] = df['c_l'].rolling(window=26).sum()
    17. df['br'] = (df['h_c_sum']/df['c_l_sum'])*100

     CR

    中文:带状能力线或中间意愿指标

    计算过程:

    1)计算中间价,取以下四种中一种,任选:

    中间价 = (最高价 + 最低价)÷2

    中间价 = (最高价 + 最低价 + 收盘价)÷3

    中间价 = (最高价 + 最低价 + 开盘价 + 收盘价)÷4

    中间价 = (2倍的开盘价 + 最高价 + 最低价)÷4

    2)计算CR:

    CR = N日内(当日最高价 – 上个交易日的中间价)之和 ÷ N日内(上个交易日的中间价 – 当日最低价)之和

    说明:N为设定的时间周期参数,一般原始参数日设定为26日

    3)计算CR值在不同时间周期内的移动平均值:这三条移动平均曲线分别为MA1 MA2 MA3,时间周期分别为5日 10日 20日

    1. df = pd.read_csv('E:/temp005/600660.csv',encoding='utf-8')
    2. # 删除停牌的数据
    3. df = df.loc[df['openPrice']>0].copy()
    4. df['openPrice'] = df['openPrice']*df['accumAdjFactor']
    5. df['closePrice'] = df['closePrice']*df['accumAdjFactor']
    6. df['highestPrice'] = df['highestPrice']*df['accumAdjFactor']
    7. df['lowestPrice'] = df['lowestPrice']*df['accumAdjFactor']
    8. df['m_price'] = (df['highestPrice'] + df['lowestPrice'])/2
    9. df['h_m'] = df['highestPrice']-df['m_price'].shift(1)
    10. df['m_l'] = df['m_price'].shift(1)-df['lowestPrice']
    11. df['h_m_sum'] = df['h_m'].rolling(window=26).sum()
    12. df['m_l_sum'] = df['m_l'].rolling(window=26).sum()
    13. df['cr'] = (df['h_m_sum']/df['m_l_sum'])*100
    14. df['ma1'] = talib.MA(df['cr'],timeperiod=5)
    15. df['ma2'] = talib.MA(df['cr'],timeperiod=10)
    16. df['ma3'] = talib.MA(df['cr'],timeperiod=20)

     EMV

    中文:简易波动指标

    计算方法:

    1)先计算出三个因子A B C的数值。

    A = (当日最高价 + 当日最低价)÷2

    B = (上个交易日最高价 + 上个交易日最低价) ÷2

    C = 当日最高价 – 当日最低价

    2)求出EM数值

    EM = (A-B) ×C÷当日成交额

    3)求出EMV数值

    EMV = EM数值的N个交易日之和,N为时间周期,一般设为14日

    4)求出EMV的移动平均值EMVA

    EMVA = EMV的M日移动平均值,M一般设置9日

    1. df = pd.read_csv('E:/temp005/600660.csv',encoding='utf-8')
    2. # 删除停牌的数据
    3. df = df.loc[df['openPrice']>0].copy()
    4. df['openPrice'] = df['openPrice']*df['accumAdjFactor']
    5. df['closePrice'] = df['closePrice']*df['accumAdjFactor']
    6. df['highestPrice'] = df['highestPrice']*df['accumAdjFactor']
    7. df['lowestPrice'] = df['lowestPrice']*df['accumAdjFactor']
    8. df['a'] = (df['highestPrice']+df['lowestPrice'])/2
    9. df['b'] = (df['highestPrice'].shift(1)+df['lowestPrice'].shift(1))/2
    10. df['c'] = df['highestPrice'] - df['lowestPrice']
    11. df['em'] = (df['a']-df['b'])*df['c']/df['turnoverValue']
    12. df['emv'] = df['em'].rolling(window=14).sum()
    13. df['emva'] = talib.MA(df['emv'],timeperiod=9)

    BOLL

    中文名:布林线指标

    计算公式:

    中轨线 = N日的移动平均线

    上轨线 = 中轨线 + 两倍的标准差

    下轨线 = 中轨线 – 两倍的标准差

    计算过程:

    1)先计算出移动平均值MA

    MA = N日内的收盘价之和÷N

    2)计算出标准差MD的平方

    MD的平方 = 每个交易日的(收盘价-MA)的N日累加之和的两次方 ÷ N

    3)求出MD

    MD = (MD的平方)的平方根

    4)计算MID、UPPER、LOWER的数值

    MID = (N-1)日的MA

    UPPER = MID + 2×MD

    LOWER = MID – 2×MD

    说明:N一般原始参数日缺省值为20日

    1. df = pd.read_csv('E:/temp005/600660.csv',encoding='utf-8')
    2. # 删除停牌的数据
    3. df = df.loc[df['openPrice']>0].copy()
    4. df['openPrice'] = df['openPrice']*df['accumAdjFactor']
    5. df['closePrice'] = df['closePrice']*df['accumAdjFactor']
    6. df['highestPrice'] = df['highestPrice']*df['accumAdjFactor']
    7. df['lowestPrice'] = df['lowestPrice']*df['accumAdjFactor']
    8. df['upper'],df['mid'],df['lower'] = talib.BBANDS(df['closePrice'],timeperiod=20,nbdevup=2, nbdevdn=2, matype=0)

    TRIX

    中文名:三重指数平滑移动平均指标

    1. df = pd.read_csv('E:/temp005/600660.csv',encoding='utf-8')
    2. # 删除停牌的数据
    3. df = df.loc[df['openPrice']>0].copy()
    4. df['openPrice'] = df['openPrice']*df['accumAdjFactor']
    5. df['closePrice'] = df['closePrice']*df['accumAdjFactor']
    6. df['highestPrice'] = df['highestPrice']*df['accumAdjFactor']
    7. df['lowestPrice'] = df['lowestPrice']*df['accumAdjFactor']
    8. df['trix'] = talib.TRIX(df['closePrice'],timeperiod=12)
    9. df['trma'] = talib.MA(df['trix'],timeperiod=20)

    DMA

    中文名:平均线差

    计算公式:

    DDD(N) = N日短期平均值 – M日长期平均值

    AMA(N) = DDD的N日短期平均值

    计算过程:

    以求10日、50日为基准周期的DMA指标为例

    1)求出周期不等的两条移动平均线MA之间的差值

    DDD(10) = MA10 – MA50

    2)求DDD的10日移动平均数值

    AMA(10) = DDD(10)÷10

    1. df = pd.read_csv('E:/temp005/600660.csv',encoding='utf-8')
    2. # 删除停牌的数据
    3. df = df.loc[df['openPrice']>0].copy()
    4. df['openPrice'] = df['openPrice']*df['accumAdjFactor']
    5. df['closePrice'] = df['closePrice']*df['accumAdjFactor']
    6. df['highestPrice'] = df['highestPrice']*df['accumAdjFactor']
    7. df['lowestPrice'] = df['lowestPrice']*df['accumAdjFactor']
    8. df['ma10'] = talib.MA(df['closePrice'],timeperiod=10)
    9. df['ma50'] = talib.MA(df['closePrice'],timeperiod=50)
    10. df['ddd'] = df['ma10'] - df['ma50']
    11. df['ama'] = talib.MA(df['ddd'],timeperiod=10)

    BIAS

    中文名:乖离率

    计算公式:

    N日BIAS = (当日收盘价 – N日移动平均价)÷N日移动平均价×100

    1. df = pd.read_csv('E:/temp005/600660.csv',encoding='utf-8')
    2. # 删除停牌的数据
    3. df = df.loc[df['openPrice']>0].copy()
    4. df['openPrice'] = df['openPrice']*df['accumAdjFactor']
    5. df['closePrice'] = df['closePrice']*df['accumAdjFactor']
    6. df['highestPrice'] = df['highestPrice']*df['accumAdjFactor']
    7. df['lowestPrice'] = df['lowestPrice']*df['accumAdjFactor']
    8. df['ma6'] = talib.MA(df['closePrice'],timeperiod=6)
    9. df['ma12'] = talib.MA(df['closePrice'],timeperiod=12)
    10. df['ma24'] = talib.MA(df['closePrice'],timeperiod=24)
    11. df['bias'] = ((df['closePrice']-df['ma6'])/df['ma6'])*100
    12. df['bias2'] = ((df['closePrice']-df['ma12'])/df['ma12'])*100
    13. df['bias3'] = ((df['closePrice']-df['ma24'])/df['ma24'])*100

    CCI

    中文名:顺势指标

    计算过程:

    CCI(N日) = (TP-MA)÷MD÷0.015

    说明:TP = (最高价+最低价+收盘价)÷3;MA=最近N日收盘价的累计之和÷N;MD=最近N日(MA-收盘价)的累计之和÷N;0.015为计算系数;N为计算周期,默认为14天

    1. df = pd.read_csv('E:/temp005/600660.csv',encoding='utf-8')
    2. # 删除停牌的数据
    3. df = df.loc[df['openPrice']>0].copy()
    4. df['openPrice'] = df['openPrice']*df['accumAdjFactor']
    5. df['closePrice'] = df['closePrice']*df['accumAdjFactor']
    6. df['highestPrice'] = df['highestPrice']*df['accumAdjFactor']
    7. df['lowestPrice'] = df['lowestPrice']*df['accumAdjFactor']
    8. df['cci'] = talib.CCI(df['highestPrice'],df['lowestPrice'],df['closePrice'],timeperiod=14)

    W%R

    中文名:威廉指标

    计算公式:

    1. df = pd.read_csv('E:/temp005/600660.csv',encoding='utf-8')
    2. # 删除停牌的数据
    3. df = df.loc[df['openPrice']>0].copy()
    4. df['openPrice'] = df['openPrice']*df['accumAdjFactor']
    5. df['closePrice'] = df['closePrice']*df['accumAdjFactor']
    6. df['highestPrice'] = df['highestPrice']*df['accumAdjFactor']
    7. df['lowestPrice'] = df['lowestPrice']*df['accumAdjFactor']
    8. n = 10
    9. df['h_10'] = df['highestPrice'].rolling(window=n).max()
    10. df['l_10'] = df['lowestPrice'].rolling(window=n).min()
    11. df['wr10'] = ((df['h_10']-df['closePrice'])/(df['h_10']-df['l_10']))*100
    12. n2 = 6
    13. df['h_6'] = df['highestPrice'].rolling(window=n2).max()
    14. df['l_6'] = df['lowestPrice'].rolling(window=n2).min()
    15. df['wr6'] = ((df['h_6'] - df['closePrice']) / (df['h_6'] - df['l_6'])) * 100

    ROC

    中文名:变动速率指标

    计算过程:

    1)计算出ROC数值

    ROC = (当日收盘价 – N日前收盘价)÷N日前收盘价×100

    说明:N一般取值为12日

    2)计算ROC移动平均线(ROCMA)数值

    ROCMA = ROC的M日数值之和÷M

    说明:M一般取值为6日

    1. df = pd.read_csv('E:/temp005/600660.csv',encoding='utf-8')
    2. # 删除停牌的数据
    3. df = df.loc[df['openPrice']>0].copy()
    4. df['openPrice'] = df['openPrice']*df['accumAdjFactor']
    5. df['closePrice'] = df['closePrice']*df['accumAdjFactor']
    6. df['highestPrice'] = df['highestPrice']*df['accumAdjFactor']
    7. df['lowestPrice'] = df['lowestPrice']*df['accumAdjFactor']
    8. df['roc'] = talib.ROC(df['closePrice'],timeperiod=12)
    9. df['rocma'] = talib.MA(df['roc'],timeperiod=6)

    DMI

    中文名:趋向指标

    1. df = pd.read_csv('E:/temp005/600660.csv',encoding='utf-8')
    2. # 删除停牌的数据
    3. df = df.loc[df['openPrice']>0].copy()
    4. df['openPrice'] = df['openPrice']*df['accumAdjFactor']
    5. df['closePrice'] = df['closePrice']*df['accumAdjFactor']
    6. df['highestPrice'] = df['highestPrice']*df['accumAdjFactor']
    7. df['lowestPrice'] = df['lowestPrice']*df['accumAdjFactor']
    8. df['pdi'] = talib.PLUS_DI(df['highestPrice'],df['lowestPrice'],df['closePrice'],timeperiod=14)
    9. df['mdi'] = talib.MINUS_DI(df['highestPrice'],df['lowestPrice'],df['closePrice'],timeperiod=14)
    10. df['adx'] = talib.ADX(df['highestPrice'],df['lowestPrice'],df['closePrice'],timeperiod=6)
    11. df['adxr'] = talib.ADXR(df['highestPrice'],df['lowestPrice'],df['closePrice'],timeperiod=6)

    数据

    链接:https://pan.baidu.com/s/1HPkMsDDyXTEgffoAVIhbZw 
    提取码:h80x

  • 相关阅读:
    ABAP json解析使用引用代替预定义数据结构
    ✔ ★ 算法基础笔记(Acwing)(六)—— 贪心【java版本】
    android U广播详解(二)
    JavaScript遭嫌弃,“反JS”主义者兴起
    数据库应用:Windows 部署 MySQL 8.0.36
    Linux C文件操作
    Nginx解决跨域问题的一些想法
    string的底层实现
    c++数据结构算法复习基础-- 3 --线性表-单向链表-笔试面试常见问题
    Linux区分文件类型,file指令,目录权限,umask掩码,共享文件,Linux中的一些有趣指令
  • 原文地址:https://blog.csdn.net/m0_37967652/article/details/127579127