1. 程式人生 > >震蕩指標(一)RSI指標

震蕩指標(一)RSI指標

現在 num 商品 sta bsp 信號 量化交易 就會 函數

相對強弱指數RSI是根據一定時期內上漲點數和漲跌點數之和的比率制作出的一種技術曲線。能夠反映出市場在一定時期內的景氣程度。由威爾斯.威爾德(Welles Wilder)最早應用於期貨買賣,後來人們發現在眾多的圖表技術分析中,強弱指標的理論和實踐極其適合於股票市場的短線投資,於是被用於股票升跌的測量和分析中。該分析指標的設計是以三條線來反映價格走勢的強弱,這種圖形可以為投資者提供操作依據,非常適合做短線差價操作。 RSI的原理簡單來說是以數字計算的方法求出買賣雙方的力量對比,譬如有100個人面對一件商品,如果50個人以上要買,競相擡價,商品價格必漲。相反,如果50個人以上爭著賣出,價格自然下跌。
強弱指標理論認為,任何市價的大漲或大跌,均在0-100之間變動,根據常態分配,認為RSI值多在30-70之間變動,通常80甚至90時被認為市場已到達超買狀態,至此市場價格自然會回落調整。當價格低跌至30以下即被認為是超賣狀態,市價將出現反彈回升。 公式代碼 RSI:= SMA(MAX(Close-LastClose,0),N,1)/SMA(ABS(Close-LastClose),N,1)*100 五種用途 1) 頂點及底點 70 及30 通常為超買及超賣訊號。 2) 分歧(或背離), 當市況創下新高 ( 低 ) 但RSI 並不處於新高(低),這通常表明市場將出現反轉。 3) 支撐及阻力 ,RSI 能顯示支撐及阻力位,有時比價格圖更能清晰反應支支撐及阻力。
4) RSI指標 價格趨勢形態 與價格圖相比,價格趨勢形態如雙頂及頭肩在 RSI 上表現更清晰 5) 峰回路轉 當 RSI 突破 ( 超過前高或低點 ) 時,這可能表示價格將有突變與其它指標相同, RSI 需與其它指標配合使用,不能單獨產生訊號,價格的確認是決定入市價位的關鍵 缺點 1.當發生單邊行情時,rsi指標在高檔或低檔時會有鈍化的現象,因此會發生過早賣出或買進。 2.RSI沒有明顯規則性的買進或賣出信號,當指針在高位時,僅能說明情行反轉的可能性增高,但並沒有辦法進一步明確地指出時點。 3.一般而言,RSI的背離信號通常是事後驗證,事前很難看出,RSI指標與股價的"背離"走勢常常會發生滯後現象;
一方面,市場行情已經出現反轉,但是該指標的"背離"信號卻可能滯後出現;另一方面,在各種隨機因素的影響下,有時"背離"現象出現數次後行情才真正開始反轉,同時在研判指標"背離"現象時,真正反轉所對應的"背離"出現次數並無定論,一次、兩次或三次背離都有出現趨勢變化的可能,在實際操作中較難確認。 4.由於RSI是一種比率的指標,因此在趨勢分析的能力上會較弱。 5.應該看到RSI指標的時間參數不同,其給出的結果就會不同; 不同的投資者對時間周期的設定有不同的個人偏好,從理論上講,較短周期的RSI指標雖然比較敏感,但快速震蕩的次數較多,可靠性較差;較長周期的RSI指標盡管信號可靠,但指標的敏感性不夠,反應遲緩,因而經常出現錯過買賣良機的現象。 此外,由於RSI是通過收盤價計算的,如果當天行情的波幅很大,上下影線較長時,RSI就不可能較為準確反映此時行情的變化。 6.超買、超賣出現後導致的指標鈍化現象容易發出錯誤的操作信號; 在"牛市"和"熊市"的中間階段,RSI值升至90以上或降到10以下的情況時有發生,此時指標鈍化後會出現模糊的誤導信息,若依照該指標操作可能會出現失誤,錯過盈利機會或較早進入市場而被套牢。 7.當RSI值在50附近波動時該指標往往失去參考價值。 一般而言,RSI值在40到60之間研判的作用並不大。按照RSI的應用原則,當RSI從50以下向上突破50分界線時代表股價已轉強;RSI從50以上向下跌破50分界線則代表股價已轉弱。但實際情況經常是讓投資者一頭霧水,股價由強轉弱後卻不跌,由弱轉強後卻不漲的現象相當普遍。這是因為在常態下,RSI會在大盤或個股方向不明朗而盤整時,率先整理完畢並出現走強或走弱的現象。
# Ricequant量化交易平臺
# 日期:2013-01-01到 2016-10-04,日回測
# 可以自己import我們平臺支持的第三方python模塊,比如pandas、numpy等。
import numpy as np
import pandas as pd
from pandas import DataFrame,Series
 
# 在這部分編寫技術分析模塊
def RSI(N1=6, N2=12, N3=24):
    """
    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
 
    return RSI1, RSI2, RSI3
 
# 在這個方法中編寫任何的初始化邏輯。context對象將會在你的算法策略的任何方法之間做傳遞。
def init(context):
    reg_indicator(‘RSI‘, RSI, ‘1d‘, win_size=40)
    context.buy = []
    context.sell = []
    context.hold = []
    context.s_sell = []
 
# before_trading此函數會在每天策略交易開始前被調用,當天只會被調用一次
def before_trading(context):
    context.buy = []
    context.sell = []
    context.hold = []
    stocks,_ = get_all_stocks(context)
     
    for stock in context.portfolio.positions.keys():
        RSI1,RSI2,RSI3 = get_indicator(stock, ‘RSI‘)
        if RSI1>80 and REF(RSI1,1) > REF(RSI2,1) and RSI1 < RSI2:
            context.sell.append(stock)
        else:
            context.hold.append(stock)
     
    for stock in context.s_sell:
        if stock not in context.portfolio.positions.keys():
            context.s_sell.remove(stock)
             
    if len(context.hold) >= 10:
        return None
         
    for stock in stocks:
        RSI1,RSI2,RSI3 = get_indicator(stock, ‘RSI‘)
        if RSI1<20 and REF(RSI1,1) < REF(RSI2,1) and RSI1 > RSI2:
            context.buy.append(stock)
            if stock in context.sell:
                context.sell.remove(stock)
 
 
# 你選擇的證券的數據更新將會觸發此段邏輯,例如日或分鐘歷史數據切片或者是實時數據切片更新
def handle_bar(context, bar_dict):
    for stock in context.sell:
        order = order_target_percent(stock,0)
        if order.unfilled_quantity != 0:
            context.s_sell.append(stock)
    for stock in context.s_sell:
        order_target_value(stock,0)
     
    if len(context.hold)+len(context.buy) == 0:
        return None
    weight = 1/(len(context.hold)+len(context.buy))
     
    for stock in context.hold:
        order_target_percent(stock,weight)
    for stock in context.buy:
        order_target_percent(stock,weight)
 
# after_trading函數會在每天交易結束後被調用,當天只會被調用一次
def after_trading(context):
    pass
 
def get_all_stocks(context):
    all_stocks = all_instruments("CS").order_book_id
    will_end = []
    trade = []
    for stock in all_stocks:
        ins = instruments(stock)
        if ins is None:
            pass
        else:
            start = ins.listed_date
            end = ins.de_listed_date
            if (start-context.now).days < 0:
                if 0< (end - context.now).days <30:
                    will_end.append(stock)
                elif 30 < (end - context.now).days and is_suspended(stock) == False:
                    trade.append(stock)
    #print(len(trade),len(will_end))
    return trade,will_end

  

震蕩指標(一)RSI指標