Table of Contents
延續前幾集對於 python 常用的套件,如 numpy, pandas 和 matplotlib 進行介紹,本次將結合上述套件的功能,提出實用的案例分享。
作為一個投資人,每天的例行公事就是要花時間觀看一些市場的統計資訊,而每次要觀看時都要先去證交所下載資料,再透過excel拉出圖表,這作業實在很繁瑣。比起每日執行一連串重複動作,使用程式執行明顯更有效率!
本篇文章的目的就是要教大家如何運用 python 整理資料並繪製出想要的資訊,客製化屬於自己的金融儀錶板 ~
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]
增加濾網:三大法人之近月累積量同步買超(外資買超>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]
整理好資料後就可以開始製作我們的儀錶板了😄~
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
買賣超/股價圖
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 的官方網站去探索更多功能~
最後,如果喜歡本篇文章的內容請幫我們點擊下方圖示👏 ,給予我們更多支持與鼓勵,有任何的問題都歡迎在下方留言/來信,我們會盡快回覆大家👍👍
有任何使用上的問題都歡迎與我們聯繫:聯絡資訊
電子報訂閱