[專題實作]以Yfinance之臺股資料進行市場寬度指標驗證-Step1爬取上市櫃公司股票與ETF代碼名單


    
    哎,老實說我不太曉得要怎麼開頭,總之呢去年年底參加了工研院主辦的數據分析師養成班(第2梯)想了解課程介紹的可以點連結去看一下課程的內容,但這篇也不是要寫心得(辣個以後再說),但到了結訓還是要有專題吧~,專題的題目說真的超~極~難~想~,後來還是在親哥的提點下決定來搞一把這個專題,題目還寫得有夠豪洨「以Yfinance之臺股資料進行市場寬度指標驗證」,總而言之一切的一切就在於2022年我開始努力存錢然後歐印台股,套的一蹋糊塗,於是我哥拋了一個影片給我,說裡面有韭菜們需要的答案(並不是這樣

影片連結我直接加在圖裡面了,韭韭們可以直接點圖看連結!

不過呢,韭不韭一回事,Code才是最重要的對吧!?
前情提要! 先去ANACONDA的 Prompt 派起來! 

如果跟我一樣用Visua Studio 可以直接在終端機pip(不要問我怎麼安裝環境,我的環境是前男友幫我搞的,感恩前任讚嘆前任!)

線上的記得要加!(例:jupyter上要用 !pip install pandas)
大神們可以跳過這段~這純粹是當初的小白我看老半天找不到要去哪裡pip所以給新手村玩家參考用!

pip install pandas 中國來的(並不是

pip install requests (用來爬蟲的)

pip install yfinance(後面會用到的財經模組庫)

pip install backtesting(後面會用到的回測工具)

那我們開始吧!複製貼上!

首先是爬取證交所上市櫃公司的股票代號清單

來源網址:自己看蛤
上市證券一覽:https://isin.twse.com.tw/isin/C_public.jsp?strMode=2
上櫃證券一覽:https://isin.twse.com.tw/isin/C_public.jsp?strMode=2
這邊我只要取得上市、上櫃公司股票代碼和ETF 其他權證類都不要
另外因為後續的Yfinance所取得的代碼要求上市+".TW"、上櫃+".TWO",這邊直接把他們全部都給SOLO起來(by 刀鋒寶貝寧貴人)

基本上模組大家抄來抄去就這樣啦 反正複製貼上什麼的最棒了(謎

很多小細節我都標在程式碼裡面 "操作段落" 或 #特別備註

import requests,time,os,re #其實os和re可以不用,我是一開始有使用後來都刪掉了
import pandas as pd
#上市
time.sleep(3) #小白友善+N

#拜託幾類各位大神給小白的code麻煩time.sleep放前面,小白不小心按兩下直接就被封ip了Q_Q
url = 'https://isin.twse.com.tw/isin/C_public.jsp?strMode=2'
webpage = requests.get(url)
data_F = pd.read_html(webpage.text)[0]
#用Pandas解析html,轉成DataFrame格式,取第[0]張表

data_F.columns = data_F.iloc[0]
#將首行設為欄位屬性
data_F = data_F[1:]
#但這樣就會是 index=[0] 但還有一個[0]存在,所以取[1:]*刪除[0]
TWstock_index_All=[]
TWstock_name_All=[]
TWstock_index_All = list(data_F['有價證券代號及名稱'].str.split(" ").str[0])
TWstock_name_All = list(data_F['有價證券代號及名稱'].str.split(" ").str[1])
#這裡要用符號切割,不要用正則化(不好切)
# print(type(TWstock_index_All),TWstock_index,TWOstock_name_All)
'上市公司股票:'
TW_op = TWstock_index_All.index('1101') #第一個是1101的台泥
TW_ed = TWstock_index_All.index('9958')+1 #目前上市最後一筆是9958,如果有再多就要改了
TWstock_index = []
TWstock_name = []
for i in TWstock_index_All[TW_op:TW_ed]:
    TWstock_index.append(i)
# print(TWstock_index)
for i in TWstock_name_All[TW_op:TW_ed]:
    TWstock_name.append(i)
# print(TWstock_name)
TWstock_dict=dict(zip(TWstock_index,TWstock_name)) 
#這是做一個字典如果有查找需求可以直接用,注意上市有一支序號[650]的爬下來切割有問題要手動改(自己改!
'上市ETF:'
TW_etf_op = TWstock_index_All.index('0050')
TW_etf_ed = TWstock_index_All.index('00921')+1
TW_etf_index = []
TW_etf_name = []
for i in TWstock_index_All[TW_etf_op:TW_etf_ed]:
    TW_etf_index.append(i)
# print(TW_etf_index)
for i in TWstock_name_All[TW_etf_op:TW_etf_ed]:
    TW_etf_name.append(i)
# print(TW_etf_name)
TW_etf_dict=dict(zip(TW_etf_index,TW_etf_name)) #這是做一個字典如果有查找需求可以直接用
#================================================================
#上櫃
time.sleep(3)
url = 'https://isin.twse.com.tw/isin/C_public.jsp?strMode=4'
webpage = requests.get(url)
data_F = pd.read_html(webpage.text)[0]
#用Pandas解析html,轉成DataFrame格式,取第[0]張表

data_F.columns = data_F.iloc[0]
#將首行設為欄位屬性
data_F = data_F[1:]
#但這樣就會是 index=[0] 但還有一個[0]存在,所以取[1:]*刪除[0]
TWOstock_index_All=[]
TWOstock_name_All=[]
TWOstock_index_All = list(data_F['有價證券代號及名稱'].str.split(" ").str[0])
TWOstock_name_All = list(data_F['有價證券代號及名稱'].str.split(" ").str[1])
# print(type(TWOstock_index),TWOstock_index,TWOstock_name)
'上櫃公司股票:'
TWO_op = TWOstock_index_All.index('1240')
TWO_ed = TWOstock_index_All.index('9962')+1
TWOstock_index = []
TWOstock_name = []
for i in TWOstock_index_All[TWO_op:TWO_ed]:
    TWOstock_index.append(i)
# print(TWOstock_index)
for i in TWOstock_name_All[TWO_op:TWO_ed]:
    TWOstock_name.append(i)
# print(TWOstock_name)
TWOstock_dict=dict(zip(TWOstock_index,TWOstock_name)) #這是做一個字典如果有查找需求可以直接用
'上櫃ETF:'
TWO_etf_op = TWOstock_index_All.index('006201')
TWO_etf_ed = TWOstock_index_All.index('00890B')+1
TWO_etf_index = []
TWO_etf_name = []
for i in TWOstock_index_All[TWO_etf_op:TWO_etf_ed]:
    TWO_etf_index.append(i)
# print(TWOstock_etf_index)
for i in TWOstock_name_All[TWO_etf_op:TWO_etf_ed]:
    TWO_etf_name.append(i)
# print(TWOstock_etf_name)
TWO_etf_dict=dict(zip(TWO_etf_index,TWO_etf_name)) #這是做一個字典如果有查找需求可以直接用
#================================================================
'上市+.TW,上櫃+.TWO'
#將全部代碼冠上.TW/.TWO,丟到List裡面
TW_TWO = []
for i in TWstock_index:
    TW_TWO.append(i+'.TW')
for i in TW_etf_index:
    TW_TWO.append(i+'.TW')
for i in TWOstock_index:
    TW_TWO.append(i+'.TWO')
for i in TWO_etf_index:
    TW_TWO.append(i+'.TWO')
print(len(TW_TWO),TW_TWO)
time.sleep(3)
path =r'D:\市場寬度 專題\2023上市櫃股票及ETF代碼(for yfinance).csv'
#這是我的路徑,複製貼上的小夥伴記得要改蛤!
TW_TWO_df = pd.DataFrame(data=TW_TWO)
TW_TWO_df.to_csv(path, sep=',', na_rep='',encoding='utf_8_sig')
#爬下來的上市公司資料有一筆沒有成功切割(原因不明):序號[650]:[4148 全宇生技-KY.TW]手動修改資料就可以。

好了第一篇先這樣,有夠長的,但夠完整囉!直接貼上就能用,舒服ㄉ要死啊!
另外說明是是yfinance才要加".TW"和".TWO",臺灣加權指數的話是"^TWII",其他指數要自己上Yahoo股市查詢他的名稱。

留言

這個網誌中的熱門文章

[專題實作]以Yfinance之臺股資料進行市場寬度指標驗證-總結

[專題實作]以Yfinance之臺股資料進行市場寬度指標驗證-Step4.匯入檔案以產生策略