julia-计算k线的【相对强弱指标RSI】

2020-12-31  本文已影响0人  昵称违法

一、RSI指标介绍

相对强弱指标RSI 是由韦尔斯.怀尔德(Welles Wilder)提出的,是衡量证券自身内在相对强度的指标。 RSI指标是韦尔斯.怀尔德首创的,发表在他的《技术交易系统新思路》一书中。(1978年版)

相对强弱指数RSI是根据一定时期内上涨和下跌幅度之和的比率制作出的一种技术曲线。能够反映出市场在一定时期内的景气程度。

二、原理

相对强弱指标RSI是用以计测市场供需关系和买卖力道的方法及指标。

计算公式:

N日RSI =N日内收盘涨幅的平均值/(N日内收盘涨幅均值+N日内收盘跌幅均值) ×100

由上面算式可知RSI指标的技术含义,即以向上的力量与向下的力量进行比较,若向上的力量较大,则计算出来的指标上升;若向下的力量较大,则指标下降,由此测算出市场走势的强弱。

三、计算公式

image.png
LC:=REF(CLOSE,1);
RSI1:SMA(MAX(CLOSE-LC,0),N1,1)/SMA(ABS(CLOSE-LC),N1,1)*100;
RSI2:SMA(MAX(CLOSE-LC,0),N2,1)/SMA(ABS(CLOSE-LC),N2,1)*100;
RSI3:SMA(MAX(CLOSE-LC,0),N3,1)/SMA(ABS(CLOSE-LC),N3,1)*100;

四、julia计算代码

函数的定义


"""
功能:通达信版本的SMA函数
SMA(X,N,M) 求X的N个周期内的扩展指数加权移动平均。M为权重。
输出:Array{Float64,1}
"""
function SMA(X::Array, N::Int64, M::Int64)
    res = Array{Float64,1}(undef, length(X))
    Y::Float64 = 0.0

    #第一初始值
    res[1] = X[1]
    Y = X[1]

    #第二个值到结束的计算
    for (i, x) in zip(2:length(X), X[2:end])  #从第二个开始处理
        Y = (M * x + (N - M) * Y) / N
        res[i] = Y
    end
    return res
end

"""
引用ary在N个周期前的值,本初相当于shift的功能
N取值范围:下界:1 上界:lengh(myary) - 1
第一个元素,没有前面的值,返回missing

====测试代码====
ary1 = [1,2,3,4,5,6,7,8,9,10]
ary2 = ["1","2","3","4","5"]
REF(ary1,1) |> println
REF(ary2,-1) |> println
REF(ary2,11) |> println
"""
function REF(myary::Array{Any},n::Int)
    if (n <= 0)|(n > length(myary) - 1 )
        throw("n的值应该大于0,且小于$(length(myary))")
    end

    result = Array{Any,1}(undef, length(myary)) #适用多种类型
    for i in 1:length(myary)
        if 1 <= i-n <= length(myary)            #第二个到最后一个元素
            result[i] = myary[i-n]
        else                                    #第一个元素
            #result[i] = missing
            result[i] = myary[1]
        end
    end
    return result
end


"""
取最大值,MAX(A,B),取A、B中较大者,如果A=B返回A or B
注意,该函数A为数组,B为float数值

====测试代码====
MAX([1,2,3,34,4,missing] , 5.0)
MAX([1,2,3,34,4.0] , 5.0)
MAX([1,2,2,3,3,7,6],4.0)
MAX([1,2,2,3,3,7,6],4)
"""
function MAX(ary::Array, n::Number)
    ary .|> item -> begin
        if ismissing(item)
            NaN
        elseif isnan(item)
            NaN
        else
            if item >= n
                item
            else
                n
            end
        end
    end
end


"""
相对强弱指标:RSI

计算方式参照:通达信软件 RSI指标计算方法
LC:=REF(CLOSE,1);
RSI1:SMA(MAX(CLOSE-LC,0),N1,1)/SMA(ABS(CLOSE-LC),N1,1)*100;
RSI2:SMA(MAX(CLOSE-LC,0),N2,1)/SMA(ABS(CLOSE-LC),N2,1)*100;
RSI3:SMA(MAX(CLOSE-LC,0),N3,1)/SMA(ABS(CLOSE-LC),N3,1)*100;
默认参数:N1 = 6,  N2 = 12,  N3 = 24

"""
function RSI(CLOSE,N1,N2,N3)
    ABS = abs

    LC=REF(CLOSE,1)
    RSI1=SMA(MAX(CLOSE .- LC,0),N1,1)./SMA(ABS.(CLOSE.-LC),N1,1)*100
    RSI2=SMA(MAX(CLOSE .- LC,0),N2,1)./SMA(ABS.(CLOSE.-LC),N2,1)*100
    RSI3=SMA(MAX(CLOSE .- LC,0),N3,1)./SMA(ABS.(CLOSE.-LC),N3,1)*100
    return(RSI1 = RSI1,RSI2 = RSI2,RSI3 = RSI3)
end

五、测试

file = "D:/回测集成/通达信导出的k线/603019RSI指标验证.xlsx"
sheet = "603019"
df = DataFrame(XLSX.readtable(file,sheet)...)

N1 = 6
N2 = 12
N3 = 24
CLOSE = df.收盘
res = RSI(df.收盘,N1,N2,N3)
res.RSI1 .|> println
res.RSI2 .|> println
res.RSI3 .|> println

df.rs1新  = res.RSI1
df.rs2新  = res.RSI2
df.rs3新  = res.RSI3
CSV.write("data/ris.csv",df)

六、结果观察

说明:列RSI.RSI1,RSI.RSI1,RSI.RSI1 为通达信软件自己计算的的rsi指标,rs1新,rs2新,rs3新,为jualia函数计算的指标,根据对比,完全吻合。

image.png

七、改进

数据量大的话,用并行计算。

上一篇 下一篇

猜你喜欢

热点阅读