第一部份:取得台股日線資料
我們這邊介紹二個方式取得台股的日線資料,一個是到台灣證券交易所抓取資料,我們也可以利用已經寫好的套件庫去抓取。
臺灣證券交易所
我們抓取交易資訊->盤後資訊->每日收盤行情->全部(不含權證、牛熊證)的左邊的下載csv,我們會利用requests與pandas取得下面的每日收盤行情。
import requests
import pandas as pd
import io
import re
import time
import datetime
def crawler(date_time):
page_url = 'http://www.twse.com.tw/exchangeReport/MI_INDEX?response=csv&date=' + date_time +'&type=ALLBUT0999'
page = requests.get(page_url)
use_text = page.text.splitlines()
for i,text in enumerate(use_text):
if text == '"證券代號","證券名稱","成交股數","成交筆數","成交金額","開盤價","最高價","最低價","收盤價","漲跌(+/-)","漲跌價差","最後揭示買價","最後揭示買量","最後揭示賣價","最後揭示賣量","本益比",':
initial_point = i
break
test_df = pd.read_csv(io.StringIO(''.join([text[:-1] + '\n' for text in use_text[initial_point:]])))
test_df['證券代號'] = test_df['證券代號'].apply(lambda x:x.replace('"',''))
test_df['證券代號'] = test_df['證券代號'].apply(lambda x: x.replace('=',''))
return test_df
在這邊,我們先載入套件庫,如果觀察下載csv檔的連結的話,可以發現date=後面就是我們要查詢的日期而type=是決定要查詢的種類,在我們的例子是查詢全不但不含權證。
接下來利用requests去取得資料,我們這邊想用pandas_read_csv去讀取這個指令,但是read_csv方法只認得像檔案的物件,不然它就會把這個字串當作檔案路徑來處理,所以我們必須引入io這個套件,將字串轉成像檔案的格式,這樣pandas就任得出來魯。
然後讀csv檔案的規則如下,csv檔案欄與欄之間隔開,而列與列之間是用換行隔開,例如pandas_read_csv(io.StringIO(‘1,2,3 \n 2,3,4’)便會回傳一個標頭為1,2,3,值為2,4,5的1乘3的DataFrame。所以我們的目標便是把讀到的文字檔轉為這樣的形式。
所以在下面我們進行了整理,我們先將大字串整理成用行來分的列表,page.text.splitlines()這一步便把我們抓到的文字檔分成一行行,而且每一行會存在列表中的每一格,然後我們把一個迴圈取得我們要開始抓取的第一行,取得第一行後(initital_point),我們便把每一個從initial_point開始的列表裡的元素換行(加上\n這個字串)並合成一個大字串。然後我們就能用pandas去讀它魯!
如果我們想要抓好幾天的話
#抓好幾天
def trans_date(date_time):
return ''.join(str(date_time).split(' ')[0].split('-'))
def parse_n_days(start_date,n):
df_dict = {}
now_date = start_date
for i in range(n):
time.sleep(5)
now_date = now_date - datetime.timedelta(days=1)
try:
df = crawler(trans_date(now_date))
print("Current date" + trans_date(now_date))
df_dict.update({trans_date(now_date):df})
print('Successful!!')
except:
print('Fails at' + str(now_date))
return df_dict
因為我們要丟進去網址的日期格式是201906011這樣的格式,但如果要抓好幾天的話,我們可能要做時間的計算,所以要轉成datetime格式才好進行時間個是的轉換,所以我們先寫了一個可以把datetime格式轉成我們需要丟進去網址的字串格式的函數trans_date,然後下面抓好幾天的函數,我們主要是選開始時間(datetime格式)與要抓幾天,然後因為假日的話會沒資料,程式會報錯,所以我們用try except來控制我們的流程,在加上太頻繁抓的話,怕網站會檔,所以我們加上time.sleep(5)來讓程式停一下。
twstock套件
在這邊我們主要照套件庫的文檔說明,講了一個簡單的例子,我們利用以下的程式碼並可以簡單的抓到台積電的31日資料,並存成一個字典形式。
from twstock import Stock
stock = Stock('2330')
stock_price = stock.fetch_31()
第二部份:練習用的高頻資料
在這邊,FXCM提供了一個python的套件接口以及模擬帳戶,我們用以下連結開始模擬帳戶,然後在trading station登入後,點右上角的帳戶人頭,下面有一個令牌管理的連結,點進去之後就可以開始api令牌了。
- Step1:開啟免費模擬帳戶
- Step2:創造 API Token
- Step3:連結的方式,我們可以下以下的方式連結模擬帳戶fxcmpy.fxcmpy(access_token=API_key, server=’demo’)這邊的API_token就是您在trading station看到的api token.
import fxcmpy
api = fxcmpy.fxcmpy(access_token=API_key, server='demo')
from fxcmpy import fxcmpy_tick_data_reader as tdr
print(tdr.get_available_symbols())
start = datetime.datetime(2018, 2, 1)
end = datetime.datetime(2018, 2, 15)
dr = tdr('EURUSD', start, end)
dr.get_data().head()
最後我們介紹用這個套件庫抓歷史資料,我們可以用裡面的xcmpy_tick_data_reader取得歷史資料,這邊我們用EURUSD為例子抓取。