NBLOG_20231204 PYTHON量化交易;Back Testing_5

Translator

 

NBLOG_20231204 PYTHON量化交易;Back Testing_5

寫完兩條線的,你是不是因為這次要弄個三條線來過過癮?有的、三條線在我的臉上一直掛著;呵呵。感覺有意思,但是就是少了點創意。今天咱們來鼓搗個混合式雙打?如何?就是有這種的,還有那種的、、你知道的、、。直說啦,就是老朋友MACD!既有線圖,又有柱狀圖(直方圖);你看如何?還加送黑白、彩色大電視各一台,夠意思吧。所以啦!弄個三條線的有啥意思呢?大家練功到這階段了,多加條線也不過就是分分秒秒的小事對吧。

交易對我來說;最好的事,不過就是背離。發現背離的指標,不過就是MACD。這幾年交易圈子總算慢慢開竅了,不會再拿一堆指標;老是超買、超賣的學習了,知道還有個正確姿勢叫做背離。去網路比如youtube找找,一大堆影片告訴你MACD背離才是真正的用法,然後績效頂天多好之類的,數不勝數。看來我這二十多年播下的種子,已經開始發芽啦!是時候開始寫我的機械化交易續集啦。希望到時候大夥舊雨新知,回頭再來支持一波呀,先給您謝謝啦!主題開始,程式碼照例先上。


#套件使用宣告

import pandas as pd

import yfinance as yf

import mplfinance as mpf

import talib

%matplotlib notebook

#下載一年MSFT股價

df=yf.download('MSFT',period='1y')

ema12=talib.MA(df['Close'],12,1)#計算12天EMA

ema26=talib.MA(df['Close'],26,1)#計算26天EMA

#呼叫talib計算MACD

df['dif'], df['dem'], df['hist'] = talib.MACD(df['Close'], 12, 26, 9)

df['macd']=ema12-ema26


apds =[

    mpf.make_addplot(ema12, color='g'), # 快線DIF,綠色

    mpf.make_addplot(ema26, color='r'), # 慢線DEA,青色

    mpf.make_addplot(df['hist'], type='bar', width=0.7, panel=2, color='dimgray', alpha=1, secondary_y=False), 

    # 柱狀圖,灰色,放在第二個面板上

    mpf.make_addplot(df['dif'], panel=2, color='fuchsia', secondary_y=False), 

    # DIF線,紫紅色,放在第二個面板上

    mpf.make_addplot(df['dem'], panel=2, color='b', secondary_y=False) 

    ]

mpf.plot(df, type='candle', addplot=apds, figscale=1.6, title='MSFT & MACD', volume=True, ylabel='Price', ylabel_lower='Volume', figratio=(10, 8),style='default')


 




各位看官,可瞧見這個漂亮的三型底背了嗎?這就是MACD的正確辨識與用法。

https://trader-parkson.blogspot.com/2023/07/2023-07-21.html




在開始說明程式碼之前,我必須來正個視聽先。這幾年在許多文章與著作當中,不止一次痛心疾首的指正許多解說指標被濫用、亂用的問題。更多的是把名稱搞得面目全非的;不知道這些人懷的是什麼心態?今天的主角MACD便是其中的受害者之一。上面我就故意留下這些錯誤的名稱,藉這機會來說明。沒有什麼dif,MACD就是ema12減去ema26的值。然後天殺的都不知道啥縮寫的DEA?MACD再經9日平均之後叫做信號線(Signal);好嗎?拜託別再搞錯了謝謝。

現在換我們來說說程式碼的部分;talib呼叫MACD的計算是這樣的:

### macd, macdsignal, macdhist = MACD(close, fastperiod=12, slowperiod=26, signalperiod=9)


### 參數說明:high:最高價;low:最低價;close:收盤價;fastperiod:快週期; slowperiod:慢週期


MACD_macd,MACD_macdsignal,MACD_macdhist = talib.MACD(close, fastperiod=12, slowperiod=26, signalperiod=9)

其實這段程式碼,也是大部分都是老相識了。設計MACD重點應該是處理它的柱狀圖(直方圖Hist)上面,這裡要些技術難度的。這也就是咱們為什麼要分成黑白跟彩電來介紹的原因了。

mpf.make_addplot(df['hist'], type='bar', width=0.7, panel=2, color='dimgray', alpha=1, secondary_y=False)

這一段就是繪製柱狀圖的部分。主要也就是叄數type設定為bar,跟著需要的話改變個寬度width。這就解決啦?驚不驚喜?好吧!就算我大驚小怪,那加個顏色給你西西Look Look一下。


import yfinance as yf

import talib

import mplfinance as mpf

s= mpf.make_mpf_style(rc={'font.family': ["Microsoft JhengHei"] })


# 下載 MSFT 數據

data = yf.download('MSFT', period='1y')


# 計算 MACD 指標

macd, signal, histogram = talib.MACD(data['Close'])


# 將長條圖中小於零的值設為 None

histogram_positive = histogram.copy()

histogram_positive[histogram_positive < 0] = None


# 將長條圖中大於等於零的值設為 None

histogram_negative = histogram.copy()

histogram_negative[histogram_negative >= 0] = None


# 繪製 K 線圖和成交量

ap = mpf.make_addplot(histogram_positive, panel=2, type='bar', color='g',ylabel='MACD')

an = mpf.make_addplot(histogram_negative, panel=2, type='bar', color='r')

amacd = mpf.make_addplot(macd, panel=2, color='r')

asignal = mpf.make_addplot(signal, panel=2, color='b')


mpf.plot(data, type='candle', volume=True, addplot=[ap, an, amacd, asignal], title='MSFT K線圖與成交量',style=s)



 


如此,我們便完成了以雙色呈現柱狀圖的MACD了。目前應該各位夥伴,都可以利用自己掌握的Python程式設計能力,繪製出上面上幾乎所有簡單到複雜的技術指標了。最後想跟大家再介紹,以MACD設計模式再衍生的一個好用的指標;就是之前給大家提及的擠壓指標(Squeeze)。在介紹完畢後,計劃下一篇文章,我們就要拉回主題;進入交易訊號處理,與績效評估的部分。

關於Squeeze指標的介紹,有興趣的朋友可以觀看我的視頻介紹:

交易機會視窗擠壓指標介紹 - YouTube

或者國外交易者的影片

'The Squeeze' by John Carter – The King of Volatility Indicators - YouTube

關於Squeeze指標的介紹

穀大神賜下靈籤如下:

擠壓指標(TTM Squeeze Indicator)是一種技術分析工具,用於識別股票或其他金融資產的潛在突破機會。該指標結合了布林通道(Bollinger Bands)和凱爾特納通道(Keltner Channels)兩種指標,以衡量價格波動性和動能。


**擠壓指標的原理**


擠壓指標的核心概念是,當價格在一段時間內窄幅波動時,它會積蓄能量,並可能在某個時候突然爆發。擠壓指標通過分析布林通道和凱爾特納通道之間的關係來識別這種情況。


* **布林通道**是一種衡量價格波動性的指標,由一條中線和兩條曲線組成。中線代表價格的平均水準,兩條曲線代表價格的標準差。

* **凱爾特納通道**也是一種衡量價格波動性的指標,由一條中線和兩條平行線組成。中線代表價格的平均水準,兩條平行線代表價格的平均真實波動範圍(Average True Range,ATR)。


當布林通道完全位於凱爾特納通道內部時,表明價格波動性非常低,市場處於擠壓狀態。此時,擠壓指標會顯示一個紅點,表示擠壓正在形成。如果價格突破凱爾特納通道,則表明擠壓已經結束,價格很有可能出現大幅波動。此時,擠壓指標會顯示一個綠點,表示擠壓已經觸發。


**擠壓指標的應用**


擠壓指標可以用於識別股票或其他金融資產的潛在突破機會,但它並非一個萬能指標。在使用擠壓指標時,需要注意以下幾點:


* 擠壓指標並不能保證價格一定會突破,它只能提供一個概率性預測。

* 擠壓指標需要與其他技術指標或基本面分析相結合使用,以提高其準確性。

* 擠壓指標在不同的市場環境下表現可能不同,因此需要根據具體情況進行調整。

現在大家對Squeeze的原理應該都能瞭解了吧?那就直接上程式碼!


import pandas as pd

import yfinance as yf

import mplfinance as mpf

import talib

import numpy as np

%matplotlib notebook


s = mpf.make_mpf_style(rc={'font.family': ["Microsoft JhengHei"]})


# 下載NVDA股票資料

symbol = "NVDA"

df = yf.download(symbol, period='1y')


# 計算布林上軌和凱特上軌的差值

upper_bb = talib.MA(df['Close'], 20, 0) + 2 * df['Close'].rolling(window=20).std()

upper_kc = talib.MA(df['Close'], 20, 1) + 2 * talib.ATR(df['High'], df['Low'], df['Close'], 20)

df['squeeze'] = upper_bb - upper_kc

# 將長條圖中小於零的值設為 None

histogram_positive = df['squeeze'].copy()

histogram_positive[histogram_positive < 0] = None


# 將長條圖中大於等於零的值設為 None

histogram_negative = df['squeeze'].copy()

histogram_negative[histogram_negative >= 0] = None


# 創建上軌線和下軌線的addplot

ap_upper_bb = mpf.make_addplot(upper_bb, color='r', secondary_y=False)

ap_upper_kc = mpf.make_addplot(upper_kc, color='g', secondary_y=False)


# 創建Squeeze指標的addplot

ap_squeeze_positive = mpf.make_addplot(histogram_positive, panel=2, type='bar', color='g', ylabel='Squeeze')

ap_squeeze_negative = mpf.make_addplot(histogram_negative, panel=2, type='bar', color='r')


# 繪製K線圖

mpf.plot(df, type='candle', volume=True, 

         addplot=[ap_upper_bb, ap_upper_kc, ap_squeeze_positive, ap_squeeze_negative], 

         title='NVDA K線圖與Squeeze', style=s)



 


Squeeze繪製出來的圖形如上;請記住Squeeze的表現與使用方法,是沒有趨勢性的,這點很重要。它就像DMI中的ADX一樣,是市場強度的表現,跟多空沒有半毛錢關係。在我的書中提及;短時間產生凹陷之後的訊號,非常具有交易價值;值得把握。讓我們來看看程式碼的部分吧!

s = mpf.make_mpf_style(rc={'font.family': ["Microsoft JhengHei"]})

這一條要畫重點,年年大專聯考必考!你的Python少了它,就永遠只能當個不懂中文的文盲;所以一定要記起來。往後就把它當靈符一道,或是哆啦A夢的翻譯吐司。凡是遇到程式雞同鴨講的時候,往它腦門一貼;立馬口吐芬芳,出口成章。至於其他部分,應該都跟MACD大同小異,依樣畫葫蘆。

歡樂的時間總是過得飛快,又到了尾聲道再見的時候。記得下一篇我們將開啟更趨近完整策略的部分;跟大家一切探索交易訊號的處理與績效回測。大家下回見!天涼記得多添衣。




留言

熱門文章