客製化金融儀錶板

photo by Unsplash

前言

延續前幾集對於 python 常用的套件,如 numpy, pandas 和 matplotlib 進行介紹,本次將結合上述套件的功能,提出實用的案例分享。

作為一個投資人,每天的例行公事就是要花時間觀看一些市場的統計資訊,而每次要觀看時都要先去證交所下載資料,再透過excel拉出圖表,這作業實在很繁瑣。比起每日執行一連串重複動作,使用程式執行明顯更有效率!

本篇文章的目的就是要教大家如何運用 python 整理資料並繪製出想要的資訊,客製化屬於自己的金融儀錶板 ~

本文重點概要

  • matplotlib 繪製儀錶板

使用 matplotlib 繪製儀錶板

匯入套件

import tejapi
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import datetime
tejapi.ApiConfig.api_key = 'your key'

資料撈取

1️⃣ 撈取上市所有普通股證券代碼

# 撈取上市所有普通股證券代碼
stk = tejapi.get('TWN/EWNPRCSTD'
,paginate = True
,chinese_column_name = True)
code = stk['證券碼'][(stk['證券種類名稱']=='普通股')&(stk['上市別']=='TSE')].to_list()
code
上市所有普通股代碼

2️⃣ 撈取法人買賣超(日)

# 撈取法人買賣超(日)
buyover = tejapi.get('TWN/EWTINST1'
             ,coid=code
             ,mdate = {'gte':'2021-01-01'}
             ,paginate = True
             ,chinese_column_name = True)
# 修改日期格式
buyover['日期'] = buyover['日期'].apply(lambda x: pd.to_datetime(x).date())
buyover['日期'] = buyover['日期'].astype('datetime64')
buyover[buyover['日期']>='2021-03-20']
法人買賣超(日)

3️⃣撈取股價資料

# 撈取股價資料
stock_price = tejapi.get('TWN/EWPRCD',
coid = code,
mdate={'gte':'2021-03-20'},
opts={'columns':['coid','mdate','open_d', 'high_d','low_d','close_d','volume']}
,paginate = True,chinese_column_name = True)
# 調整日期格式
stock_price['日期'] = stock_price['日期'].apply(lambda x: pd.to_datetime(x).date())
stock_price['日期'] = stock_price['日期'].astype('datetime64')
stock_price
股價資料

資料彙整

分別以外資、投信和自營買賣超為排序標準,計算一個月以來的累積買賣超,下圖以排序前10名為例。

外資買超前10名的個股為彩晶、中信金、新光金、華邦電、佳世達、宏碁、國泰金、日月光、京元電、富邦金和南亞,金融、面板半導體相關產業類股占大多數。

投信買超前10名之標的為群創、友達、中鋼、華航、聯電、長榮、華邦電、南紡、彩晶、裕民,與外資的投資風格迥異,除了面板記憶體外,其他皆為傳產(航運、鋼鐵和紡織)

自營買超前10名之標的為中鋼、聯電、新光金、中石化、友達、台泥、彩晶、群創、大成鋼、開發金,與投信的看法較接近,資金主要分布在面板以及傳產(鋼鐵和石化),同時也有部分資金投入金融類股。

綜合上述,三者的交集為面板產業,目前內資在籌碼面上看法一致,多在傳產上下了重注,外資則更多分配在金融與科技類股。

sorted_fi = buyover[buyover['日期']>'2021-03-20'].groupby(by='證券碼').sum().sort_values(by='外資買賣超(千股)',ascending = False)
sorted_fi[:10]
sorted_it = buyover[buyover['日期']>'2021-03-20'].groupby(by='證券碼').sum().sort_values(by='投信買賣超(千股)',ascending = False)
sorted_it[:10]
sorted_pro = buyover[buyover['日期']>'2021-03-20'].groupby(by='證券碼').sum().sort_values(by='自營買賣超(千股)',ascending = False)
sorted_pro[:10]
近一月外資累積買超-前10名
近一月投信累積買超-前10名
近一月自營累積買超-前10名

增加濾網:三大法人之近月累積量同步買超(外資買超>0 and 投信買超>0 and 自營買超>0)

增加濾網後,可藉此觀察三大法人看法一致的個股,並同樣以外資、投信和自營商的買超量分別進行排序。

sorted_fi[(sorted_fi['外資買賣超(千股)']>0)&(sorted_fi['投信買賣超(千股)']>0)&(sorted_fi['自營買賣超(千股)']>0)][:10]
sorted_it[(sorted_it['外資買賣超(千股)']>0)&(sorted_it['投信買賣超(千股)']>0)&(sorted_it['自營買賣超(千股)']>0)][:10]
sorted_pro[(sorted_pro['外資買賣超(千股)']>0)&(sorted_pro['投信買賣超(千股)']>0)&(sorted_pro['自營買賣超(千股)']>0)][:10]
外資近一月累積買賣超-前10名 
投信近一月累積買賣超-前10名
自營近一月累積買賣超-前10名

整理好資料後就可以開始製作我們的儀錶板了😄~

繪製儀錶板

外資買/賣超排名前5大

  • 外資近5天買/賣超排名
  • 外資近20天買/賣超排名
  • 外資近60天買/賣超排名

buy_table : 用來存放不同週期下買超前五大的 dataframe。
sell_table : 用來存放不同週期下賣超前五大的 dataframe。
xx : 計算5, 20, 60天下每一檔個股的累積買賣超。
x.insert() : 插入名為 stock的欄位,其值設定為 xx。
x : 存放相同週期多股的累積買賣超的 dataframe。
x.loc[len(x)-1] : 呼叫最新一期的 x值。
sort_values(ascending=False)[:5] : 根據給定值,由大至小排序,排序結果之前 5名。
reset_index(drop=True) : 重設 dataframe or series 的 index。

buy_table = pd.DataFrame()
sell_table = pd.DataFrame()
for i in [5,20,60]:
    x = pd.DataFrame()
    for stock in code:
        # i日累積買賣超
        xx = buyover['外資買賣超(千股)'][buyover['證券碼']==stock].rolling(i).sum().reset_index(drop=True)
        x.insert(loc=0,column=stock,value=xx)
    # 買超排名前5
    buy_table[str(i)+'日累積外資買超(千股)'] = x.loc[len(x)-1].sort_values(ascending=False)[:5].reset_index(drop=True)
    buy_table[str(i)+'日排名(股票)'] = x.loc[len(x)-1].sort_values(ascending=False)[:5].index
    # 買超排名前5
    sell_table[str(i)+'日累積外資賣超(千股)'] = x.loc[len(x)-1].sort_values(ascending=True)[:5].reset_index(drop=True)
    sell_table[str(i)+'日排名(股票)'] = x.loc[len(x)-1].sort_values(ascending=True)[:5].index
buy_table
sell_table
4/19 買超排名前5大
賣超排名前5大

買賣超/股價圖

plt.style.use : 設定繪圖風格。
plt.rcParams[‘font.sans-serif’]=[‘Microsoft YaHei’] : 設定字體,python內件沒有中文字體,需要額外匯入字體才能顯示中文。
stock = input() : 手動輸入欲查詢之個股代碼。
FI1.twinx() : 共用 FI1的x軸。

# 調整畫圖模組
plt.style.use('seaborn-darkgrid')
# 調整字體
plt.rcParams['font.sans-serif']=['Microsoft YaHei']
# 可自行輸入股票代號
stock =input()
title = stock+' '+stk['證券名稱'][stk['證券碼']==stock].to_list()[0]
fig, FI1 = plt.subplots(figsize=(10,5))
plt.title(title,{'fontsize' : 20})
plt.xlabel('Date', fontsize=14)
price = FI1.twinx()
# 設定買賣超金額
FI1.set_ylabel('外資買賣超(千股)',color='tab:blue', fontsize=14)
FI1.bar(x=buyover['日期'][buyover['證券碼']==stock]
        ,height=buyover['外資買賣超(千股)'][buyover['證券碼']==stock]
        ,width = 0.8)
FI1.tick_params(axis='y',labelcolor = 'tab:blue')
# 設定收盤價
price.set_ylabel('收盤價(元)'
                 ,color='black'
                 ,fontsize=14)
price.plot(stock_price['日期'][stock_price['證券碼']==stock]
           ,stock_price['收盤價'][stock_price['證券碼']==stock]
           ,color='orange'
           ,alpha=3)
#plt.xticks(rotation=45)
price.tick_params(axis='y',labelcolor = 'black')
# 取消 price的 grid
price.grid(False)

結語

圖表製作方法以及呈現方式可以說是百百種,我們介紹了如何將自己常看的圖表透過python來實現,畢竟學習程式很大一項好處在於能減少繁瑣的例行公事,如果大家喜歡整合圖表類的主題,可以在下方留言告訴我們,未來也會持續分享 python 在投資領域上的應用,請大家拭目以待 ❗️❗️ 此外大家也可以透過這些 package 的官方網站去探索更多功能~

最後,如果喜歡本篇文章的內容請幫我們點擊下方圖示👏 ,給予我們更多支持與鼓勵,有任何的問題都歡迎在下方留言/來信,我們會盡快回覆大家👍👍

完整程式碼

延伸閱讀

相關網站連結

有任何使用上的問題都歡迎與我們聯繫:聯絡資訊

返回總覽頁