Table of Contents
文章難度:★★☆☆☆
利用融資融券買賣張數以及成交量和當沖量建構羊群指標
閱讀建議:本文會運用到一些進階的資料視覺化應用以及統計回歸模型,需要對資料視覺化和回歸模型有一定的認識。
行為財務學的出現挑戰了傳統投資學認為人在做投資決策是理性的,而羊群效應則是代表了,投資人在市場中存在的從眾行為,散戶會看到大家往那邊去,就盲目的跟從,且一般認為散戶在市場中是賠錢的那群人,而如何定義市場中的散戶,通常會使用融資融券和當沖量來表示,因為法人較少使用槓桿的方式和當沖來做交易,而本文使用了這幾個數字組成的新指標來代表散戶的從眾行為,並用簡單的回歸模型,來確認散戶是否真的是所謂的”反指標”。
本文使用Mac OS 並以jupyter作為編輯器
import pandas as pd import numpy as np import tejapi import statsmodels.api as sm import matplotlib.pyplot as plt import matplotlib.transforms as transforms plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] # 解決MAC電腦 plot中文問題 plt.rcParams['axes.unicode_minus'] = False tejapi.ApiConfig.api_key ="Your Key" tejapi.ApiConfig.ignoretz = True
import plotly.express as px import plotly.graph_objects as go from plotly.subplots import make_subplots
調整股價(日)-除權息調整(TWN/APRCD1)
融資融券(TWN/AGIN)
上市(櫃)當日沖銷交易統計資訊(TWN/ADT)
資料期間取2015/01/01到2022/10/13,分別取得了成交量、當沖量、融資買進、融資賣出、融券賣出、融券回補還有大盤指數的資料。
df = tejapi.get('TWN/ADT', #從TEJ api撈取所需要的資料 chinese_column_name = True, paginate = True, mdate = {'gt':'2015-01-01'}, coid='Y9999', opts={'columns':['coid','mdate','volume', "vol_dt"]})
df1 = tejapi.get('TWN/AGIN', #從TEJ api撈取所需要的資料 chinese_column_name = True, paginate = True, mdate = {'gt':'2015-01-01'}, coid='Y9999', opts={'columns':['coid','mdate','buy_l', "sell_l", "buy_s", "sell_s"]})
df2 = tejapi.get('TWN/APRCD1', #從TEJ api撈取所需要的資料 chinese_column_name = True, paginate = True, mdate = {'gt':'2015-01-01'}, coid='Y9999', opts={'columns':['coid','mdate','close_adj']})
將資料設定好index,以利於後續做合併表格的工作,最後表格呈現方式如下圖。
df1.rename(columns={'年月日':'日期'}, inplace=True) df1.set_index(df1['日期'],inplace=True) df1.drop(columns={'日期'},inplace=True)
df.set_index(df['日期'],inplace=True) df.drop(columns={'日期'},inplace=True)
herding = pd.merge(df1, df.iloc[:,1:], left_index=True, right_index=True)
herding
接著利用散戶買進公式:(融資買進+融券回補)/(成交量-當沖量)、散戶賣出公式:(融資賣出+融券賣出)/(成交量-當沖量),將兩個指標計算出來。
herding['buy'] = ((herding['融資買進(張)']+herding['融券買進(張)'])/(herding['成交量(千股)']-herding['現股當沖量(千股)']))*100 herding['sell'] = ((herding['融資賣出(張)']+herding['融券賣出(張)'])/(herding['成交量(千股)']-herding['現股當沖量(千股)']))*100
將大盤收盤價資料重新設定index並跟上面處理好的指標資料表做合併。
df2.rename(columns={'證券代碼':'公司代碼'},inplace=True) df2.rename(columns={'年月日':'日期'},inplace=True) df2.set_index(df2['日期'],inplace=True) df2.drop(columns={'日期'},inplace=True)
result = pd.merge(herding,df2.iloc[:,1:], left_index=True, right_index=True)
result
將指標跟大盤指數繪製在同一張圖上,可以發現由於是日資料的關係,在圖上太密集無法看出趨勢,因此我們改用另一種互動式繪圖方式。
fig, ax1= plt.subplots(figsize =(20,16)) plt.plot(result.index , result['buy'],lw=1.5, label = '散戶買進指標') plt.plot(result.index , result['sell'],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(result.index, result['收盤價(元)'] , 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()
透過plotly套件所做的互動式圖表,可以讓你針對你想觀察的部分做放大,讓我們可以更清楚的看到一段時間的趨勢。
我們放大到疫情最恐慌的時候觀察,在3/19台股創下了近幾年的新低,收盤收在8681點,而散戶賣出指標也創下波段的新高,之後股市開始回穩,並一路向上攀升。
將大盤指數計算成報酬率,並將散戶買進指標跟賣出指標往後移一期,以利於後續運用回歸模型使用。
result[['報酬率']] = (result[['收盤價(元)']].pct_change(1))*100 result[['buy', 'sell']] = result[['buy', 'sell']].shift(1)
簡單看一下相關係數發現,散戶買進指標跟賣出指標都跟大盤報酬率是正相關,跟原先預期的有點落差,而賣出指標的相關性大了一些。
result[['buy', 'sell', '報酬率']].corr()
接著做個單迴歸來觀察買進指標跟大盤報酬率,從結果可以看到,買進指標的係數為正且顯著的,可見買進指標是可以預測大盤報酬率。
X = sm.add_constant(result['buy']) b = sm.OLS(result['報酬率'], X).fit() b.summary()
再來看到賣出指標,也跟買進指標一樣,係數為正且顯著的,代表賣出指標同樣具有預測大盤報酬率的能力。
X = sm.add_constant(result['sell']) b = sm.OLS(result['報酬率'], X).fit() b.summary()
我們能從結果看到,我們原先預期散戶是’反指標’,當散戶買進指標上升時,隔天的大盤報酬率會減少,當散戶賣出指標上升時,隔天會增加,但實證結果發現,無論是買進指標或賣出指標,對於大盤報酬率的預測皆是正相關,需要注意的是本文在實證方面使用的是單回歸的方式,讀者如果想做更深入的探討,可以多增加控制變數,採用多元回歸的方式來研究,結果會更加準確。
之後也會介紹使用TEJ資料庫來建構各式指標,並回測指標績效,所以歡迎對各種交易回測有興趣的讀者,選購TEJ E-Shop的相關方案,用高品質的資料庫,建構出適合自己的交易策略。
電子報訂閱