Python 实现 BRAR 指标计算(情绪指标):股票技术分析的利器系列(11)
- 介绍
- 算法公式
- 代码
- rolling函数介绍
- 核心代码
- 计算BR
- 计算AR
- 完整代码
介绍
BRAR 是一种情绪指标,用于衡量特定金融市场中的买卖情绪。它代表着买入意愿相对于卖出意愿的比率。
先看看官方介绍:
BRAR (情绪指标)
用法
1.BR>400,暗示行情过热,应反向卖出;BR<40 ,行情将起死回生,应买进;
2.AR>180,能量耗尽,应卖出;AR<40 ,能量已累积爆发力,应买进;
3.BR 由300 以上的高点下跌至50以下的水平,低于AR 时,为绝佳买点;
4.BR、AR、CR、VR 四者合为一组指标群,须综合搭配使用。
算法公式
BR:SUM(MAX(0,HIGH-REF(CLOSE,1)),N)/SUM(MAX(0,REF(CLOSE,1)-LOW),N)*100;
AR:SUM(HIGH-OPEN,N)/SUM(OPEN-LOW,N)*100;
代码
rolling函数介绍
rolling
函数通常与其他函数(如 mean
、sum
、std
等)一起使用,以计算滚动统计量,例如滚动均值、滚动总和等。
以下是 rolling
函数的基本语法:
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
window
: 用于计算统计量的窗口大小。min_periods
: 每个窗口最少需要的非空观测值数量。center
: 确定窗口是否居中,默认为False
。win_type
: 窗口类型,例如None
、boxcar
、triang
等,默认为None
。on
: 在数据帧中执行滚动操作的列,默认为None
,表示对整个数据帧执行操作。axis
: 执行滚动操作的轴,默认为0
,表示按列执行操作。closed
: 确定窗口的哪一端是闭合的,默认为None
。
核心代码
计算BR
BR 是一种技术指标,代表着“买卖气指标”(Buy/Sell Pressure)。BR指标通常用于股票市场的技术分析,旨在衡量买卖双方的力量对价格变动的影响。BR指标的计算涉及到最高价、最低价和收盘价的变动,以及特定周期内的累积运算。
def BR(df, n):high_ref_close = df['HIGH'] - df['CLOSE'].shift(1)high_ref_close = high_ref_close.where(high_ref_close > 0, 0) # MAX(0, HIGH - REF(CLOSE, 1))sum_high_ref_close = high_ref_close.rolling(window=n, min_periods=1).sum()ref_close_low = df['CLOSE'].shift(1) - df['LOW']ref_close_low = ref_close_low.where(ref_close_low > 0, 0) # MAX(0, REF(CLOSE, 1) - LOW)sum_ref_close_low = ref_close_low.rolling(window=n, min_periods=1).sum()br = sum_high_ref_close / sum_ref_close_low * 100return br
-
high_ref_close = df['HIGH'] - df['CLOSE'].shift(1)
- 这一行计算了当日最高价与前一日收盘价之间的差值。
df['CLOSE'].shift(1)
表示将收盘价向上平移一行(即前一天的收盘价),然后用当日的最高价减去这个平移后的收盘价,得到的就是当日最高价与前一日收盘价之间的差值。
- 这一行计算了当日最高价与前一日收盘价之间的差值。
-
high_ref_close = high_ref_close.where(high_ref_close > 0, 0) # MAX(0, HIGH - REF(CLOSE, 1))
- 这一行使用
where
方法将high_ref_close
中小于等于0的值替换为0。这一步相当于实现了MAX(0, HIGH - REF(CLOSE, 1))
这个函数,即取HIGH - REF(CLOSE, 1)
与 0 中的较大值。
- 这一行使用
-
sum_high_ref_close = high_ref_close.rolling(window=n, min_periods=1).sum()
- 这一行计算了
high_ref_close
在指定窗口大小n
内的滚动求和。这一步是计算了 BR 公式中分子部分的累加和。
- 这一行计算了
-
ref_close_low = df['CLOSE'].shift(1) - df['LOW']
- 这一行计算了前一日收盘价与当日最低价之间的差值。同样地,使用
df['CLOSE'].shift(1)
将收盘价向上平移一行,然后用这个平移后的收盘价减去当日的最低价,得到的就是前一日收盘价与当日最低价之间的差值。
- 这一行计算了前一日收盘价与当日最低价之间的差值。同样地,使用
-
ref_close_low = ref_close_low.where(ref_close_low > 0, 0) # MAX(0, REF(CLOSE, 1) - LOW)
- 这一行同样使用
where
方法将小于等于0的值替换为0,实现了MAX(0, REF(CLOSE, 1) - LOW)
这个函数,即取REF(CLOSE, 1) - LOW
与 0 中的较大值。
- 这一行同样使用
-
sum_ref_close_low = ref_close_low.rolling(window=n, min_periods=1).sum()
- 这一行计算了
ref_close_low
在指定窗口大小n
内的滚动求和。这一步是计算了 BR 公式中分母部分的累加和。
- 这一行计算了
-
br = sum_high_ref_close / sum_ref_close_low * 100
- 最后一行将分子部分的累加和除以分母部分的累加和,然后乘以100,得到了 BR 指标的值。
计算AR
AR 是一种技术指标,代表“人气指标”(AR,Attention Rate)。AR指标用于衡量特定时间段内股票市场的人气或关注度,这可以提供对市场情绪的一种衡量。
def AR(df, n):sum_high_open = (df['HIGH'] - df['OPEN']).rolling(window=n, min_periods=1).sum()sum_open_low = (df['OPEN'] - df['LOW']).rolling(window=n, min_periods=1).sum()ar = sum_high_open / sum_open_low * 100return ar
-
sum_high_open = (df['HIGH'] - df['OPEN']).rolling(window=n, min_periods=1).sum()
- 这一行计算了当日最高价与开盘价之间的差值的累加和。
(df['HIGH'] - df['OPEN'])
计算了每日最高价与开盘价之间的差值,然后.rolling(window=n, min_periods=1)
将这个差值序列进行滚动求和,窗口大小为n
,min_periods=1
表示至少要有一个有效值才进行计算。
- 这一行计算了当日最高价与开盘价之间的差值的累加和。
-
sum_open_low = (df['OPEN'] - df['LOW']).rolling(window=n, min_periods=1).sum()
- 这一行计算了开盘价与当日最低价之间的差值的累加和,方式与上一行类似。
-
ar = sum_high_open / sum_open_low * 100
- 最后一行将当日最高价与开盘价之间的差值的累加和除以开盘价与当日最低价之间的差值的累加和,然后乘以100,得到了 AR 指标的值。
完整代码
import pandas as pdimport a_get_datadef BR(df, n):high_ref_close = df['HIGH'] - df['CLOSE'].shift(1)high_ref_close = high_ref_close.where(high_ref_close > 0, 0) # MAX(0, HIGH - REF(CLOSE, 1))sum_high_ref_close = high_ref_close.rolling(window=n, min_periods=1).sum()ref_close_low = df['CLOSE'].shift(1) - df['LOW']ref_close_low = ref_close_low.where(ref_close_low > 0, 0) # MAX(0, REF(CLOSE, 1) - LOW)sum_ref_close_low = ref_close_low.rolling(window=n, min_periods=1).sum()br = sum_high_ref_close / sum_ref_close_low * 100return brdef AR(df, n):sum_high_open = (df['HIGH'] - df['OPEN']).rolling(window=n, min_periods=1).sum()sum_open_low = (df['OPEN'] - df['LOW']).rolling(window=n, min_periods=1).sum()ar = sum_high_open / sum_open_low * 100return ardata = {'CLOSE': 填每日收盘的数据,'HIGH': 填每日最高的数据,'LOW': 填每日最低的数据'OPEN': 填每日开盘的数据
}df = pd.DataFrame(data)# 计算BR和AR指标
n = 26 # N的值
df['BR'] = BR(df, n)
df['AR'] = AR(df, n)print(df)