量化交易——传统技术分析随机震荡指标STO的原理及实现

随机震荡指标STO(KD)

与MACD类似的是,STO同样地使用了两条曲线来表示,不同的是STO的曲线范围限制在0到100之间。在设计的过程当中,其不仅要研究其收市价,同时还要包括近期所出现过的最高价及最低价等。这样的设计可以综合了动量观念和RSI及移动平均线的各个优点。作为一款动量技术分析方法,其主要的目的是判断是否进入了超买或超买的状态,从而帮助投资者预知价格逆转的时机。

实现

分析过程可以参考前面的博文,量化交易——传统技术分析相对强弱指数RSI的原理及实现,这里不细讲。 
STO计算公式(维基解释): 
这里写图片描述 
相关代码:

import numpy as np
import math
import random
import json
import matplotlib.pyplot as plt
import sys
sys.setrecursionlimit(10000)

#date|open|high|low|close|volume|adjsuted 

def get_stock_hist(num):
    s_his=np.genfromtxt('C:/Users/Haipeng/Desktop/python/Korea/Korea_{:03d}.csv'.format(num), delimiter=',')
    s_hi=s_his[1:][:]
    days=s_hi.shape[0]
    this_stock = []
    for i in range(1,days,1):
        this_day = [i]
        for k in range(1,7):
            this_day.append(s_hi[i][k])
        this_stock.append(this_day)
    print 'Maximum date is ',len(this_stock)
    return this_stock

def get_price(D, p_tpe):
    if p_tpe=='close':
        pos=4;
    elif p_tpe=='open':
        pos=1;
    elif p_tpe=='high':
        pos=2;
    elif p_tpe=='low':
        pos=3;
    else:
        pos=5
    price=stock_hist[D-1][pos];
    return price

def get_ma(D, N):
    p_used=np.zeros(N);
    for i in range(1,N+1,1):
        p_used[i-1]=stock_hist[(D-1)-(i-1)][4];
    ma=np.mean(p_used);
    return ma

def get_mar(fro,to,N):
    ma = []
    for i in range(fro,to+1):
        ma.append(get_ma(i,N))
    return ma
#Date\Open\High\Low\Close
def get_tuples(fro,to):
    res =[]
    for d in range(fro,to+1):
        tmp = []
        tmp.append(d)
        tmp.append(get_price(d,'open'))
        tmp.append(get_price(d,'high'))
        tmp.append(get_price(d,'low'))
        tmp.append(get_price(d,'close'))        
        res.append(tmp)
    return res

def get_volume(fro,to):
    res = []
    for d in range(fro,to+1):
        num = 1
        try:
            if get_price(d,'close')<get_price(d-1,'close'):
                num = -1
        except:
            pass
        res.append(num*get_price(d,'volume'))
    return res  

#STO实现
def get_STO(D,N):
    a = 1.0/3
    def get_H_L(D,N):
        high = 0
        low = 0
        for i in range(N):
            high = max(high,get_price(D-i,'high'))
            low = min(low,get_price(D-i,'low'))
        return [high,low]
    def get_K(D,N):
        high = get_H_L(D,N)[0]
        low = get_H_L(D,N)[1]
        RSV = 100*(get_price(D,'close')-low)/(high-low)
        if D==N:
            return a*RSV+(1-a)*50
        else:
            return a*RSV+(1-a)*get_K(D-1,N)
    def get_D(D,N):
        if D==N:
            return a*get_K(D,N)+(1-a)*50
        else:
            return a*get_K(D,N)+(1-a)*get_D(D-1,N)

    K = get_K(D,N)
    D = get_D(D,N)
    return [K,D]
def get_sto(fro,to):
    res = [[],[]]
    for d in range(fro,to+1):
        res[0].append(get_STO(d,9)[0])
        res[1].append(get_STO(d,9)[1])
    return res

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108

由以上按照定义实现的函数get_STO可以获取某一天的sto数据,再调用get_sto便可以获得一段日期内的数据列。可是由于get_STO中包含了多个递归函数,导致如果获取某段日期内的数据列时要重复多次递归调用,非常的低效率。故而整合以上两函数,可以以下面的函数get_STO_r来代替,将会大大提高计算速度:

def get_STO_r(fro,to,N):
    a = 1.0/3
    def get_H_L(D,N):
        high = 0
        low = 0
        for i in range(N):
            high = max(high,get_price(D-i,'high'))
            low = min(low,get_price(D-i,'low'))
        return [high,low]
    def get_K(D,N):
        if D<=N:
            return 50
        high = get_H_L(D,N)[0]
        low = get_H_L(D,N)[1] 
        RSV = 100*(get_price(D,'close')-low)/(high-low)
        return a*RSV+(1-a)*get_K(D-1,N)
    K_res = []
    for d in range(1,to+1):
        K_res.append(get_K(d,N))
    D_res = []
    for i in range(to):
        if i==0:
            D_res.append(50)
        else:
            D_res.append(a*K_res[i]+(1.0-a)*D_res[-1])

    K = K_res[fro-1:]
    D = D_res[fro-1:]
    return [K,D]
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

绘制k线图及STO指标

绘图代码:

def plot_STO(fro,to):
    volume = get_volume(fro,to)
    tmp = get_STO(fro,to,9)
    K9 = tmp[0]
    D9 = tmp[1]
    ma5 = get_mar(fro,to,5)
    ma10 = get_mar(fro,to,10)
    ma20 = get_mar(fro,to,20)
    tuples = get_tuples(fro,to)
    date = [d for d in range(fro,to+1)] 

    fig = plt.figure(figsize=(8,5))
    p1 = plt.subplot2grid((5,4),(0,0),rowspan=3,colspan=4,axisbg='k') 
    p1.set_title("Stochastic Oscillator(STO)")
    p1.set_ylabel("Price")
    p1.plot(date,ma5,'m')
    p1.plot(date,ma10,'b')
    p1.plot(date,ma20,'y')
    p1.legend(('MA5','MA10','MA20'))
    p1.grid(True,color='w')
    candlestick_ohlc(p1, tuples, width=0.7,colorup='r',colordown="g")

    p2 = plt.subplot2grid((5,4),(3,0),colspan=4,axisbg='c') 
    p2.set_ylabel("Volume")
    colors = []
    for i in range(len(volume)):
        if volume[i]<0:
            colors.append('green')
            volume[i] = -volume[i]
        else:
            colors.append('red')
    p2.bar(date,volume,color=colors)

    p3 = plt.subplot2grid((5,4),(4,0),colspan=4,axisbg='m') 
    p3.set_ylabel("STO")
    p3.set_xlabel("Dates")
    p3.plot(date,K9, 'r-')
    p3.plot(date,D9, 'g-')
    p3.legend(('K9','D9'),loc='upper left')
    plt.subplots_adjust(hspace=0)
    plt.show()# show the plot on the screen

stock_hist = get_stock_hist(18)
plot_STO(200,800)
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

可得图1:

这里写图片描述 
为了看到更清晰,可缩短时间范围:

#例如,可得图2
plot_STO(420,520)
 
 
  • 1
  • 2
  • 1
  • 2

这里写图片描述


(完)


























































到李珊珊手里面嘅剪子,直觉话畀我知就走呀,但系都冇,等我企起身嚟,李珊珊已经畀旁边嗰两个女仔拽住咗我只手。
跟住就睇李珊珊揸住剪子一步一步走向我,我心惊恐咁谮气,因为我唔知佢究竟要对我做乜。

http://blog.renren.com/share/937444433/18095706897
但系睇李珊珊呢面色,我一定又要挨打,但系,我真系百口莫辩,

http://blog.renren.com/share/937444433/18095706958


就睇下佢好嚤佗嘅行到我隔离,然后缓缓噉踎低咗

http://blog.renren.com/share/937444433/18095706963

身体,同我视线保持一致,冻噉望住我。
http://blog.renren.com/share/937444433/18095704727

喺我眼前吊吊揈,晃到我心惊肉跳。
http://blog.renren.com/share/937444433/18095704799

耐唔耐嘅惨叫声,李珊珊手里揸住剪子,
http://blog.renren.com/share/937444433/18095706786

打的头晕目眩,
成个女仔厕所都回荡住我
http://blog.renren.com/share/937444433/18095706803

真系同刘子恒冇咩,点解同佢解释,佢就系唔信?
http://blog.renren.com/share/937444433/18095706813
就听飞啦,一声,我嘅外套就畀划开咗个大口子,夏天本就着得单薄,佢呢几剪子落去,我呢件衫算系冧咗。

http://blog.renren.com/share/937444433/18095706892

好,虽然唔知具体嘅做乜嘅,但系佢好有钱,我曾经见过几次佢哋屋企司机嚟接佢放学,
http://blog.renren.com/share/937444433/18095706885
呢期间呢,我挣扎咗几次,但系换来嘅都系一埲掌。我畀人
我知李珊珊嘅家庭嘢好

http://blog.renren.com/share/937444433/18095706980嗰部车,一睇就价值唔菲。
如果佢真系想对我做啲咩,惊系我呢个蚀都只能够硬生生受咗,话晒我嘅家庭同佢存在嘅简直系差天共地……

月白色嘅衬衫同嗰啲漆黑嘅剪子形成咗鲜明嘅对比,此刻嘅李珊珊狰狞噉睇得
http://blog.renren.com/share/937444433/18095706866喊呀?

喊咩,我又冇要对你点呀,童倩你知

http://blog.renren.com/share/937444433/18095706828

唔知呀?就你呢种柔柔弱弱扮可怜噉最畀我核突!”

http://blog.renren.com/share/937444433/18095706821
剔住我嗰两个女仔仲耐不耐嘅狠狠捻我两下。
http://blog.renren.com/share/937444433/18095706875

珊珊睇我流眼泪,忽然都唔敢相想到屋企,唔知你爸爸而家啲嘢点,眼泪瞬间就溢满咗眼眶。

http://blog.renren.com/share/937444433/18095705341

,掂笔甩嘅朝我扑过嚟,就
http://blog.renren.com/share/937444433/18095705331
变得孟起,身心骤然变得好大,猛喺我耳边响起,我
http://blog.renren.com/share/937444433/18095704689

似踩到佢痛处一样,回手就咗我一巴掌,猛捉住我衣领冷笑。
http://blog.renren.com/share/937444433/18095704699

我眼光光噉望住佢

http://blog.renren.com/share/937444433/18095705320

可怜,我真系同刘子恒
http://blog.renren.com/share/937444433/18095705310

唔紧要,求吓你畀我走啦。”
http://blog.renren.com/share/937444433/18095705301

,细声同佢解释“我冇扮柔弱,我都冇扮

http://blog.renren.com/share/937444433/18095704207

李珊珊听到我讲刘子恒更加系好

http://blog.renren.com/share/937444433/18095704220
信平时睇落娇弱嘅李珊珊可以嗌咁大声。

http://blog.renren.com/share/937444433/18095699644

「唔紧要?唔紧要,佢点解帮你

你都http://blog.renren.com/share/937444433/18095699645

唔睇下自己系咩德行,恃

,边个嘅男人,你都唔睇下就够胆勾.引?我今日如果唔畀你啲教训,

http://blog.renren.com/share/937444433/18095705295自己生

得有点样你仲真系以为我好虾系唔系啊?”

http://blog.renren.com/share/937444433/18095699642

李珊珊语速极快嘅讲完,然后对剔住我两个女仔讲好掹住我,唔好畀我走喇。
嗰两个女仔系呵呵笑住应承,然后更加大力嘅剔住我两条手臂,我觉得自己好似要畀佢哋两个畀撕扯开咗一样。
李珊珊揸住剪子行过嚟,剔死我嘅衫就借咗落去,我惊到大喊唔好,但系就根本冇可以阻止都佢能力。
就听飞啦,一声,我嘅外套就畀划开咗个大口子,夏天本就着得单薄,佢呢几剪子落去,我呢件衫算系冧咗。
月白色嘅衬衫同嗰啲漆黑嘅剪子形成咗鲜明嘅对比,此刻嘅李珊珊狰狞噉睇得我心一埲一埲惊。
我甚至都唔敢挣扎,因为我惊佢剪子下一秒就悲痛到飞起……
而且呢件衫,系我为数唔多得着嘅出嚟嘅,不过而家竟然就畀李珊珊畀剪到咗破布。

http://blog.renren.com/share/937444433/18095699557

搬屋?唔紧要,佢点解对你咁好?
http://blog.renren.com/share/937444433/18095699559

直接拮喺我肉上,我眼光光噉望住佢将我嘅衫剪到一条一条嘅布条,心
http://blog.renren.com/share/937444433/18095699595
李珊珊疯狂嘅撕扯我嘅衫,剔住我嗰两个女仔哈哈大笑,

http://blog.renren.com/share/937444433/18095707351
一切嘅一切听到我耳仔里便,咁笑声睇都系一啲匕首,

http://blog.renren.com/share/937444433/18095707351

凌迟住我本身就脆弱乱不堪嘅心。
我嘅衬衫畀李珊珊剪嘅支离破碎,佢忽然伸手去嗲我身

http://blog.renren.com/share/937444433/18095706989

我都唔知边度嚟嘅心机同勇气,出力嘅挣开咗剔住我右手嘅女仔,然后连滚带爬嘅朝门口冲过去。

http://blog.renren.com/share/937444433/18095706997

我唔就咁认佢宰割,如果一阵佢将我

http://blog.renren.com/share/937444433/18095705346
上著嘅长裙,手里嘅剪子眼睇住就撞到咗我条裙,上咗。
http://blog.renren.com/share/937444433/18095704718
身上嘅衫全部剪穿了,我

http://blog.renren.com/share/937444433/18095706989
要点行出个厕所,返去?

http://blog.renren.com/share/937444433/18095707377

挣脱嘅一嗰两个女仔系呵呵笑住应承,然后更加大力嘅剔住我两条手臂,我觉得自己好似要畀佢哋两个畀撕扯开咗一样。
李珊珊揸住剪子行过嚟,剔死我嘅衫就借咗落去,我惊到大喊唔好,但系就根本冇可以阻止都佢能力。
我心一埲一埲惊。
我甚至都唔敢挣扎,因为我惊佢剪子下一秒就悲痛到飞起……

http://blog.renren.com/share/937444433/18095707343

瞬间,李珊珊手里揸住嘅剪

子一阵间拮到我隔离嘅书包上,佢

http://blog.renren.com/share/937444433/18095705346
嗰两个女仔系呵呵笑住应承,然后更加大力嘅剔住我两条手臂,我觉得自己好似要畀佢哋两个畀撕扯开咗一样。
李珊珊揸住剪子行过嚟,剔死我嘅衫就借咗落去,我惊到大喊唔好,但系就根本冇可以阻止都佢能力。
就听飞啦,一声,我嘅外套就畀划开咗个大口子,夏天本就着得单薄,佢呢几剪子落去,我呢件衫算系冧咗。
月白色嘅衬衫同嗰啲漆黑嘅剪子形成咗鲜明嘅对比,此刻嘅李珊珊狰狞噉睇得我心一埲一埲惊。
我甚至都唔敢挣扎,因为我惊佢剪子下一秒就悲痛到飞起……nren.com/share/937444433/18095704718
睇我挣脱,立马厉声嘅朝住个女仔哮条“拽住佢!”

http://blog.renren.com/share/937444433/18095707351

嗰个女仔都立马反应过嚟
http://blog.renren.com/share/937444433/18095707351

喺我以为我绝对走嘅
睇到佢我

http://blog.renren.com/share/937444433/18095704918

出去嗰阵。门外就忽然又入咗个女仔。
http://blog.renren.com/share/937444433/18095704890

个心就沉,系嘅,李珊珊佢哋系四个人,我点将呢个畀忘掉。
http://blog.renren.com/share/937444433/18095704549

嗰一脚踹嘅极重,我痛嘅几
http://blog.renren.com/share/937444433/18095704557

后面走嚟拉我嘅女仔直接就将我按喺咗地下。
http://blog.renren.com/share/937444433/18095704574

乎背到气去,身子一弯,
http://blog.renren.com/share/937444433/18095704597

仔睇我正朝门口行去,觇

http://blog.renren.com/share/937444433/18095704657

高就系一脚,重重嘅踹到咗我小肚子上。
http://blog.renren.com/share/937444433/18095704667

,几乎系一瞬间冷汗就顺着额角流晒落嚟。
http://blog.renren.com/share/937444433/18095704680

嗰个女

http://blog.renren.com/share/937444433/18095699648
痛如潮水一般袭来,肚上好似有一把刀,而家剜肉一样痛

http://blog.renren.com/share/937444433/18095699647

正到嗰阵李珊珊都走嚟,拽住我啲头发恶死能登嘅

http://blog.renren.com/share/937444433/18095699646

话“小婊.子仲想走,你好犀利呀?睇嚟我对你都太仁慈啦系嘛?”
一路讲,
http://blog.renren.com/share/937444433/18095699648


























































  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MATLAB中实现机械臂的仿真可以使用Robotic System Toolbox来进行。Robotic System Toolbox包含许多工具和函数,可以实现机械臂的建模、控制和仿真。 首先,需要定义机械臂的模型。可以使用robotics.RigidBodyTree类来创建机械臂的刚体树结构。通过添加关节和刚体可以构建机械臂的结构。可以使用函数robotics.RigidBody来创建刚体,并使用函数robotics.Joint来创建关节。 接下来,可以使用robotics.RigidBodyTree类中的函数来定义机械臂的初始状态。可以设置每个关节的初始位置和速度。 然后,可以使用robotics.RigidBodyTree类中的函数来进行机械臂的运动控制。可以使用函数robotics.InverseKinematics来实现逆运动学,根据目标位置和姿态来求解关节角度。可以使用函数robotics.CartesianTrajectory来生成机械臂的轨迹,指定起始和目标位置以及运动时间。 最后,可以使用robotics.RigidBodyTree类中的函数来进行机械臂的仿真。可以使用函数robotics.Rate来指定仿真的频率,然后使用循环来更新机械臂的状态和控制输入,实现机械臂的运动。 以下是一个基本的机械臂仿真的示例代码: ```matlab % 创建机械臂模型 robot = robotics.RigidBodyTree; % 添加机械臂的关节和刚体 % 设置机械臂的初始状态 % 运动控制 % 仿真循环 % 绘制机械臂的运动轨迹 ``` 在实际的机械臂仿真中,可能还需要考虑机械臂的动力学、碰撞检测和路径规划等问题。可以使用Robotic System Toolbox中的其他工具和函数来处理这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值