使用Python與富果API下載台股歷史資料

在之前的文章中,我曾經提過,如何透過證券交易所的開放資料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'])