羊群指標應用

Photo by Stephen Dawson on Unsplash

 

本文重點概要

文章難度:★★☆☆☆

利用融資融券買賣張數以及成交量和當沖量建構羊群指標
閱讀建議:本文會運用到一些進階的資料視覺化應用以及統計回歸模型,需要對資料視覺化和回歸模型有一定的認識。

前言

行為財務學的出現挑戰了傳統投資學認為人在做投資決策是理性的,而羊群效應則是代表了,投資人在市場中存在的從眾行為,散戶會看到大家往那邊去,就盲目的跟從,且一般認為散戶在市場中是賠錢的那群人,而如何定義市場中的散戶,通常會使用融資融券和當沖量來表示,因為法人較少使用槓桿的方式和當沖來做交易,而本文使用了這幾個數字組成的新指標來代表散戶的從眾行為,並用簡單的回歸模型,來確認散戶是否真的是所謂的”反指標”。

編輯環境及模組需求

本文使用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的相關方案,用高品質的資料庫,建構出適合自己的交易策略。

完整程式碼

延伸閱讀

相關連結

返回總覽頁