Python的語法雖然比起Multicharts跟TradingView,它是比較難的
不過它絕對是值得我們花時間學習的語法!
在金融量化領域
Python是全世界最廣泛被使用的量化交易語法
在其他軟體應用領域
Python依然是非常實用非常具有商業價值的程式語言!
那回到我們的主題
我們依然先來介紹這個MACD策略的原理以及公式
(這部分將直接複製MC跟TV的MACD公式介紹,已經了解的朋友可以直接跳過)
MACD的公式及原理
快線:12根價格指數平均線
慢線:26根價格指數平均線
macd: 快線-慢線
signal: 9根的macd指數平均線
柱狀體:macd-signal
MACD最原始的策略是
當柱狀體由負值轉正,我們做多
當柱狀體由正值轉負,我們做空
但隨著時代的演進,MACD的運用早已變幻莫測
但我們今天先以原始型態來做介紹!
接著進入我們的主題【Python語法逐行解說】
首先我們先了解這次語法的主體大綱,然後再去深入解析程式碼
第一步,我們利用Python的模組yfinance取得Apple股價的歷史資料
接著我們在用模組pandas整理在yfinance取得的資料
並建立MACD所需的數據
之後再以pandas模組的內建運算方法去做回測
最後算出這個原始的MACD策略在Apple股價上,能獲得多少報酬率!?
import pandas as pd
import yfinance as yf
這段程式碼是載入(import)所需要的Python模組
這個策略,我們需要的模組是pandas和yfinance
而import..as..是把模組名稱改成自己方便編寫跟閱讀的簡稱
我們把pandas簡稱pd,yfinance簡稱yf
yoAPL = yf.download('AAPL', period='1mo', interval='1H')
這段程式碼是用yf模組內建的dowload方法取得apple股價的歷史數據
並儲存於我們自己取名的"yoAPL"物件
第一個參數AAPL是apple股票的名稱
第二個參數period是歷史資料的期間,我們取一個月
第三個參數interval是取得K棒期間,我們這個範例取一小時K線
yoAPL['EMA12'] = yoAPL['Close'].ewm(span=12, adjust=False).mean()
yoAPL['EMA26'] = yoAPL['Close'].ewm(span=26, adjust=False).mean()
yoAPL['MACD'] = yoAPL['EMA12'] - yoAPL['EMA26']
yoAPL['Signal'] = yoAPL['MACD'].ewm(span=9, adjust=False).mean()
這一段我們建立MACD數據
這裡我們要先了解,從yf下載下來的歷史資料,它的資料格式就是pandas格式
所以我們可以直接用pandas內建整理資料的方法去做整理運算
第一段以及第二段我們建立12根以及26根的指數平均
yoAPL['EMA12']及yoAPL['EMA26']語法是在歷史數據列(column)上
增加兩列,分別稱作EMA12以及EMA26
yoAPL['Close'].ewm(span=12, adjust=False).mean()
這段語法是指,我們用每根小時K棒收盤價Close
用內建方法ewm計算指數平均,span參數是指往回取12根k棒數據
adjust參數是指,False會給最原始的指數平均公式數據
設定True則會給予"變形"的指數平均公式
這是pandas的貼心變形,它會把指數平均數據"數量"變得跟算數平均"數量"一樣
以方便我們去跟算術平均做比較,這個部分比較複雜
不太了解的朋友可以先有個概念就好!
接著我們讓快線減快線,取得macd值
在用與上述相同的語法計算macd的9根指數平均,計算出signal值
我們的柱狀體則是macd值減去signal值
yoAPL['Position'] = 0
yoAPL.loc[aapl['MACD'] > yoAPL['Signal'],'Position'] = 1
yoAPL.loc[aapl['MACD'] < yoAPL['Signal'],'Position'] = -1
這段程式碼我們依然使用pandas方法新增一列position並預設為0
之後我們利用pandas模組loc方法取得特定位置(location)數據
loc邏輯是先取row(行)在取column(列)
我們先選取macd值大於signal值的行,即柱狀體大於0
將以上這些行的position列由0寫為1
在選取macd值小於signal值的行,即柱狀體小於0,將這些position列寫為-1
1即進多單,-1即進空單
(這是一個簡單範例,我們先排除柱狀體為0的情況,剛好這次的示範也沒有0值)
yoAPL['Returns'] = yoAPL['Close'].pct_change() * yoAPL['Position'].shift(1)
print('Total returns:', (yoAPL['Returns'] + 1).cumprod()[-1] )
接著我們依然利用pandas模組新建一個新的列(column)稱Returns
yoAPL['Close'].pct_change()是指
收盤價的百分比變化(percentage change)
yoAPL['Position'].shift(1)則是將進場訊號往後移一個位置
這是由於我們在每一個柱狀體成立訊號的時候,都是會在下一根K棒進場
比如,如果目前這根K棒還沒有跑完,我們就不會知道到底訊號最後會不會成立
所以在目前這根K棒訊號成立之後,我們會在下一根進場
如此一來,我們就計算了每次進場以及持有的報酬
最後,我們用Python語法print()輸出最後結果
第一個參數是我們要打出來的字"Total returns:"
第二個參數則是我們要輸出的最終計算的值
yoAPL['Returns'] + 1).cumprod()[-1]
我們來解釋這個值,將每一個Close的百分比變化+1
比如Returns是0.05就會變成1.05,而Returns是-0.03則會變成0.97
最後我們利用cumprod()函數將所有加1後的Returns值全部相乘
[-1]則是取得最新的相乘數據,即是全部最終相乘的報酬率
這樣我們就成功取得了我們欲計算的回測結果!
那,我們就來看一下最後的結果吧!
Total returns: 0.9904832194015957
這個0.99048..就是我們運用MACD策略去回測蘋果股價的結果
在最近一個月的期間,並用小時K棒的運算,得到0.99意即-1%的報酬率!
這是一個最基本的Python金融回測範例
Python能為金融量化做的,遠不止如此!
之後也將繼續介紹許多Python實用金融量化範例
希望大家能敬請期待!
最後在另外附上這次我們處理的數據資料截圖
這樣能讓各位投資朋友更清楚的瞭解我們在整個策略上的計算過程!
尚未註冊TrdingView的投資朋友歡迎使用Kevin專屬註冊連結:
享一個月免費試用Premium帳號,到期後可享50%的續約優惠!
(即使不續約,仍可繼續使用TradingView免費版功能)
⭐目前凱龍承接三大項業務,歡迎洽詢:
- 金融量化系列|凱龍下單機租用 & TradngView & MultiCharts 程式碼諮詢撰寫
- Line官方系列|凱龍Line官方模組租用 & Line官方機器人全系列諮詢架設
- 網站SaaS平台|凱龍雲端應用 & 網站SaaS平台諮詢架設