交易#1-技術分析篇 : SAR拋物線指標-計算-Python示例
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
函式接受四個參數:high
、low
、initial_sar
和 initial_trend
。
length = len(high)
這行程式計算 high
列表的長度,並將結果存儲在 length
變數中。
sar = [initial_sar] trend = [initial_trend]
這行程式初始化 sar
和 trend
兩個列表,分別以 initial_sar
和 initial_trend
的值作為首個元素。
acceleration_factor = 0.02 max_acceleration_factor = 0.2
這行程式初始化 acceleration_factor
和 max_acceleration_factor
兩個變數,分別設置為 0.02 和 0.2。
for i in range(1, length):
這行程式開始一個迴圈,從 1 開始迭代到 length
(high
列表的長度)。
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]
(前一個時間點的趨勢)的值來設置 af
和 ep
變數。如果 trend[i-1]
等於 1,則 af
設置為 acceleration_factor
,否則設置為 -acceleration_factor
。ep
根據 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)
這部分是一個測試示例,初始化了 high
和 low
兩個價格列表,initial_sar
初始 SAR 值和 initial_trend
初始趨勢。然後,使用這些值呼叫 calculate_sar
函式,將計算出的 SAR 值存儲在 sar_values
變數中。最後,將 sar_values
印出。
總結
指標沒有完美的,需要理解活用,雖然真的不理解計算原理也可以直接使用,但學習指標在技術上是一定又幫助的,當然交易領域中,指標的應用只是其中一個分支。作為教學導向文章,實際上在撰寫整理時,我也希望從中鞏固一些技術方面的要點,畢竟交易流派很多,多學習總不會錯。