本來模組化這件事;打算在我們完成股票池工作之後再來談的。沒想到這幾天,已經有一些朋友反應;大概因為端午節的關係,提前磕了太多粽子,導致有點消化不良。所以左思右想之後,決定提前先上一下模組化的部分。目的在於簡化工作。我們討論系列文章的目的,或許跟大家介紹許多一般比較少用的Python套件。但是Python的一些基本語法,在網路或我們周遭,已經有太多大神打造了許許多多深入淺出的課程。所以這不是我們要的重點。一路以來,總喜歡跟大家傳遞一些簡單的概念;很多事情大家把它擰成複雜了。那樣生活和學習就不好玩了。所以我們的系列文章,最終目的是想讓大家藉著這一系列文章下來後所成立的許多小工具,形成一個真正實用的量化平台;並協助簡化交易,以及方便的修正自己的交易策略。在未來。能夠使用最少行的程式敘述,方便地去建立自己的交易策略。
那就話不多說;直接上菜。不過今天沒有程式執行的畫面,因為執行出來的畫面跟上一篇文章的結果是一樣的。這一期的重點,是放在它精簡後的程式碼上面。我們把上一篇大家反應有點長的程式碼,濃縮成剩下面的這幾行程式碼。這下子簡單有了,精簡了;但是保證效果一樣好。
from stock_chart import StockChart
StkList= ['AAPL', 'NVDA', 'TSLA','2330.TW','2317.TW']
chart = StockChart(['AAPL', 'NVDA', 'TSLA','2330.TW','2317.TW'], '2023-01-01', '2023-06-17')
chart.show()
就是簡化成最後的這五行。不過如果現在就急著把它貼上自己的程式編輯環境去執行;它肯定是不會理你的。所以先靜下心來;坐好板凳,聽我先解釋吧。
首你會看到第一行引入的東西就有點不一樣了。
from stock_chart import StockChart
這是因為趁著月黑風高四下無人的時候,我把原來的一段重要程式碼包裝成了一個模組。它就是這一行引入當中的stock_chart.py模組。大家可以從等一下的解說當中直接拷貝程式碼,利用文字編輯工具去生成。或者可以用以下的網址;直接下載。
下載完成之後,可以使用文字編輯器或者Python的開發環境直接開啟。順利的話,應該它的內容如下。
import yfinance as yf
import mplfinance as mpf
import ipywidgets as widgets
from IPython.display import display, clear_output
class StockChart:
def __init__(self, codes, start_date, end_date):
self.codes = codes
self.start_date = start_date
self.end_date = end_date
self.data = None
# Create a dropdown widget for the stock code
self.code_dropdown = widgets.Dropdown(
options=self.codes,
value=self.codes[0],
description='Stock Code:',
disabled=False,
)
# Download the initial data
self.download_data(self.code_dropdown.value)
# Create an IntSlider widget for setting the number of days to display
self.days_slider = widgets.IntSlider(
value=5,
min=5,
max=len(self.data),
step=1,
description='Days:',
disabled=False,
continuous_update=False,
orientation='horizontal',
readout=True,
readout_format='d'
)
# Create a button widget for submitting the input
self.submit_button = widgets.Button(
description='Plot Chart',
disabled=False,
button_style='', # 'success', 'info', 'warning', 'danger' or ''
tooltip='Click to plot chart',
icon='check' # (FontAwesome names without the `fa-` prefix)
)
# Attach the click event handler to the button
self.submit_button.on_click(self.on_submit_button_clicked)
# Attach the change event handler to the dropdown
self.code_dropdown.observe(self.on_code_dropdown_change)
def download_data(self, code):
self.data = yf.download(code, start=self.start_date, end=self.end_date)
def on_submit_button_clicked(self, b):
# Get the input values
code = self.code_dropdown.value
days = self.days_slider.value
# Set the candlestick colors and style
my_color = mpf.make_marketcolors(up='r', down='g', edge='inherit', wick='inherit', volume='inherit')
my_style = mpf.make_mpf_style(marketcolors=my_color, figcolor='(0.82, 0.83, 0.85)', gridcolor='(0.82, 0.83, 0.85)')
# Clear the previous chart
clear_output(wait=True)
# Plot the candlestick chart
mpf.plot(self.data.tail(days), type='candle', volume=True, style=my_style, title=str(code), figsize=(8, 5))
# Redisplay the input widgets and button
display(self.code_dropdown, self.days_slider, self.submit_button)
def on_code_dropdown_change(self, change):
if change['type'] == 'change' and change['name'] == 'value':
self.download_data(change['new'])
def show(self):
# Display the input widgets and button initially
display(self.code_dropdown, self.days_slider, self.submit_button)
# Example usage:
chart = StockChart(['AAPL', 'NVDA', 'TSLA'], '2023-01-01', '2023-06-11')
chart.show()
這裡大部份的內容,擷取自上篇文章中的程式碼。其中的一些差別就是在包裝這個模組的時候,我們把一些函式集合起來做成了類別class。注意到最後的四行。這是一段註解如何使用的說明。也就是我們之前,所謂簡化後的執行程式碼。如果你不是經由剛才下載點所得到的檔案,現在完全可以把這段程式碼複製粘貼到自己的文字編輯器當中;之後將它另存為stock_chart.py;它的效果是完全一樣的。對了,請注意它的大小寫。我們這些重點在於介紹如何使用它。首先使用這個模組,我們必須先Import它。所以回到簡化後程式碼第一行。
from stock_chart import StockChart 這一行的。引入跟一般模組的引入沒有什麼不同。現在所要談的重點是;平時大概都是透過pip來安裝套件,然後在程式書寫當中直接瀟灑的import就完事了。但是在今天這個例子當中,我們這個模組。並不是透過安裝來的,所以有些狀況必須要先解釋一下。
首先,以及最重要的;便是要確定自己的Python程式,在import的敘述之後,可以順利地尋找到這個模組;不然的話就做白工了。
所以這個檔案的安放位置在這裡是非常重要的事情。必須先知道Python可以從哪裡去尋找到。對於這個檔案,一般來說它有3個地方可以尋找到。
第一種方法最簡單。就是把這個模組,跟我們的執行程式碼放在同一個目錄底下。如此在做引入動作之後,Python便可以直接找到檔案。這也是最簡便的方法。第二種其實跟第一種是類似的;應該是一種概念的延伸。就是把這個檔案放置在我們Windows系統設定的路徑當中。可以在命令模式CMD底下輸入echo %path% 來顯示目前系統當中所設定的路徑。這些路徑也應該都在系統與Python的掌控之中。第三,最後一種方式。應該是最正統的吧?就是把這個模組放在跟我們一般pip安裝套件之後所放的目錄在一起。要如何知道Python的環境下路徑設定如何呢?可以輸入以下的這個代碼。
import sys
print(sys.path)
執行這段代碼之後,應該會回應許多的路徑。當然這些路徑也都可以放置,Python也都可以找到。其中有一個特殊名稱的路徑,也就是剛剛說的幾乎所有安裝後套件放置的地方。以我的電腦為例。我的Anaconda是安裝在C:\\AnaConda3目錄之下,所以它對應的路徑應該是。C:\\AnaConda3\\lib\\site-packages 理論上把模組放在這裡,應該是最正確的吧?反正不管你安裝的是哪種版本的開發環境。在安裝目錄之下,尋找\lib\site-packages 這個目錄位置應該就八九不離十了。
當把我們的模組放置到了對的地方以後;執行簡化後的那五行程式,就可以順利的產生,跟上篇文章一樣的工作畫面。在順利引入模組之後,便可以做一些常規的查詢;比如dir或者是StockChart.然後按tab鍵,都可以看到一些這個套件的資訊。好了。今天就簡單的對將程式模組化,以及如何引入使用的方法;做一個介紹。最後在這裡祝大家端午節闔家安康;佳節愉快。我們下次見。
對了,最後跟大家說明一下;返台之後發現台灣的物價,飛漲到幾乎不認識它的程度。所以提醒各位好朋友;如果對我們的極限交易法課程有興趣的,請儘快與我洽詢預訂上課時間。因為實在沒有辦法支招了,很可能決定調漲幾年來都未曾調整過的課程價格。在此,非常抱歉!提前跟大家預告一下。感謝您的理解。與長時間以來對課程的支持。祝大家交易順利。