【Python】【MACD策略】逐行程式碼教程

更新於 發佈於 閱讀時間約 9 分鐘
投資理財內容聲明

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]則是取得最新的相乘數據,即是全部最終相乘的報酬率

這樣我們就成功取得了我們欲計算的回測結果

那,我們就來看一下最後的結果吧!

MACD策略執行結果

MACD策略執行結果

Total returns: 0.9904832194015957

這個0.99048..就是我們運用MACD策略去回測蘋果股價的結果

最近一個月的期間,並用小時K棒的運算,得到0.99意即-1%的報酬率


這是一個最基本的Python金融回測範例

Python能為金融量化做的,遠不止如此

之後也將繼續介紹許多Python實用金融量化範例

希望大家能敬請期待!


最後在另外附上這次我們處理的數據資料截圖

這樣能讓各位投資朋友更清楚的瞭解我們在整個策略上的計算過程

MACD策略csv

MACD策略csv


尚未註冊TrdingView的投資朋友歡迎使用Kevin專屬註冊連結:

https://www.tradingview.com/?aff_id=131489

享一個月免費試用Premium帳號,到期後可享50%的續約優惠!

(即使不續約,仍可繼續使用TradingView免費版功能)


⭐目前凱龍承接三大項業務,歡迎洽詢:

  1. 金融量化系列|凱龍下單機租用 & TradngView & MultiCharts 程式碼諮詢撰寫
  2. Line官方系列|凱龍Line官方模組租用 & Line官方機器人全系列諮詢架設
  3. 網站SaaS平台|凱龍雲端應用 & 網站SaaS平台諮詢架設

⭐凱龍Line官方:@979qbbfo

⭐凱龍官方網站:https://kevinwtf524.com/

⭐instagram:https://www.instagram.com/kevinwtf524/

⭐YouTube:https://www.youtube.com/@kevinwtf524

留言
avatar-img
留言分享你的想法!
avatar-img
Kevin 凱龍
22會員
17內容數
嗨!我是凱龍負責人Kevin - ⭐️凱龍金融量化(期貨程式交易看這裡) 凱龍下單機 $545起/月 - ⭐️凱龍商城(餐飲業線上訂餐看這裡) 凱龍訂餐模組 $690/月 - ⭐️專案客製(各類客製專案看這裡) 金融量化策略撰寫、Line@機器人及各類網站客製架設 - ⭐凱龍官方Line:@979qbbfo
你可能也想看
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
  接上一篇,看來花花綠綠的東西跟我們是無望了。對原本接下來的計畫也只好做一些改變。所以衹能把我們的程式碼,重新移動到了7月7號那篇文章的進度NBLOG_20230707使用TA_LIB(PANDAS_TA) 打造一個交易策略實用工具(2TA_LIB輕探之馬克快來。
Thumbnail
  接上一篇,看來花花綠綠的東西跟我們是無望了。對原本接下來的計畫也只好做一些改變。所以衹能把我們的程式碼,重新移動到了7月7號那篇文章的進度NBLOG_20230707使用TA_LIB(PANDAS_TA) 打造一個交易策略實用工具(2TA_LIB輕探之馬克快來。
Thumbnail
經過之前MACD指數平滑移動平均線的詳細介紹,相信已經對 MACD 指標有徹底的瞭解了,這篇將實際使用 Crypto Arsenal 量化交易平台裡的免費 MACD 指標模板做回測,這篇將教學如何簡單地修改模板程式,更客製化自己的想法和策略。
Thumbnail
經過之前MACD指數平滑移動平均線的詳細介紹,相信已經對 MACD 指標有徹底的瞭解了,這篇將實際使用 Crypto Arsenal 量化交易平台裡的免費 MACD 指標模板做回測,這篇將教學如何簡單地修改模板程式,更客製化自己的想法和策略。
Thumbnail
上次我們實作完macd之後,大家是不是覺得少了指標 沒錯【指標】這種東西要顯示到大圖上面才能更容易判斷出如何更好的開單時機 通常我們用macd開單 是用到金叉跟死叉 1. 金叉就是macd的柱狀圖從紅去轉綠色的時候開多 2. 死叉就是macd的柱狀圖從綠色轉紅色的時候開空 我們先從金叉開始做起 st
Thumbnail
上次我們實作完macd之後,大家是不是覺得少了指標 沒錯【指標】這種東西要顯示到大圖上面才能更容易判斷出如何更好的開單時機 通常我們用macd開單 是用到金叉跟死叉 1. 金叉就是macd的柱狀圖從紅去轉綠色的時候開多 2. 死叉就是macd的柱狀圖從綠色轉紅色的時候開空 我們先從金叉開始做起 st
Thumbnail
加入我們ASC 的 Discore: https://discord.gg/a4C57cVR6B 1.前置工具: tradingview 需要申請帳戶並且進入上方連結(這邊用 幣安交易所ETH/USDT 作為範例) 之後我們點選Pine編輯器(這邊就是撰寫indicator的地方) 2.幫自己的指標
Thumbnail
加入我們ASC 的 Discore: https://discord.gg/a4C57cVR6B 1.前置工具: tradingview 需要申請帳戶並且進入上方連結(這邊用 幣安交易所ETH/USDT 作為範例) 之後我們點選Pine編輯器(這邊就是撰寫indicator的地方) 2.幫自己的指標
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News