在上一篇文章當中;我們已經順利的,把股價當中所發現的吞噬K線形態。標示,在圖形當中。對我這個圖形極簡偏執狂來說,已經是在滿意得不得了了。但自己知道,許多朋友們,還是喜歡看到習慣的紅綠色來標示;上漲或下跌的方向。所以在這期的文章當中,就嘗試著來完成這個任務。一樣的;按照國際慣例,先把完成的樣子走起。讓客倌們瞧瞧。就先上個熟悉的三連拍吧!
先來個前期劇情提要。要把從上次文章完結的工作進度,跨越到最篇文章所呈現的內容;事實上,當中有2個重要的問題要解決。第一個是上期中;事實上。我們只用到了向上的箭頭。所以先必須要找到如何設定向下的箭頭?然後第2個才是。標上綠色與紅色箭頭的重點。還是讓我們先來看看原始碼吧?
import yfinance as yf
import talib
import mplfinance as mpf
import pandas as pd
%matplotlib notebook
# 下載TSLA股票的資料
symbol = "TSLA"
data = yf.download(symbol, start="2023-01-01", end="2023-07-10")
# 計算吞噬K線組合
engulfing = talib.CDLENGULFING(data['Open'], data['High'], data['Low'], data['Close'])
data['Engulfing'] = engulfing
# 找出吞噬K線組合的日期
engulfing_dates = data.index[engulfing != 0]
bearish_engulfing_dates = data.index[engulfing == -100]
bullish_engulfing_dates = data.index[engulfing == 100]
# 在吞噬K線組合的日期上標示紅色向上箭頭和綠色向下箭頭
data['UpArrow'] = pd.Series(index=data.index, dtype='float64')
data.loc[bullish_engulfing_dates, 'UpArrow'] = data.loc[bullish_engulfing_dates, 'Low'] - 2
up_apd = mpf.make_addplot(data['UpArrow'], type='scatter', markersize=60, marker='^', panel=0, color='red')
data['DownArrow'] = pd.Series(index=data.index, dtype='float64')
data.loc[bearish_engulfing_dates, 'DownArrow'] = data.loc[bearish_engulfing_dates, 'High'] + 2
down_apd = mpf.make_addplot(data['DownArrow'], type='scatter', markersize=60, marker='v', panel=0, color='green')
# 繪製K線圖和成交量
mpf.plot(data, type='candle', volume=True, title=symbol, ylabel='Price', addplot=[up_apd, down_apd])
# 輸出報表
data.to_csv('report.csv')
接下來讓我佔點篇幅,將程式原始碼再顯示一次。這樣方便讓我們來做分段的解說。
import yfinance as yf
import talib
import mplfinance as mpf
import pandas as pd
%matplotlib notebook
# 下載TSLA"股票的資料
symbol = "TSLA"
data = yf.download(symbol, start="2023-01-01", end="2023-07-10")
# 計算吞噬K線組合
engulfing = talib.CDLENGULFING(data['Open'], data['High'], data['Low'], data['Close'])
data['Engulfing'] = engulfing
# 找出吞噬K線組合的日期
engulfing_dates = data.index[engulfing != 0]
bearish_engulfing_dates = data.index[engulfing == -100]
bullish_engulfing_dates = data.index[engulfing == 100]
相信程式碼到這裡,該對大家都不會感到非常的陌生。到目前為止,我們完成了股票代碼設定。以及限定時間長度的資料下載。然後啟動了TaLib,來幫我們篩選出符合條件的股票K線形態。在這裡,仍然選擇目標是吞噬圖形。最後那一段;將篩選出來的結果分類,最終將它區分成三類;分別是不為零的?100。跟--100的部分。並將這3個結果的獲得日期,分別儲存在3個數列當中。有興趣的朋友。可以去看看這3個數列所儲存的內容。
# 在吞噬K線組合的日期上標示紅色向上箭頭和綠色向下箭頭
data['UpArrow'] = pd.Series(index=data.index, dtype='float64')
然後在這裡。我們創建了一個列。UpArrow向上的箭頭列。
data.loc[bullish_engulfing_dates, 'UpArrow'] = data.loc[bullish_engulfing_dates, 'Low'] – 2
然後在這個向上的箭頭列當中,如果當日多頭的吞噬圖形成立。那么我們存入當天最低價減2個價位的位置;這個數據就是未來我們要顯示箭頭的地方。
up_apd = mpf.make_addplot(data['UpArrow'], type='scatter', markersize=60, marker='^', panel=1, color='red')
這一段我們新增一個畫布"addplot"。提供我們繪圖參數便是向上箭頭的數據那一列。然後它顯示出來的形態是一種點狀圖"Scatter"。我們給它的大小設定,參數為60。顯示一個向上的箭頭。這次新增了一個參數,顏色color。我們將它設定。為紅色red。這便是紅色像張箭頭的設定部分。這裡有一箇。重要的就是panel。在這個例子當中,整個K線的顯示部分,它就是panel0;也就是主畫布。而顯示成交量的部分,便是panel1;它是一個Subplot。我稱它為子畫布。在這裡必須特別的來解說一下;我們的整個畫布在設定之後,並不是只能單獨的顯示。某一個圖形。它是一個層層堆疊上去的狀態Overlay。就好像我們可以在這個組畫布上面先畫上K線,然後可以再堆疊上去移動平均線。所以目前有2個畫布;一個是編號0的主畫布。與成交量的編號1子畫布。在程式語言的圈圈裡,一般大部分都是從零開始起算。
有興趣的朋友,可以嘗試將程式段裡面。顯示向上與向下箭頭的panel設定為。1或2。
up_apd = mpf.make_addplot(data['UpArrow'], type='scatter', markersize=60, marker='^', panel=1, color='red')
down_apd = mpf.make_addplot(data['DownArrow'], type='scatter', markersize=60, marker='v', panel=2, color='green')
那么我們的箭頭便不是顯示在主畫面上;應該會得到下面這樣的結果。在這裡就可以看到畫布編號,所佔的位置是哪些部分?
data['DownArrow'] = pd.Series(index=data.index, dtype='float64')
data.loc[bearish_engulfing_dates, 'DownArrow'] = data.loc[bearish_engulfing_dates, 'High'] + 2
down_apd = mpf.make_addplot(data['DownArrow'], type='scatter', markersize=60, marker='v', panel=2, color='green')
這一段與上一段。剛好是完全相反的。也就是我們所要的顯示綠色箭頭向下的設定部分。首先把這個將來要標識的綠色向下箭頭,顯示在形態發生當日最高價格。往上2個價位部分。其它就跟紅色箭頭設定的都大同小異。現在終於知道了如何解決顯示兩種箭頭的方法。那就是不用花俏的方法,直接用新建立另一列數據的方式,來儲存這些資料。所以透過剛才所談的堆疊方式;未來在panel0上面,就是顯示K線向上箭頭與向下箭頭三種一起堆疊呈現。
# 繪製K線圖和成交量
mpf.plot(data, type='candle', volume=True, title=symbol, ylabel='Price', addplot=[up_apd, down_apd])
# 輸出報表
data.to_csv('report.csv')
後面這一部分。就是把我們所有的設定結果顯示在螢幕上。增加的只是最後一行;呼喚一個pandas的功能,將我們的篩選結果輸出為一個CSV的檔案。方便日後隨時可以調閱。
在這篇文章當中。我們建立了許多的資料框以及數列。其中最重要的一個便是存放了絕大部分數據的data數據框Dataframe。這個也是我們輸出報表的內容。它的結構大概長了這個樣子。
你也可以使用以下的指令來開啟這個檔案,並閱讀它。
rep = pd.read_csv('report.csv')
記得要先 import pandas as pd 喔!
那么今天就先討論到這裡。真摯的的謝謝您熱情的這一路以來的參與。並歡迎加入互動討論。祝您交易順利。早安,午安晚安。