【手把手教你】Python量化股票市場情緒指標ARBR

股票投資,難免有些地方需要靠運氣,但長期而言,好運、倒霉會相抵,想要持續的成功,必須靠技能和運用良好的原則。——菲利普·費舍

01 前 言

是什麼影響著每天股價的變動?是什麼決定指數在多少點位?為什麼當股票價格穩定在某個區域的時候,會突然發生逆轉?《非理性繁榮》作者希勒認為,股票市場的價格並不完全由基本面決定,股票市場的大幅上漲與公眾的過度樂觀存在顯著的相關性。市場的極端行情更多地應該歸結為交易者心理的自然反饋與糾正過程,而不是某些完全從外部作用於市場的事件。大部分交易者在市場處於頂部時表現最樂觀,而在市場處於底部時最悲觀

關於牛熊的回憶見之前推文:【Python金融量化】A股沉浮啟示錄。投資者情緒(Investor Sentiment),是行為金融學解釋市場異象的主要理論基礎之一。投資者情緒可簡單理解為投資者對金融資產的一種樂觀和悲觀的看法或是投機傾向。對投資者情緒的刻畫主要有兩類指標:一是直接調查投資者的情緒,包括問卷調查,多空調查等主觀因素指標;二是採用市場交易數據進行統計處理,即客觀或間接指標。目前國內對市場情緒的量化也主要採用第二種方法,如中信證券對五類市場指標進行主成分分析來構建投資者情緒,具體包括:(1)市場整體類指標:整體市盈率、市凈率、換手率;(2)市場結構類指標:上漲家數比下跌家數、小盤股相對大盤股的超額收益率等;(3)IPO系列指標:股票首發上市家數、新股上市首日漲幅;(4)封閉式基金折價率;(5)資金流動指標:A股賬戶凈增加數。

投資者情緒的刻畫指標多種多樣,各有優劣,本文主要以技術分析常用的情緒指標ARBR為例,使用Python進行計算和可視化分析,為量化擇時策略奠定基礎。

02 情緒指標 ARBR

情緒指標,簡稱 ARBR 或 BRAR,由人氣指標(AR)意願指標(BR)構成。 AR 和 BR 都是對通過對歷史股價走勢的分析,反映市場當前情況下多空雙方的力量強弱對比,推斷市場交易情緒,從而對趨勢的形成與反轉作出預判。

AR刻畫的是市場交易人氣,人氣越旺,股價越高,而股價攀升帶來的賺錢效應又會不斷帶動人氣上升,但是物極必反。當AR值升高至一定限度時,代表能量已經消耗殆盡,缺乏推升力道的股價,出現反轉概率增大。BR反映的是市場交易意願,以「反市場心理」為基礎,當市場人氣狂熱時賣出,人氣悲觀時買進

03 BRAR 指標計算

AR指標是通過比較某個周期內開盤價與最高、最低價,來反映市場買賣人氣。計算公式為:N日AR=(N日內(H-O)之和)/(N日內(O-L)之和)*100

BR指標是通過比較一段周期內收盤價在該周期價格波動中的地位,來反映市場買賣意願程度。計算公式為:N日BR=(N日內(H-YC)之和)/N日內(YC-L)之和)*100

其中,O 為當日開盤價,H 為當日最高價,L 為當日最低價,YC 為前一交易日的收盤價,N 為設定的時間參數,一般原始參數日設定為 26 日,計算周期可以根據自己的經驗或回測結果進行修正。

04 應用法則

雙方的分界線是 100,100 以上是多方優勢,100 以下是空方優勢。

買入信號:

BR通常運行在AR上方,一旦BR跌破AR並在AR之下運行時,表明市場開始築底,視為買進信號;BR<40,AR<60: 空方力量較強,但隨時可能反轉上漲,考慮買進。

賣出信號:

BR>400,AR>180,多方力量極強,但隨時可能反轉下跌,考慮賣出;BR快速上升,AR並未上升而是小幅下降或橫盤,視為賣出信號。

背離信號:

AR、BR指標的曲線走勢與股價K線圖上的走勢正好相反。

頂背離:

當股價K線圖上的股票走勢一峰比一峰高,股價一直向上漲,而AR、BR指標圖上的走勢卻一峰比一峰低,說明出現頂背離,股價短期內將高位反轉,是比較強烈的賣出信號。

底背離:

當股價K線圖上的股票走勢一底比一底低,股價一直向下跌,而AR、BR指標圖上的走勢卻一底比一底高,說明出現底背離,股價短期內將低位反轉,是比較強烈的買入信號。

BRAR指標的訊號不如其他指標明確,許多關鍵點必須靠個人的領悟及自由心證,並且不同交易市場,BRAR高低檔數據皆不盡相同。

05 Python代碼實現

下面主要給出上證綜指、創業板指、滬深300和東方通信的價格及其ARBR指標250日曲線走勢。對於這些圖的分析留待大家結合上述應用法則作進一步分析。其中,近期指數的ARBR指標與價格走勢的背離值得大家關注。

#先引入後面可能用到的包(package)
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import tushare as ts
import talib as ta
%matplotlib inline

#正常顯示畫圖時出現的中文和負號
from pylab import mpl
mpl.rcParams[font.sans-serif]=[SimHei]
mpl.rcParams[axes.unicode_minus]=False

#引入TA-Lib庫
import talib as ta

#設置token
token=輸入你的token
pro=ts.pro_api(token)

index={上證綜指: 000001.SH,深證成指: 399001.SZ,
滬深300: 000300.SH,創業板指: 399006.SZ,
上證50: 000016.SH,中證500: 000905.SH,
中小板指: 399005.SZ,上證180: 000010.SH}

#獲取當前交易的股票代碼和名稱
def get_code():
df = pro.stock_basic(exchange=, list_status=L)
codes=df.ts_code.values
names=df.name.values
stock=dict(zip(names,codes))
stocks=dict(stock,**index)
return stocks

#默認設定時間周期為當前時間往前推120個交易日
#日期可以根據需要自己改動
def get_data(code,n=120):
from datetime import datetime,timedelta
t=datetime.now()
t0=t-timedelta(n)
start=t0.strftime(%Y%m%d)
end=t.strftime(%Y%m%d)
#如果代碼在字典index里,則取的是指數數據
if code in index.values():
df=pro.index_daily(ts_code=code,start_date=start, end_date=end)
#否則取的是個股數據
else:
df=pro.daily(ts_code=code, start_date=start, end_date=end)
#將交易日期設置為索引值
df.index=pd.to_datetime(df.trade_date)
df=df.sort_index()
#計算收益率
return df

#計算AR、BR指標
def arbr(stock,n=120):
code=get_code()[stock]
df=get_data(code,n)[[open,high,low,close]]
df[HO]=df.high-df.open
df[OL]=df.open-df.low
df[HCY]=df.high-df.close.shift(1)
df[CYL]=df.close.shift(1)-df.low
#計算AR、BR指標
df[AR]=ta.SUM(df.HO, timeperiod=26)/ta.SUM(df.OL, timeperiod=26)*100
df[BR]=ta.SUM(df.HCY, timeperiod=26)/ta.SUM(df.CYL, timeperiod=26)*100
return df[[close,AR,BR]].dropna()

#對價格和ARBR進行可視化
def plot_arbr(stock,n=120):
df=arbr(stock,n)
df[close].plot(color=r,figsize=(14,5))
plt.xlabel()
plt.title(stock+價格走勢,fontsize=15)
df[[AR,BR]].plot(figsize=(14,5))
plt.xlabel()
plt.show()

plot_arbr(上證綜指)

plot_arbr(上證綜指,n=250)

plot_arbr(創業板指,n=250)

plot_arbr(滬深300,n=250)

plot_arbr(東方通信,n=250)

06 結 語

股票市場上,隨著多空雙方的較量,股價會向上或向下偏離這一平衡價位區,股價偏離得越大,說明力量越大,偏離得越小,說明力量越小。因此。利用股票各種價格之間的關係,找到這個平衡價位區,對研判多空力量的變化起著重要的作用。而ARBR指標就是根據股票的開盤價、收盤價、最高價和最低價之間的關係來分析多空力量的對比,預測股價的未來走勢。ARBR指標計算簡單,容易理解,但是使用起來並非容易,需要深厚的實盤交易經驗才能作出準確判斷。另外,ARBR指標也存在一定的局限性,如只利用了歷史價格信息,而忽略了成交量的重要性。

推薦閱讀:

TAG:股票市場 | Python | 量化交易 |