2023-12-08|閱讀時間 ‧ 約 14 分鐘

使用MPLFINANCE 打造一個互動的顯示股票線圖工具(4模組化)[QuantTradingwithPython_4]


raw-image


本來模組化這件事;打算在我們完成股票池工作之後再來談的。沒想到這幾天,已經有一些朋友反應;大概因為端午節的關係,提前磕了太多粽子,導致有點消化不良。所以左思右想之後,決定提前先上一下模組化的部分。目的在於簡化工作。我們討論系列文章的目的,或許跟大家介紹許多一般比較少用的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鍵,都可以看到一些這個套件的資訊。好了。今天就簡單的對將程式模組化,以及如何引入使用的方法;做一個介紹。最後在這裡祝大家端午節闔家安康;佳節愉快。我們下次見。

對了,最後跟大家說明一下;返台之後發現台灣的物價,飛漲到幾乎不認識它的程度。所以提醒各位好朋友;如果對我們的極限交易法課程有興趣的,請儘快與我洽詢預訂上課時間。因為實在沒有辦法支招了,很可能決定調漲幾年來都未曾調整過的課程價格。在此,非常抱歉!提前跟大家預告一下。感謝您的理解。與長時間以來對課程的支持。祝大家交易順利。











分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.