【量化分析】台電產業動態指數之應用 ( 股價篇 )

Photo by NASA on Unsplash

本文關鍵字:量化分析、XGboost、產業動態指數

本文重點概要

前言

編輯環境及模組需求

import pandas as pd
import numpy as np
import tejapi
import matplotlib.pyplot as plt
import matplotlib.transforms as transforms
import statsmodels.api as sm
import xgboost as xgb
from sklearn import preprocessing
from matplotlib.font_manager import FontProperties
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] # 解決 plot中文問題
plt.rcParams['axes.unicode_minus'] = False
tejapi.ApiConfig.api_key = "Your Key"
tejapi.ApiConfig.ignoretz = True

資料庫使用

資料導入

taipower = tejapi.get('GLOBAL/WTPC',  #從TEJ api撈取所需要的資料
chinese_column_name = True,
paginate = True)
df = tejapi.get('TWN/EWIPRCD', #從TEJ api撈取所需要的資料
chinese_column_name = True,
paginate = True,
mdate = {'gt':'2019-12-31'},
idx_id = 'IR0032',
opts={'columns':['idx_id','mdate','close_d']})
_2327 = tejapi.get('TWN/APRCD1', #從TEJ api撈取所需要的資料
chinese_column_name = True,
paginate = True,
mdate = {'gt':'2019-12-31'},
coid = '2327',
opts={'columns':['coid','mdate','close_adj']})
taipower1 = taipower[taipower['產業名稱'] =='電子零組件']
taipower1.set_index('日期', inplace=True)
df2 = taipower1[['收盤']].merge(df[['日期', '指數收盤價']], on='日期')
df2.set_index(df2['日期'], inplace=True)
df2.drop(columns={'日期'}, inplace=True)
df2.rename(columns={'收盤':'動態指數', "指數收盤價":'收盤價'}, inplace=True)
df2
fig, ax1= plt.subplots(figsize =(20,16))
plt.plot(df2.index , df2['動態指數'],lw=1.5, label = '產業動態指標')
plt.xlabel('日期',fontsize=15)
plt.ylabel('點數', fontsize=15)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.title('電子零組件產業指標與電零業報酬指數', fontsize=20)
plt.legend(loc=1, fontsize=15)
ax2 = ax1.twinx() #跟第一張ax1的x軸一樣
plt.plot(df2.index, df2['收盤價'] , lw=1.5, color='r', label='指數收盤價')
plt.ylabel('股價', fontsize=15)
plt.yticks(fontsize=15)
plt.legend(loc=2, fontsize=15)
plt.gcf().autofmt_xdate() #讓x軸的時間軸比較寬鬆、漂亮
plt.show()
fig, ax1= plt.subplots(figsize =(20,16))
plt.plot(df2.index , df2['動態指數'],lw=1.5, label = '產業動態指標')
plt.xlabel('日期',fontsize=15)
plt.ylabel('點數', fontsize=15)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.title('電子零組件產業指標與電零業報酬指數', fontsize=20)
plt.legend(loc=1, fontsize=15)
ax2 = ax1.twinx() #跟第一張ax1的x軸一樣
plt.plot(df2.index, df2['平移'] , lw=1.5, color='r', label='指數收盤價')
plt.ylabel('股價', fontsize=15)
plt.yticks(fontsize=15)
plt.legend(loc=2, fontsize=15)
plt.gcf().autofmt_xdate() #讓x軸的時間軸比較寬鬆、漂亮
plt.show()
df2['stand_X'] = preprocessing.scale(df2['動態指數'])
df2['stand_y'] = preprocessing.scale(df2['平移'])
df2.dropna(inplace=True)
X = df2[['stand_X']]
y = df2[['stand_y']]
X_train, X_test = X.loc[:"2021-12-31"], X.loc["2021-12-31":]
y_train, y_test = y.loc[:"2021-12-31"], y.loc["2021-12-31":]
model = XGBRegressor(n_estimators=250)
model.fit(X_train, y_train, verbose=True)
y_pred_train = model.predict(X_train)
fig, ax1= plt.subplots(figsize =(18,14))
plt.plot(y_train.index ,y_pred_train ,lw=1.5, label = '預測資料')
plt.plot(y_train.index, y_train , lw=1.5, color='r', label='實際資料')
plt.xlabel('date', fontsize=15)
plt.ylabel('Stock Price',fontsize=15)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.legend(loc='best', fontsize=15)
plt.title('樣本內預測結果',fontsize=20)
plt.gcf().autofmt_xdate() #讓x軸的時間軸比較寬鬆、漂亮
plt.show()
y_pred_test = model.predict(X_test)
cycle, trend = sm.tsa.filters.hpfilter(y_pred_test, 1) #將資料分成趨勢跟循環
fig, ax1= plt.subplots(figsize =(18,14))
plt.plot(y_test.index ,trend ,lw=1.5, label = '預測資料')
plt.plot(y_test.index, y_test , lw=1.5, color='r', label='實際資料')
plt.xlabel('日期', fontsize = 15)
plt.ylabel('點數', fontsize = 15)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.title('樣本外預測結果', fontsize = 20)
plt.legend(loc=1, fontsize=15)
plt.gcf().autofmt_xdate() #讓x軸的時間軸比較寬鬆、漂亮
plt.show()
_2327a = _2327.rename(columns = {'年月日':'日期', '收盤價(元)':'國巨'})
df2327 = taipower1[['收盤']].merge(_2327a[['日期','國巨']], on='日期')
df2327.set_index(df2327['日期'],inplace=True)
df2327.drop(columns={'日期'}, inplace=True)
df2327.rename(columns={"收盤":'動態指數'}, inplace=True)
fig, ax1= plt.subplots(figsize =(20,16))
plt.plot(df2327.index , df2327['動態指數'],lw=1.5, label = '產業動態指標')
plt.xlabel('日期', fontsize=15)
plt.ylabel('股價', fontsize=15)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.title('電子零組件產業指標與國巨股價', fontsize=20)
plt.legend(loc=1, fontsize=15)
ax2 = ax1.twinx() #跟第一張ax1的x軸一樣
plt.plot(df2327.index, df2327['國巨'] , lw=1.5, color='r', label='國巨')
plt.yticks(fontsize=15)
plt.ylabel('點數',fontsize=15 )
plt.legend(loc=2 , fontsize=15)
plt.gcf().autofmt_xdate() #讓x軸的時間軸比較寬鬆、漂亮
plt.show()
df2327['平移'] = df2327['國巨'].shift(-40)fig, ax1= plt.subplots(figsize =(20,16))
plt.plot(df2327.index , df2327['動態指數'],lw=1.5, label = '產業動態指標')
plt.xlabel('日期', fontsize=15)
plt.ylabel('股價', fontsize=15)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.title('電子零組件產業指標與國巨股價', fontsize=20)
plt.legend(loc=1, fontsize=15)
ax2 = ax1.twinx() #跟第一張ax1的x軸一樣
plt.plot(df2327.index, df2327['平移'] , lw=1.5, color='r', label='國巨')
plt.yticks(fontsize=15)
plt.ylabel('點數',fontsize=15 )
plt.legend(loc=2 , fontsize=15)
plt.gcf().autofmt_xdate() #讓x軸的時間軸比較寬鬆、漂亮
plt.show()
df2327['stand_X'] = preprocessing.scale(df2327['動態指數'])
df2327['stand_y'] = preprocessing.scale(df2327['平移'])
df2327.dropna(inplace=True)
X2327 = df2327[['stand_X']]
y2327 = df2327[['stand_y']]
X2_train, X2_test = X2327.loc[:"2021-12-31"], X2327.loc["2021-12-31":]
y2_train, y2_test = y2327.loc[:"2021-12-31"], y2327.loc["2021-12-31":]
model = XGBRegressor(n_estimators=250)
model.fit(X2_train, y2_train, verbose=True)
y2_pred_train = model.predict(X2_train)
fig, ax1= plt.subplots(figsize =(18,14))
plt.plot(y2_train.index ,y2_pred_train ,lw=1.5, label = 'predict')
plt.plot(y2_train.index, y2_train , lw=1.5, color='r', label='real')
plt.xlabel('日期', fontsize = 15)
plt.ylabel('股價', fontsize = 15)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.legend(loc='best', fontsize=15)
plt.title('樣本內預測結果',fontsize = 20)
plt.gcf().autofmt_xdate() #讓x軸的時間軸比較寬鬆、漂亮
plt.show()
y2_pred_test = model.predict(X2_test)
cycle, trend = sm.tsa.filters.hpfilter(y2_pred_test, 1) #將cycle跟trend分開
fig, ax1= plt.subplots(figsize =(18,14))
plt.plot(y2_test.index ,trend ,lw=1.5, label = '預測資料')
plt.plot(y2_test.index, y2_test , lw=1.5, color='r', label='實際資料')
plt.xlabel('日期', fontsize = 15)
plt.ylabel('點數', fontsize = 15)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.title('樣本外預測結果', fontsize = 20)
plt.legend(loc='best', fontsize=15)
plt.gcf().autofmt_xdate() #讓x軸的時間軸比較寬鬆、漂亮
plt.show()

結論

完整程式碼

延伸閱讀

相關連結

Unlisted

--

--

TEJ 為台灣本土第一大財經資訊公司,成立於 1990 年,提供金融市場基本分析所需資訊,以及信用風險、法遵科技、資產評價、量化分析及 ESG 等解決方案及顧問服務。鑒於財務金融領域日趨多元與複雜,TEJ 結合實務與學術界的精英人才,致力於開發機器學習、人工智慧 AI 及自然語言處理 NLP 等新技術,持續提供創新服務

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
TEJ 台灣經濟新報

TEJ 台灣經濟新報

907 Followers

TEJ 為台灣本土第一大財經資訊公司,成立於 1990 年,提供金融市場基本分析所需資訊,以及信用風險、法遵科技、資產評價、量化分析及 ESG 等解決方案及顧問服務。鑒於財務金融領域日趨多元與複雜,TEJ 結合實務與學術界的精英人才,致力於開發機器學習、人工智慧 AI 及自然語言處理 NLP 等新技術,持續提供創新服務