交易#1-技術分析篇 : SAR拋物線指標-計算-Python示例

YingYun
·
·
IPFS
·
技術分析第一篇,整理撰寫文章時,也是希望能夠將技術性的內容融會貫通,SAR計算在我會用到的指標中屬於較複雜的。沒有任何市場分析工具可以保證 100% 的準確性,像是區塊鏈交易中,鏈上數據也是很重要的,單看單一指標非常危險,多學習總不會錯。

SAR概述

SAR指標是一種技術分析指標,用於確定股票、商品或其他金融資產的趨勢反轉點,指標可作為「停止並反轉」的參考。通常用於判斷價格走勢的反轉,即當趨勢由上升轉為下降或由下降轉為上升時。它的計算基於前一期的SAR值和當前的趨勢,使用一個加速因子進行調整。

在上升趨勢中,SAR拋物線位於價格下方,並且隨著時間的推移逐漸上升。當價格穿過SAR拋物線時,可能預示著趨勢反轉,SAR值會跳至價格上方,並且趨勢可能變為下降。

在下降趨勢中,SAR拋物線位於價格上方,並且隨著時間的推移逐漸下降。當價格穿過SAR拋物線時,可能意味著趨勢反轉,SAR值會跳至價格下方,並且趨勢可能變為上升。

簡單來說,SAR拋物線指標可以用於確定停損點位和進出場點位。白話來講就是用在已經賺了,但不知道甚麼時候出場時可以使用,避免賺了一點點就跑。

公式

SAR的計算其實頗為複雜,一般脫離數學的人要計算會有點難度,SAR也算是進階指標,搭配上其他的技術指標才是SAR的真正應用方式

AF(加速因子):起始值為0.02,每當趨勢反轉時,加速因子會增加0.02,最大值為0.2。

EP(極值點):記錄趨勢轉折時的最高或最低價格。

SAR(拋物線停損點):根據當前趨勢和前一期的SAR值計算得出。

計算公式:

在上升趨勢中:如果前一期的SAR值位於當前的EP以下,則EP更新為當前的最高價格。

SAR = 前一期的SAR值 + AF * (EP - 前一期的SAR值),如果當前的最低價格小於等於SAR,則趨勢反轉,EP更新為當前的最低價格,AF重置為起始值0.02,並將SAR設置為EP。

在下降趨勢中:如果前一期的SAR值位於當前的EP以上,則EP更新為當前的最低價格。

SAR = 前一期的SAR值 - AF * (前一期的SAR值 - EP),如果當前的最高價格大於等於SAR,則趨勢反轉,EP更新為當前的最高價格,AF重置為起始值0.02,並將SAR設置為EP。

Python演示

通常技術分析中,會使用TradingView以及Pine 編輯器,但是內容較為複雜,且這是屬於工具應用的範疇,所以就以後再介紹,對於指標,本文章使用程式的邏輯,以此來拆解計算的部分,著重在SAR指標初階的理解。


def calculate_sar(high, low, initial_sar, initial_trend):
    length = len(high)
    sar = [initial_sar]
    trend = [initial_trend]
    acceleration_factor = 0.02
    max_acceleration_factor = 0.2
    for i in range(1, length):
        af = acceleration_factor if trend[i-1] == 1 else -acceleration_factor
        ep = high[i-1] if trend[i-1] == 1 else low[i-1]
        sar.append(sar[i-1] + af * (ep - sar[i-1]))
         if trend[i-1] == 1:
            if low[i] < sar[i]:
                trend.append(-1)
                sar[i] = ep
                acceleration_factor = min(acceleration_factor + 0.02, max_acceleration_factor)
            else:
                trend.append(1)
        else:
            if high[i] > sar[i]:
                trend.append(1)
                sar[i] = ep
                acceleration_factor = min(acceleration_factor + 0.02, max_acceleration_factor)
            else:
                trend.append(-1)

    return sar
# 示例
high = [100, 110, 120, 130]
low = [90, 95, 100, 105]
initial_sar = 100
initial_trend = 1

sar_values = calculate_sar(high, low, initial_sar, initial_trend)
print(sar_values)


這邊只是簡單寫的範例,大概能演示SAR的基本計算,下面來做詳細的解釋

程式中的 calculate_sar 函式接受四個參數:highlowinitial_sarinitial_trend

length = len(high) 

這行程式計算 high 列表的長度,並將結果存儲在 length 變數中。

sar = [initial_sar] trend = [initial_trend] 

這行程式初始化 sartrend 兩個列表,分別以 initial_sarinitial_trend 的值作為首個元素。

 acceleration_factor = 0.02 max_acceleration_factor = 0.2 

這行程式初始化 acceleration_factormax_acceleration_factor 兩個變數,分別設置為 0.02 和 0.2。

 for i in range(1, length): 

這行程式開始一個迴圈,從 1 開始迭代到 lengthhigh 列表的長度)。

af = acceleration_factor if trend[i-1] == 1 else -acceleration_factor ep = high[i-1] if trend[i-1] == 1 else low[i-1] 

這行程式根據 trend[i-1](前一個時間點的趨勢)的值來設置 afep 變數。如果 trend[i-1] 等於 1,則 af 設置為 acceleration_factor,否則設置為 -acceleration_factorep 根據 trend[i-1] 的值,選擇 high[i-1]low[i-1]

sar.append(sar[i-1] + af * (ep - sar[i-1])) 

這行程式使用 SAR 公式計算新的 SAR 值,並將其附加到 sar 列表中。

  if trend[i-1] == 1:
            if low[i] < sar[i]:
                trend.append(-1)
                sar[i] = ep
                acceleration_factor = min(acceleration_factor + 0.02, max_acceleration_factor)
            else:
                trend.append(1)
        else:
            if high[i] > sar[i]:
                trend.append(1)
                sar[i] = ep
                acceleration_factor = min(acceleration_factor + 0.02, max_acceleration_factor)
            else:
                trend.append(-1) 

這段程式是根據價格和計算出的 SAR 值來判斷趨勢。根據前一個時間點的趨勢(trend[i-1])進行條件判斷:

如果前一個時間點的趨勢為上升趨勢(trend[i-1] == 1),則檢查當前時間點的低價(low[i])是否小於 SAR 值(sar[i])。如果是,表示趨勢轉為下降趨勢,將趨勢值 -1 附加到 trend 列表中,並將 SAR 值(sar[i])設置為 ep。同時,加速係數 acceleration_factor 會增加 0.02,但不超過最大加速係數 max_acceleration_factor

如果前一個時間點的趨勢為下降趨勢,則檢查當前時間點的高價(high[i])是否大於 SAR 值(sar[i])。如果是,表示趨勢轉為上升趨勢,將趨勢值 1 附加到 trend 列表中,並將 SAR 值(sar[i])設置為 ep。同樣,加速係數 acceleration_factor 會增加 0.02,但不超過最大加速係數 max_acceleration_factor

如果以上兩個條件都不滿足,則表示趨勢保持不變,將前一個時間點的趨勢值附加到 trend 列表中。

return sar 

這行程式返回計算出的 SAR 值列表 sar

high = [100, 110, 120, 130] 
low = [90, 95, 100, 105] 
initial_sar = 100 
initial_trend = 1 
sar_values = calculate_sar(high, low, initial_sar, initial_trend) print(sar_values) 

這部分是一個測試示例,初始化了 highlow 兩個價格列表,initial_sar 初始 SAR 值和 initial_trend 初始趨勢。然後,使用這些值呼叫 calculate_sar 函式,將計算出的 SAR 值存儲在 sar_values 變數中。最後,將 sar_values 印出。

總結

指標沒有完美的,需要理解活用,雖然真的不理解計算原理也可以直接使用,但學習指標在技術上是一定又幫助的,當然交易領域中,指標的應用只是其中一個分支。作為教學導向文章,實際上在撰寫整理時,我也希望從中鞏固一些技術方面的要點,畢竟交易流派很多,多學習總不會錯。

作者保留所有权利

喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!

YingYun寫一些WEB2及WEB3相關文章,實用性為重,不炒作與推薦項目
  • 选集
  • 来自作者
  • 相关推荐