Python爬蟲|繪製台指大盤及選擇權結算價

MinKuan
6 min readFeb 10, 2022

--

前言

使用pandasrequests爬取台灣證交所及期交所的台指大盤資料跟選擇權結算價,因選擇權的結算時間原則上為週三13:30,與大盤收盤時間相同,故將用plotly繪製選擇權和台指價格線圖,比較兩者關係。完整程式碼在最下方。

環境設定及使用套的函示庫

'''
Anaconda的jupyter(6.0.3)
'''
import pandas as pd
import requests
import time
import random
import plotly.graph_objects as go #繪圖用
import plotly.io as pio #儲存圖片用

開始工作

步驟1:爬取選擇權結算價

#選擇權結算價網站
url = ‘https://www.taifex.com.tw/cht/5/optIndxFSP'
#需要的期間資料
data = {‘start_year’:’2021',
‘start_month’:’12',
‘end_year’:’2021',
‘end_month’:’12'}
#開始爬蟲
content = requests.post(url, data = data).text
#將爬蟲資料資料處理成DataFrame
df_option = pd.read_html(content)[3]
#保留需要的資料
df_option = df_option.iloc[:, :3]
#欄位重新命名
df_option.columns = [‘date’, ‘contract’, ‘TXO’]
#依照’data’排序
df_option.sort_values(by=’date’, inplace=True)
df_option.head()
選擇權結算價

步驟2:爬取台指大盤報價價

#選擇權結算價網站
url = ‘https://www.twse.com.tw/indicesReport/MI_5MINS_HIST?response=html&date=20211201'
#將爬蟲資料資料處理成DataFrame
df_index = pd.read_html(url)[0]
#欄位修改
df_index.columns = df_index.columns.get_level_values(1)
#欄位重新命名
df_index.columns = [‘date’, ‘open’, ‘Thigh’, ‘low’, ‘close’]
df_index.head()
台指大盤報價

由爬蟲下來的資料發現日期的年份都寫著"民國"年份,但希望可以用"西元年"表示。

#將年月日分割
df_date = df_index[‘date’].str.split(‘/’, expand=True)
#民國年及西元年差距1911年
df_date[0] = df_date[0].astype(int) + 1911
#將[0]轉為str
df_date[0] = df_date[0].astype(str)
#合併年月日
df_index['date'] = df_date[0] + '/' + df_date[1] + '/' +df_date[2]
更改成西元年後台指大盤報價

步驟3:選擇權與台指大盤資料合併

#將選擇權報價與大盤資料合併
df_result = pd.merge(df_option, df_index, on=’date’, how=’left’)
df_result[‘date’] = pd.to_datetime(df_result[‘date’])df_result.head()
合併台指及選擇權資料

步驟4:繪製選擇權與台指大盤資料

github連結無法顯示出由plotly所繪製的圖片,但其實plotly不同於Matplotlib之處在於可互動,例如放大縮小、調整視窗。

#繪製選擇權結算與大盤收盤圖import plotly.graph_objects as go#建立圖片
fig = go.Figure()
#選擇權資料
fig.add_trace(go.Scatter(x=df_result[‘date’], y=df_result[‘TXO’],
mode=’lines+markers’,
name=’option expiry price’))
#台指資料
fig.add_trace(go.Scatter(x=df_result[‘date’], y=df_result[‘close’],
mode=’lines+markers’,
name=’index close price’))
#標頭和座標名稱
fig.update_layout(title=’Taiwanese Option & Index’,
xaxis_title=’date’,
yaxis_title=’price’)
fig.show()
台指及選擇權資料

在儲存不像Matplotlib 可以直接儲存,需要先安裝與調整環境,請參閱Plotly — Exporting to Static Images

'''
#前置作業
conda install -c plotly plotly-orca psutil
npm install -g electron@1.8.4 orca
pip install psutil
'''
#儲存圖片import plotly.io as piopio.write_image(fig, “Taiwanese Option & Index.png”)

完整程式碼

完整程式碼中的最終成果

from 2021–01 to 2021–12

小結

首次使用plotly繪圖,試試看不同函示庫提供的服務內容和差異,發現在美感上plotly有著較好的質感,但這只是主觀意識,還是要根據不同的數據提供適當的視覺化才是最重要的。

參考資料

Line Charts in Python

Plotly — Exporting to Static Images

--

--

MinKuan
MinKuan

No responses yet