接上一篇,看來花花綠綠的東西跟我們是無望了。對原本接下來的計畫也只好做一些改變。所以衹能把我們的程式碼,重新移動到了7月7號那篇文章的進度NBLOG_20230707使用TA_LIB(PANDAS_TA) 打造一個交易策略實用工具(2TA_LIB輕探之馬克快來幫幫手)。就決定從這個地方開始新方向。先確認個進度,原始程式碼與輸出的結果如下。
import yfinance as yf
import talib
import mplfinance as mpf
import pandas as pd
%matplotlib notebook
# 下載AAPL股票的資料
symbol = "AAPL"
data = yf.download(symbol, start="2023-01-01", end="2023-08-14")
# 計算吞噬K線組合
engulfing = talib.CDLENGULFING(data['Open'], data['High'], data['Low'], data['Close'])
# 找出吞噬K線組合的日期
engulfing_dates = data.index[engulfing != 0]
# 在吞噬K線組合的日期上標示三角箭頭
data['Arrow'] = pd.Series(index=data.index, dtype='float64')
data.loc[engulfing_dates, 'Arrow'] = data.loc[engulfing_dates, 'Low'] - 2
apd = mpf.make_addplot(data['Arrow'], type='scatter', markersize=60, marker='^', panel=0)
# 繪製K線圖和成交量
mpf.plot(data, type='candle', volume=True, title=symbol, ylabel='Price', addplot=apd)
既然要動刀給它手術了;就順便把一些也忍了很久的缺點一併解決。所以在這一章中,先來解決一些關於資料下載的問題。首先我想讓下載資料長度活起來。蠻討厭的;每次總是要去敲鍵盤,輸入開始日期以及資料的截止日期。對吧!沒說錯吧?我看見有人舉手了。所以必須要調用jupyter notebook的部件小工具widgets,來幫大夥解決這個問題。這個小工具就叫做日期挑選器Date picker。
程式範例如下、、
widgets.DatePicker(
description='Pick a Date',
disabled=False
)
看起來還蠻容易使用的。但事實上它有兩個是可以控制的;首先是上面的這個description。衹是用來設定一個指示文字的標題欄,沒什麼技術含量的。另外還有一個value。這個便是輸出點擊後的日期變數。在之後的範例程式中可以看到它的使用。但在事實上,這個變數是可以雙向使用的。也就是說我們可以來設定這個小工具呈現時候所預設的日期。放心,這個我們之後的範例中會再介紹。現在就來看看第一步改造後的結果。
import yfinance as yf
import talib
import mplfinance as mpf
import pandas as pd
import datetime
import ipywidgets as widgets
from IPython.display import display
# 創建日期小部件
start_date_widget = widgets.DatePicker(description='開始日期')
end_date_widget = widgets.DatePicker(description='結束日期')
button = widgets.Button(description='開始繪圖')
# 定義按鈕點擊事件處理函數
def plot_stock_data(button):
# 獲取所選的開始日期和結束日期
start_date = start_date_widget.value
end_date = end_date_widget.value
# 下載AAPL股票的資料
symbol = "AAPL"
data = yf.download(symbol, start=start_date, end=end_date)
# 計算吞噬K線組合
engulfing = talib.CDLENGULFING(data['Open'], data['High'], data['Low'], data['Close'])
# 找出吞噬K線組合的日期
engulfing_dates = data.index[engulfing != 0]
# 在吞噬K線組合的日期上標記三角箭頭
data['Arrow'] = pd.Series(index=data.index, dtype='float64')
data.loc[engulfing_dates, 'Arrow'] = data.loc[engulfing_dates, 'Low'] - 2
apd = mpf.make_addplot(data['Arrow'], type='scatter', markersize=60, marker='^', panel=0)
# 繪製K線圖和成交量
mpf.plot(data, type='candle', volume=True, title=symbol, ylabel='Price', addplot=apd)
# 將小部件和按鈕顯式顯示
display(start_date_widget)
display(end_date_widget)
display(button)
# 將按鈕的點擊事件與繪圖函數綁定
button.on_click(plot_stock_data)
好的,這下子我們動動滑鼠。就可以自由的選擇下載資料的長度了。如果再配上了,我們 Jupyter notebook的神奇指令 %matplotlib notebook。這下子觀察的自由度就會更大了。
弄到這裡了,可是還是覺得有個地方癢癢的對不對?既然讓我們恨得牙癢癢的;那就用力抓吧!接下來再下一刀,把這個沉痾解決了。再請來個小部件,把股票觀察視野擴大。
import yfinance as yf
import talib
import mplfinance as mpf
import pandas as pd
import datetime
import ipywidgets as widgets
from IPython.display import display
# 創建日期和股票代碼小部件
start_date_widget = widgets.DatePicker(description='開始日期')
end_date_widget = widgets.DatePicker(description='結束日期')
symbol_widget = widgets.Text(description='股票代碼')
button = widgets.Button(description='開始繪圖')
# 定義按鈕點擊事件處理函數
def plot_stock_data(button):
# 獲取所選的開始日期、結束日期和股票代碼
start_date = start_date_widget.value
end_date = end_date_widget.value
symbol = symbol_widget.value
# 下載股票資料
data = yf.download(symbol, start=start_date, end=end_date)
# 計算吞噬K線組合
engulfing = talib.CDLENGULFING(data['Open'], data['High'], data['Low'], data['Close'])
# 找出吞噬K線組合的日期
engulfing_dates = data.index[engulfing != 0]
# 在吞噬K線組合的日期上標記三角箭頭
data['Arrow'] = pd.Series(index=data.index, dtype='float64')
data.loc[engulfing_dates, 'Arrow'] = data.loc[engulfing_dates, 'Low'] - 2
apd = mpf.make_addplot(data['Arrow'], type='scatter', markersize=60, marker='^', panel=0)
# 繪製K線圖和成交量
mpf.plot(data, type='candle', volume=True, title=symbol, ylabel='Price', addplot=apd)
# 將小部件和按鈕顯式顯示
display(start_date_widget)
display(end_date_widget)
display(symbol_widget)
display(button)
button.on_click(plot_stock_data)
是吧,找來了老朋友幫我們抓癢。這個小部件就可以解決了,輸入股票代碼的問題。看起來一切都朝著所要的方向前進。今天就先牛刀小試,解決這兩個問題。在下一篇當中。會依然朝著這個方向去拓展我們需要的功能。希望改變後的這個開發方向是正確的。那麼我們這一篇就先談到這裡,也真誠的期待著你對這系列文章的反饋與建議。很期待下期很快就能跟大家再見面。祝你早安,午安晚安。