在之前的文章中,我曾經提過,如何透過證券交易所的開放資料API,以及Yahoo Finance下載股市資料。雖然這兩個方式都可以免費取得資料,但也各有缺點。首先,證交所的開放資料只提供最新的交易資料,沒有歷史資料,代表使用者必須每天自行備份;而Yahoo Finance雖然可以下載歷史資料,但不時會看到有網友說Yahoo API不能正常使用。
最近我在瀏覽富果Fugle的技術文件時,赫然發現富果竟然也提供了歷史資料,而且不需開戶也可以使用。親自使用Python測試之後,真心覺得不論在便利性與穩定性上都海放對手。我之前曾經介紹過富果Fugle的開戶常見問題,這就就不多提。
如果你對富果帳戶有興趣,可以使用我的推薦碼 f-8e635c3
開戶成功後,你我都可以獲得108富果幣。1枚富果幣等同於1元新台幣,可以兌換現金,也可以用來解鎖研究功能,也就是富果App中各式各樣的卡片。
# 讀取套件
import requests
import pandas as pd
import datetime
def get_symbols():
'''
取得股票代號
'''
symbol_link = 'https://www.twse.com.tw/exchangeReport/STOCK_DAY_ALL?response=open_data'
symbols = pd.read_csv(symbol_link)
return symbols
def gen_calendar():
'''
產生日期表
'''
this_year = datetime.datetime.now()
years = range(2010, this_year.year + 1) # Fugle提供的資料從2010年
begin = [int(str(y) + '0101') for y in years]
end = [int(str(y) + '1231') for y in years]
calendar = pd.DataFrame({'begin': begin,
'end': end})
calendar['begin'] = pd.to_datetime(calendar['begin'], format='%Y%m%d')
calendar['end'] = pd.to_datetime(calendar['end'], format='%Y%m%d')
calendar[['begin', 'end']] = calendar[['begin', 'end']].astype('str')
return calendar
def get_hist_data(symbols=[]):
'''
透過富果Fugle API抓取歷史資料
'''
if len(symbols) == 0:
symbols = get_symbols()
calendar = gen_calendar()
result = pd.DataFrame()
for i in range(len(symbols)):
cur_symbol = symbols[i]
symbol_result = pd.DataFrame()
for j in range(len(calendar)):
cur_begin = calendar.loc[j, 'begin']
cur_end = calendar.loc[j, 'end']
# 透過富果Fugle API抓取歷史資料
data_link = f'https://api.fugle.tw/marketdata/v0.3/candles?symbolId=2884&apiToken=demo&from={cur_begin}&to={cur_end}&fields=open,high,low,close,volume,turnover,change'
resp = requests.get(url=data_link)
data = resp.json()
candles = data['candles']
new_result = pd.DataFrame.from_dict(candles)
symbol_result = pd.concat([symbol_result, new_result])
symbol_result['symbol'] = cur_symbol
result = pd.concat([result, symbol_result])
return result
# 全部股票歷史資料
data = get_hist_data()
# 單一個股歷史資料 - 2330台積電
data = get_hist_data(symbols=['2330'])