python上櫃資料爬蟲輕鬆做

謝謝各位的支持,有很多人寄信來問各式各樣不同的研究!
但因為討論熱烈,我目前先挑比較簡單的做,其它的在清單中,依序補上~
最近發現上櫃的股票也滿多人在看的,今天教大家如何用python抓取上櫃公司的收盤價!

thumbnail 4

首先,我們只要從這個網址,把資料get下來就行了!

爬取上櫃股價網址

import requests

link = 'http://www.tpex.org.tw/web/stock/aftertrading/daily_close_quotes/stk_quote_download.php?l=zh-tw&d=107/02/09&s=0,asc,0'
r = requests.get(link)
r.ok
get

可以看到網址中,包含了日期:107/02/09,這個字樣,可以改成其它日期。
get下來就是csv檔了!直接丟進pandas:

使用pandas讀取

lines = r.text.replace('\r', '').split('\n')

import pandas as pd
from io import StringIO
df = pd.read_csv(StringIO("\n".join(lines[3:])), header=None)
df.head()

但我發現一個小問題:

  • 在csv檔中,第一行是:”a”,”b”,”c”
  • 但是在其它行,則顯示:a,b,c

有沒有雙引號很重要,會讓pandas沒辦法直接讀進來,所以我們前面幾行先去除(上段code中lines[3:]

就可以得到下圖:

unindex

但我們的index跟column都還沒設定好(都是數字),要把它轉換成有意義的label:

整理index跟columns

df.columns = list(map(lambda l: l.replace(' ',''), lines[2].split(',')))
df.index = df['代號']
df = df.drop(['代號'], axis=1)
df.head()

首先先來換column,裡面有些複雜的程式(第一行)慢慢講解:

  1. lambda l: l.replace(' ','') 是一個函式,但是我懶得命名,所以就用 lambda 賴省略函式名稱,它會讀入,這個函式讀入 l,並將l裡面的空白刪除並outpu出來。
  2. 其中的map(func, array)就指:將array裡面所有元素,都用func處理一遍。
  3. line[2].split(','):將字串依照 “,” 分割成好幾個小字串。

總體來說,就是將資串分割->針對每個子字串刪除空白。

另外針對index,我們就單純用df.index = df['代號']來設定,並用df.drop將原本的 column刪除,
其實知道pandas有df.set_index()這個函式,但是發現存檔怪怪的,所以改用途法煉鋼(第2、3行)

這樣差不多就完成了:

index

那要如何把檔案存起來呢?

我們可以利用save file

df.to_csv('test.csv')
pd.read_csv('test.csv', index_col='代號').head()

來存檔跟讀檔喔!跑出來會是一模一樣的!

save

今天的簡易教學就到這邊!可以下載下來玩玩看喔!

FinLab - 韓承佑

嗨大家好,我是韓承佑,FinLab創辦人,畢業於巴黎薩克雷大學資工博士,目前擔任臺灣量化交易協會 學術顧問、台北商業大學 創新育成中心 創業技術顧問與上市科技公司 量化交易顧問。當初,我喜歡寫程式、無意間因為軟體比賽接觸Fintech,從此開始了財經跟程式的學習之路。我們成立 FinLab 量化投資部落格,用自己研發的軟體,對台灣股市做大量快速的實驗。希望可以在量化投資的路上,當大家的「武器製造商」!