介紹均線從數學上的本質、均線的種類,以及均線的延伸常見技術指標。另外會附上 Python 的實現算法(著重 SMA & EMA)。但不會介紹使用策略。
「取平均」是做統計分析裡面非常基礎、很早學到、常用的做法,而均線(Moving Average)也是技術指標當中最常被當第一個學習的指標。但許多人因為覺得均線「基礎、簡單」,而忽略它很好用的事實。其實均線說簡單是簡單.但要複雜也可以很複雜,使用策略也能夠五花八門。
這篇文會從數學上理解均線的本質是什麼?瞭解均線有哪些種類?還有那些常見技術指標也是從均線做延伸的?另外還會附上 Python 實作的算法。
請注意.這篇文不會介紹使用策略。
均線(Moving Average)
我們說的均線是哪個均線?
這裡個人想先跟大家傳達兩件事:第一,我們要知道均線的全名是:移動平均線(Moving Average, MA),請注意「移動」的概念,中文的簡稱常會讓新手忽略這個重要的概念。第二,其實「均線」發展至今,已經是「一個系列」,而不只是「一種指標」那麼簡單。
那一般我們指的均線是哪個呢?其實大部分是在說「簡單移動平均線(Simple Moving Averate, SMA)」。這種均線「簡單」在哪?簡單在它沒有做任何加權、衰弱的計算。直接舉個例子,請問 10、2、3 這三個數值的最簡單直覺的算術平均(Arithmetic Mean)怎麼算?就是將 3 個數字加起來除以 3。
那為什麼有個「移動(Moving)」呢?不要忘了,時間會動!所以加總的數字會隨著時間過去而更新。
BTW,處理市場的資料一定逃不過處理時序的問題,更深的探討在這裡又開個坑,以後再介紹。
最簡單的均線的公式與本質?(附 Python 實現方法)
我們將上面簡單的數學寫成煩人(XD)的公式的話,SMA 長這樣:
如果想用 Python 做計算,建議借助 Pandas 套件最為簡單,因為只需要兩個函式可以解決上面看起來貌似很複雜的公式:df.rolling(週期).mean()
,其中 rolling()
就是拿來做移動窗格的好工具, mean()
就是取平均。當然,這裡需要一些 Python 與 Pandas 的基礎,但由於這篇重點不在此,我們有機會再介紹。
想瞭解其他種均線之前,我們必須要知道均線的本質是什麼。從數學意義上來看,這裡有兩個重點:如何取平均(加權/衰弱計算的方法)?週期取多少?這兩點同時也是使用指標時,需要注意的參數調整,而前者更是變化出更多均線種類的關鍵。
那從應用目的上來看,為什麼這兩個是重點?因為無論做交易或投資,我們都想知道「大勢所趨」是什麼,而我們取均線就是想知道:某段時間的價格,平滑過後的趨勢變化。(所以需要記得,MA 是種滯後的指標,它不可能反應最即時的狀態。)
為什麼需要平滑?因為市場不是一個人的舞台,這種情況就會出現躁點(noise),尤其時間格局取越小,躁點就容易變多,為了消除躁點對我們的判斷,在數學上最簡單也最常用的手法就是取平均。那取平均如何變出新花樣?例如有些人覺得,近期的價格的重要性大於更久之前的價格,取平均時它可能把近期的價格權重調高。而時間週期取多長的影響其實也跟平滑程度有關,另外也跟你想做多長的市場、做什麼商品有關(最簡單例如:有些商品有周休二日,周線常會取 5,但例如加密貨幣沒有周休二日,周線會取 7)。這當中的參數調整就留給各位自行研究。
其他種均線?(著重在 EMA,附 Python 實現方法)
除了上述的 SMA 以外,還有例如:指數移動平均線 ( EMA )、加權移動平均線 ( WMA )、累積移動平均線 ( CMA ) 等等。根據計算方法有所差異,對價格有不同種類的敏感程度,當然使用時機也就不同。
其中也有許多人愛用的是 EMA,因為它在設計上會對價格波動更為敏感。
以下是 EMA 最經典的公式(只是最經典,不是固定):
這裡需要強調一下,EMA 的 α 是一個關鍵,它是可以被換掉的。詳細牽涉到有關無窮遞迴與質心的數學推導,大家有興趣可以參考 MA 在 Wiki 的介紹。
如果你想利用 Pandas 在 Python 實現 EMA,使用的方法為:df.ewm(要填要哪種衰弱因子, min_period=value).mean()
。而當中這個衰弱因子就是跟上述的 α 有關,共有以下幾種參數可選:(以下內容取自 Pandas API Reference 加上我個人的註解)
- com: float, optional
- Specify decay in terms of center of mass (質心指定衰減)
- α=1/(1+com), for com≥0.
- span: float, optional
- Specify decay in terms of span (範圍指定衰減)
- α=2/(span+1), for span≥1. (跟經典公式最像)
- halflife: float, str, timedelta, optional
- Specify decay in terms of half-life (半衰期指定衰減)
- α=1−exp(−ln(2)/halflife), for halflife > 0.
- If
times
is specified, the time unit (str or timedelta) over which an observation decays to half its value. Only applicable tomean()
, and halflife value will not apply to the other functions. - alpha: float, optional
- Specify smoothing factor α directly (直接簡單粗暴指定平滑係數 α 要是多少)
- 0 < α ≤ 1.
所以如果你是想實現最經典的 EMA,如果今天時間範圍 N 等於 5,α 就是 2/6,那根據選的參數不同的公式來推,可以有以下這幾種寫法:
- 選
com
的話:.ewm(com=2,adjust=False).mean()
- 選
span
的話:.ewm(span=5,adjust=False).mean()
- 選
alpha
的話:.ewm(alpha=1/3,adjust=False).mean()
哪些常見技術指標也是均線的延伸?
基於「平滑技術」的概念,其實許多常見的指標都會隱含均線的計算。例如常見的 MACD、ATR、Bollinger Band、RSI 等等,通通有均線的影子存在,但是使用哪一種均線?或者 α 要取多少,這些都是能夠變化的。
後集待續與結語
總結一下幾個概念:
- MA 是一個系列
- MA 的目的:想知道某段時間的價格,平滑過後的趨勢變化。=> MA 是滯後的指標
- MA 系列的本質有兩大重點:如何取平均(加權/衰弱計算的方法)?週期取多少?
每種指標在被發表的時候都有最經典的算法與理由,不過根據市場與個人做單習慣不同,其實你可以去挖掘出最適合你自己使用的參數。但如果要手動一種種測試實在太困難,這時程式就派上用場了。未來或許能介紹一次參數選擇怎麼做、還有有什麼好用的工具可以用、或是那些延伸的指標怎麼實現的詳細介紹。
後續: