头歌实验 MA、MACD、KDJ、RSI、OBV相关指标计算及预测模型构建在线实验闯关

文章目录

第1关:移动平均线指标计算

#********** Begin **********#

#今有部分股票交易数据表“trd_data”,字段名称为:

# Stkcd    、Trddt、开盘价、最高价、最低价、收盘价、交易量、交易金额

# 读取股票代码601668,2017-01-01至2018-01-01的交易数据,

# 计算收盘价5、10、20日移动平均价格,

# 返回计算结果,结果用一个数据框ma表示,第1-3列依次为5、10、20日移动平均价格

def return_values():

    import pandas as pd

    data=pd.read_excel('trd_data.xlsx')

    d=data[data.iloc[:,0].values==601668]

    d=d[d.iloc[:,1].values>='2017-01-01']

    d=d[d.iloc[:,1].values<='2018-01-01']

    d.index=range(len(d)) #索引重新排序

    #2.移动平均线指标的计算

    ma5=d['收盘价'].rolling(5).mean() #计算5日的移动平均

    ma10=d['收盘价'].rolling(10).mean() #计算10日的移动平均

    ma20=d['收盘价'].rolling(20).mean() #计算20日的移动平均

    #3.合并数据并保存Excel表

    ma={'MA5':ma5,'MA10':ma10,'MA20':ma20}

    ma=pd.DataFrame(ma)    

    return ma

#********** End **********#

第2关:指数平滑异同平均线指标的计算

#********** Begin **********#

#今有部分股票交易数据表“trd_data”,字段名称为:
# Stkcd    、Trddt、开盘价、最高价、最低价、收盘价、交易量、交易金额
# 读取股票代码601668,2017-01-01至2018-01-01的交易数据,
# 计算MACD指标,公式参考书本
# 返回计算结果,结果用一个数据框macd表示。
#注意:读取的交易数据表,需按照日期的升序进行排序
def return_values():
    import pandas as pd
    data=pd.read_excel('trd_data.xlsx')#题目数据
    d=data[data.iloc[:,0].values==601668]
    d=d[d.iloc[:,1].values>='2017-01-01']
    d=d[d.iloc[:,1].values<='2018-01-01']
    d.index=range(len(d)) #索引重新排序
    #2.平滑异同平均线MACD指标值
    import numpy as np
    #指数平滑移动平均
    ema12=pd.DataFrame.ewm(d['收盘价'],span=12).mean() 
    ema26=pd.DataFrame.ewm(d['收盘价'],span=26).mean()
    dif=ema12-ema26
    dea=np.zeros((len(dif))) #以dif为长度做全为0的数组
    macd=np.zeros((len(dif)))
    
    for t in range(len(dif)):
        if t==0:
            dea[t]=dif[t]
        if t>0:
            dea[t]=(2*dif[t]+8*dea[t-1])/10
        macd[t]=2*(dif[t]-dea[t])
    #3.合并数据并保存Excel表 
    macd={'MACD':macd}
    macd=pd.DataFrame(macd) 
    
    
    
    return macd

#********** End **********#

第3关:随机指标K、D、J的计算

#********** Begin **********#

#今有部分股票交易数据表“trd_data”,字段名称为:

# Stkcd    、Trddt、开盘价、最高价、最低价、收盘价、交易量、交易金额

# 读取股票代码601668,2017-01-01至2018-01-01的交易数据,

# 计算KDJ指标,公式参考书本

# 返回计算结果,结果用一个数据框KDJ表示,

# 其中第1列为交易日期,2-4列分别为K、D、J指标值

#注意:读取的交易数据表,需按照日期的升序进行排序

def return_values():

    import pandas as pd

    A = pd.read_excel('trd_data.xlsx')#题目数据

    d=A[A.iloc[:,0].values==601668]

    d=d[d.iloc[:,1].values>='2017-01-01']

    d=d[d.iloc[:,1].values<='2018-01-01']

    d.index=range(len(d)) #索引重新排序

    #2.平滑异同平均线MACD指标值

    #计算移动周期内的最大值和最小值

    import numpy as np

    Lmin=d['最低价'].rolling(9).min() #周期数为9

    Lmax=d['最高价'].rolling(9).max()

    rsv=(d['收盘价'].values-Lmin)/(Lmax-Lmin)

    K=np.zeros((len(rsv)))

    D=np.zeros((len(rsv)))

    J=np.zeros((len(rsv)))

    for t in range(9,len(d)):

        if t==0:

            K[t]=rsv[t]

            D[t]=rsv[t]

        if t>0:

            K[t]=2/3*K[t-1]+1/3*rsv[t]

            D[t]=2/3*D[t-1]+1/3*K[t]

        J[t]=3*D[t]-2*K[t]

    #3.合并数据并保存Excel表

    kdj={'D':D,'J':J,'K':K}

    kdj=pd.DataFrame(kdj)

    date={'交易日期':d['Trddt'].values}

    date=pd.DataFrame(date)

    KDJ=date.join(kdj)

   

   

    return KDJ

#********** End **********#

第4关:计算相对强弱RSI指标

# -*- coding: utf-8 -*-

#今有部分股票交易数据表“trd_data”,字段名称为:

# Stkcd 、Trddt、开盘价、最高价、最低价、收盘价、交易量、交易金额

# 读取股票代码601668,2017-01-01至2018-01-01的交易数据,

#计算出的三个指标RSI6、RSI12、RSI24用数据框Data储存

#Data的前三列的指标数分别为RSI6、RSI12、RSI24,

'''注意:读取的交易数据表,需按照日期的升序进行排序,即:2017年开始日期到结束日期,不按照命名要求进行命名

则无法检测答题结果是否准确'''

def return_values():

    import pandas as pd

    A = pd.read_excel('trd_data.xlsx')#题目数据

    a1=A['Trddt'].values>='2017-01-01'

    a2=A['Trddt'].values<='2017-12-31'

    data1=A.iloc[a1&a2,:].sort_values('Trddt')

    data1=data1.loc[data1['Stkcd']==601668,:]

    data1.index=range(len(data1))  #规范索引

    #预定义涨跌标识向量z

    import numpy as np

    z=np.zeros(len(data1)-1)

    #涨跌标识向量赋值

    z[data1.iloc[1:,5].values-data1.iloc[0:-1,5].values>=0]=1 #涨

    z[data1.iloc[1:,5].values-data1.iloc[0:-1,5].values<0]=-1 #跌

    #涨情况统计

    zhang=pd.Series(z==1) #转化为序列

    #6天移动计算涨数

    zhang1=zhang.rolling(6).sum()

    zhang1=zhang1.values   #转化为数组

    #12天移动计算涨数

    zhang2=zhang.rolling(12).sum()

    zhang2=zhang2.values   #转化为数组

    #24天移动计算涨数

    zhang3=zhang.rolling(24).sum()

    zhang3=zhang3.values   #转化为数组

    #跌情况统计

    die=pd.Series(z==-1) #转化为序列

    #6天移动计算跌数

    die1=die.rolling(6).sum()

    die1=die1.values   #转化为数组

    #12天移动计算跌数

    die2=die.rolling(12).sum()

    die2=die2.values   #转化为数组

    #24天移动计算跌数

    die3=die.rolling(24).sum()

    die3=die3.values   #转化为数组

    #RSI指标计算

    rsi6=np.zeros((len(data1)))

    rsi12=np.zeros((len(data1)))

    rsi24=np.zeros((len(data1)))

    for t in range(6-1,len(data1)-1):

        rsi6[t]=zhang1[t]/(zhang1[t]+die1[t])

    for i in range(12-1,len(data1)-1):

        rsi12[i]=zhang2[i]/(zhang2[i]+die2[i])  

    for j in range(24-1,len(data1)-1):

        rsi24[j]=zhang3[j]/(zhang3[j]+die3[j])

    #将计算出的指标与交易日期利用字典整合起来

    rsi={'RSI6':rsi6,'RSI12':rsi12,'RSI24':rsi24}

    rsi=pd.DataFrame(rsi)    

    date={'交易日期':data1['Trddt'].values}

    date=pd.DataFrame(date)

    RSI=date.join(rsi)

   

    return RSI


第5关:乖离率指标BIAS的计算

#今有部分股票交易数据表“trd_data”,字段名称为:

# Stkcd 、Trddt、开盘价、最高价、最低价、收盘价、交易量、交易金额

# 读取股票代码601668,2017-01-01至2018-01-01的交易数据

#计算出的三个指标Bias5、Bias10、Bias520用数据框Data储存

#Data的前三列的指标数分别为Bias5、Bias10、Bias520,请按照左侧提供的公式进行计算。

#注意:读取的交易数据表,需按照日期的升序进行排序

def return_values():

    import pandas as pd

    A = pd.read_excel('trd_data.xlsx')#题目数据

    data=A

    a1=data['Trddt'].values>='2017-01-01'

    a2=data['Trddt'].values<='2017-12-31'

    data1=data.iloc[a1&a2,:].sort_values('Trddt')

    data1=data1.loc[data1['Stkcd']==601668,:]

    data1.index=range(len(data1))

    #预定义乖利率指标

    import numpy as np

    bias5=np.zeros((len(data1)))

    bias10=np.zeros((len(data1)))

    bias20=np.zeros((len(data1)))

   

    #计算5天移动平均价格和BIAS指标计算

    man5=data1.iloc[:,5].rolling(5).mean()

    for t in range(5-1,len(data1)):

        bias5[t]=(data1.iloc[t,5]-man5[t])/man5[t]

   

    #计算10天移动平均价格和BIAS指标计算

    man10=data1.iloc[:,5].rolling(10).mean()

    for i in range(10-1,len(data1)):

        bias10[i]=(data1.iloc[i,5]-man10[i])/man10[i]

   

    #计算20天移动平均价格和BIAS指标计算

    man20=data1.iloc[:,5].rolling(20).mean()

    for j in range(20-1,len(data1)):

        bias20[j]=(data1.iloc[j,5]-man20[j])/man20[j]

       

    #将计算出的指标与交易日期利用字典整合起来

    bias={'BIAS5':bias5,'BIAS10':bias10,'BIAS20':bias20}

    bias=pd.DataFrame(bias)  

    Data = bias

   

    return Data

第6关:能量潮指标OBV的计算

#今有部分股票交易数据表“trd_data”,字段名称为:

# Stkcd 、Trddt、开盘价、最高价、最低价、收盘价、交易量、交易金额

# 读取股票代码601668,2017-01-01至2017-12-31的交易数据

#计算能量潮OBV指标,请根据左边所提供的公式来进行计算

#能量潮指标OBV的计算结果用一个数据框L来表示,

#注意:读取的交易数据表,需按照日期的升序进行排序

def result():

    import pandas as pd

    A = pd.read_excel('trd_data.xlsx')#题目数据

    data=A

    a1=data['Trddt'].values>='2017-01-01'

    a2=data['Trddt'].values<='2017-12-31'

    data1=data.iloc[a1&a2,:].sort_values('Trddt')

    data1=data1.loc[data1['Stkcd']==601668,:]

    data1.index=range(len(data1))

    #预定义能量潮指标

    import numpy as np

    obv=np.zeros((len(data1)))

    for t in range(len(data1)):

        if t==0:

            obv[t]=data1['交易量'].values[t]

        if t>0:

            if data1['收盘价'].values[t]>=data1['收盘价'].values[t-1]:

                obv[t]=obv[t-1]+data1['交易量'].values[t]

            if data1['收盘价'].values[t]<data1['收盘价'].values[t-1]:

                obv[t]=obv[t-1]-data1['交易量'].values[t]

               

    #将计算出的能量潮指标与交易日期利用字典整合起来

    obv={'OBV':obv}

    obv=pd.DataFrame(obv)  

    L=obv

    return L


第7关:涨跌趋势指标的定义及计算

#今有部分股票交易数据表“trd_data”,字段名称为:

# Stkcd 、Trddt、开盘价、最高价、最低价、收盘价、交易量、交易金额

# 读取股票代码601668,2017-01-01至2018-01-01的交易数据

'''计算出涨跌趋势指标其方法如下:下一日收盘价减去当日收盘价,

若大于0,则下日股价呈现上涨趋势,用1表示,反之则股价呈现下跌趋势,用-1表示'''

#计算结果用数据框Y进行储存,

#注意:读取的交易数据表,需按照日期的升序进行排序

def result():

    import pandas as pd

    A = pd.read_excel('trd_data.xlsx')#题目数据

    data=A

    a1=data['Trddt'].values>='2017-01-01'

    a2=data['Trddt'].values<='2017-12-31'

    data1=data.iloc[a1&a2,:].sort_values('Trddt')

    data1=data1.loc[data1['Stkcd']==601668,:]

    data1.index=range(len(data1))

    #预定义因变量y和标识变量z

    import numpy as np

    y=np.zeros((len(data1)))

    z=np.zeros((len(y)-1))

    for t in range(len(z)):

        z[data1.iloc[1:,5].values-data1.iloc[0:-1,5].values>0]=1 #涨

        z[data1.iloc[1:,5].values-data1.iloc[0:-1,5].values==0]=0 #平

        z[data1.iloc[1:,5].values-data1.iloc[0:-1,5].values<0]=-1 #跌

        y[t]=z[t]

    Y={'涨跌趋势':y}

    Y=pd.DataFrame(Y)

    return Y

第8关:基于技术指标的股票价格涨跌趋势预测模型的构建(支持向量机模型)

#请结合前几题所计算出的各种指标,构建出股票价格涨跌趋势预测模型

#将指标与交易日期以及股价的涨跌趋势整合起来

##提取训练(1-11月)和测试数据(12月)

#数据标准化

#支持向量机模型

#计算模型准确率和预测准确率分别用sc和Rs储存,模型实用支持向量机模型

#若不按照命名要求进行命名则无法检测答题结果是否准确

def result():

    import pandas as pd

    data1=pd.read_excel('Y.xlsx')  #跌涨趋势指标

    data1.drop('Unnamed: 0', axis=1, inplace=True)

    data2=pd.read_excel('MA.xlsx') #移动平均线指标

    data2.drop('Unnamed: 0', axis=1, inplace=True)

    data3=pd.read_excel('MACD.xlsx') #平滑异同平均线指标

    data3.drop('Unnamed: 0', axis=1, inplace=True)

    data4=pd.read_excel('KDJ.xlsx')  #随机指标

    data4.drop('Unnamed: 0', axis=1, inplace=True)

    data5=pd.read_excel('RSI.xlsx')  #相对强弱指标

    data5.drop('Unnamed: 0', axis=1, inplace=True)

    data6=pd.read_excel('BIAS.xlsx') #乖离率指标

    data6.drop('Unnamed: 0', axis=1, inplace=True)

    data7=pd.read_excel('OBV.xlsx')  #能量潮指标

    data7.drop('Unnamed: 0', axis=1, inplace=True)

    #将指标与交易日期以及股价的涨跌趋势整合起来

    zh=pd.concat([data3,data4,data5,data6,data7,data1],axis=1)

    zh.drop('交易日期',axis=1,inplace=True)

    zh=pd.concat([data2,zh],axis=1)

    zh1=zh.dropna()

    #提取训练和测试数据

    x1=zh1['交易日期']<='2017-11-30'

    index=x1.values==True

    index1=x1.values==False

    x_train=zh1.iloc[index,1:15]

    y_train=zh1.iloc[index,15]

    x_test=zh1.iloc[index1,1:15]

    y_test=zh1.iloc[index1,15]

    #数据标准化

    from sklearn.preprocessing import StandardScaler

    scaler = StandardScaler()

    scaler.fit(x_train)

    x_train=scaler.transform(x_train)

    x_test=scaler.transform(x_test)

   

    #支持向量机模型

    from sklearn import svm

    clf= svm.SVC(kernel='rbf', C=5)

    clf.fit(x_train,y_train)

    sc=clf.score(x_train,y_train)

    result=clf.predict(x_test)

    Z=result-y_test

    Rs=len(Z[Z==0])/len(Z)

   

    return [sc,Rs]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值