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

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

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

raw-image

Total returns: 0.9904832194015957

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

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


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

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

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

希望大家能敬請期待!


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

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

raw-image

尚未註冊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 以下是我自製的兩項軟體 及提供的專案客製項目 - ⭐️凱龍金融量化(期貨交易) 凱龍下單機💡免費使用 - ⭐️凱龍美食街(線上訂餐) 凱龍訂餐模組💡$690/月 試用 30 天 - ⭐️專案客製 金融量化策略撰寫、Line@機器人及各類網站架設 - ⭐官方LINE:@979qbbfo
你可能也想看
Thumbnail
家中修繕或裝潢想要找各種小零件時,直接上網採買可以省去不少煩惱~看看Sylvia這回為了工地買了些什麼吧~
Thumbnail
家中修繕或裝潢想要找各種小零件時,直接上網採買可以省去不少煩惱~看看Sylvia這回為了工地買了些什麼吧~
Thumbnail
👜簡單生活,從整理包包開始!我的三款愛用包+隨身小物清單開箱,一起來看看我每天都帶些什麼吧🌿✨
Thumbnail
👜簡單生活,從整理包包開始!我的三款愛用包+隨身小物清單開箱,一起來看看我每天都帶些什麼吧🌿✨
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
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.幫自己的指標
Thumbnail
在上一篇文章中,我們學會了如何繪製最新的分鐘圖,讓我們了解最新一日的個股股價變化,不過有時分鐘圖太過細小,並無法了解到個股整體的趨勢狀況,這時我們就必須要使用到日線圖,因此,今天我們就來學習如何繪製日線圖吧!!
Thumbnail
在上一篇文章中,我們學會了如何繪製最新的分鐘圖,讓我們了解最新一日的個股股價變化,不過有時分鐘圖太過細小,並無法了解到個股整體的趨勢狀況,這時我們就必須要使用到日線圖,因此,今天我們就來學習如何繪製日線圖吧!!
Thumbnail
使用pandas,透過TWStock_2的資料,計算下列三種常用的技術指標 1. 移動平均線 2. 指數移動平均線 3. MACD 首先連接資料庫,然後我們只取"成交股數 , 開盤價 , 最高價 , 最低價 , 收盤價" 這5個columns代入新的tsmc( 名稱 ) code如下 參考連結如下
Thumbnail
使用pandas,透過TWStock_2的資料,計算下列三種常用的技術指標 1. 移動平均線 2. 指數移動平均線 3. MACD 首先連接資料庫,然後我們只取"成交股數 , 開盤價 , 最高價 , 最低價 , 收盤價" 這5個columns代入新的tsmc( 名稱 ) code如下 參考連結如下
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News