Momentum:BRAR(人气意愿指标)技术指标详解

Momentum:BRAR(人气意愿指标)技术指标详解

一、BRAR的定义

BRAR(又称人气意愿指标、情绪指标) 是由两个独立但紧密关联的技术指标------AR(人气指标)和BR(意愿指标)共同组成的分析工具。该指标源于日本,其设计思想蕴含东方"气"的哲学------"气极则衰,衰极则盛",旨在通过衡量市场买卖双方的力量对比来预测股价的未来走势。

指标的核心构成

组成部分 全称 关注焦点 核心含义
AR 人气指标(Accessibility Ratio) 开盘价 反映市场买卖人气,衡量潜在动能
BR 意愿指标(Willingness Ratio) 前日收盘价 反映市场买卖意愿,衡量情绪温度

设计哲学:AR以开盘价为基点(经过一夜冷静思考后的共识价格),衡量日内向上推升所消耗的能量;BR则以前日收盘价为基准,通过当日价格波动反映市场情绪的狂热程度。

BR与AR的互补关系

  • AR可单独使用:AR能够独立反映市场的人气强弱和潜在动能
  • BR需与AR配合:BR必须与AR并用才能发挥效用,单独使用BR容易产生误判

二、BRAR的计算方法

1. 核心计算公式

AR(人气指标)计算公式

AR的核心逻辑是衡量开盘价在全天价格波动中的位置:

AR=∑i=1N(Hi−Oi)∑i=1N(Oi−Li)×100 \mathrm{AR} = \frac{\sum_{i=1}^N(H_i - O_i)}{\sum_{i=1}^N(O_i - L_i)} \times 100 AR=∑i=1N(Oi−Li)∑i=1N(Hi−Oi)×100

其中:

  • HiH_iHi:第 iii 日的最高价
  • LiL_iLi:第 iii 日的最低价
  • OiO_iOi:第 iii 日的开盘价
  • NNN:计算周期(默认26日)
BR(意愿指标)计算公式

BR的核心逻辑是衡量前日收盘价在当日价格波动中的位置:

BR=∑i=1N(Hi−Ci−1)∑i=1N(Ci−1−Li)×100 \mathrm{BR} = \frac{\sum_{i=1}^N(H_i - C_{i-1})}{\sum_{i=1}^N(C_{i-1} - L_i)} \times 100 BR=∑i=1N(Ci−1−Li)∑i=1N(Hi−Ci−1)×100

其中:

  • HiH_iHi:第 iii 日的最高价
  • LiL_iLi:第 iii 日的最低价
  • Ci−1C_{i−1}Ci−1:前一日的收盘价
  • NNN:计算周期(默认26日)

零值处理:当分子或分母中出现负值时,一律按0处理。

2. pandas_ta中的计算逻辑

根据pandas_ta官方文档,BRAR的具体实现步骤如下:

步骤一:计算AR的中间变量

HO_Diff=H−OOL_Diff=O−L \mathrm{HO\_Diff} = H − O \\ \mathrm{OL\_Diff} = O − L HO_Diff=H−OOL_Diff=O−L

步骤二:计算BR的中间变量(需处理负值归零)

HCY=H−CprevCYL=Cprev−LHCY=max⁡⁡(0,HCY)CYL=max⁡⁡(0,CYL) \begin{aligned} \mathrm{HCY} &= H − C_{prev} \\ \mathrm{CYL} &= C_{prev} − L \\ \mathrm{HCY} &= \max⁡(0, \mathrm{HCY}) \\ \mathrm{CYL} &= \max⁡(0, \mathrm{CYL}) \end{aligned} HCYCYLHCYCYL=H−Cprev=Cprev−L=max⁡(0,HCY)=max⁡(0,CYL)

步骤三:计算AR和BR

AR=100×∑(HO_Diff,N)∑(OL_Diff,N)BR=100×∑(HCY,N)∑(CYL,N) \begin{aligned} \mathrm{AR} &= 100 \times \frac{\sum(\mathrm{HO\_Diff},N)}{\sum(\mathrm{OL\_Diff},N)} \\1.5ex \mathrm{BR} &= 100 \times \frac{\sum(\mathrm{HCY},N)}{\sum(\mathrm{CYL},N)} \end{aligned} ARBR=100×∑(OL_Diff,N)∑(HO_Diff,N)=100×∑(CYL,N)∑(HCY,N)

3. 参数说明

参数 默认值 说明
length 26 计算周期(原始参数,可选13或52)
scalar 100 放大倍数,将结果转换为百分比形式
drift 1 价格变化的步长

三、BRAR的使用方法

1. 数值区间判断------最基础用法

BRAR以100为中心,数值大小反映多空强弱:

AR指标的应用法则

AR数值区间 状态 操作建议
80 - 120 盘整行情 股价不会激烈波动,观望为主
120 - 150 人气活跃 行情活泼,可持股观察
150 - 180 能量消耗中 注意股价可能将进入回档
> 180 能量耗尽 股价已达到顶峰区域,应逢高卖出
60 - 80 人气衰减 能量正在积蓄
40 - 60 人气低迷 能量逐渐累积
< 40 能量已累积 股价已达低点,可考虑介入

BR指标的应用法则

BR数值区间 对应情绪 操作建议
70 - 150 盘整行情 情绪均衡,观望为主
150 - 300 情绪升温 看涨情绪增强,可持股
300 - 400 情绪过热 行情可能过热,需注意回档
> 400 极度狂热 情绪已到顶峰,应反向卖出
50 - 70 情绪悲观 市场开始悲观
40 - 50 情绪低迷 悲观情绪加深
< 40 极度悲观 行情可能起死回生,是买入机会

关键洞察:BR值反映了市场情绪的温度------当BR=600时,相当于86人看好、14人看空。

2. AR与BR的交叉信号------买卖点判断

AR与BR的关系变化是BRAR指标最核心的交易信号:

信号类型 触发条件 含义 操作建议
金叉(买入) AR上穿BR 人气开始超越意愿,多方力量增强 买入信号
死叉(卖出) AR下穿BR 人气弱于意愿,空方力量增强 卖出信号
BR < AR 且 BR < 100 意愿低迷,人气尚可 超卖区域 可考虑逢低买进
BR由高档下降一半时 情绪大幅冷却 股价回档买进机会 成功率高达95%

3. AR与BR的同向/反向信号

同步信号------顶部警示

信号特征 含义 操作
AR和BR同时急速上升 股价已近顶部 持股者应逢高卖出
BR急速上升,AR盘整或小回 情绪狂热但动能不足 应逢高出货

底部信号------买入机会

信号特征 含义 操作
BR从150以上高点跌至50以下,且BR低于AR 情绪极度悲观,能量积蓄完毕 绝佳买点(狙击买点)
BR<AR且AR<50 超跌区域 买进信号

4. 背离信号------趋势反转预警

与其他技术指标一样,BRAR也会与价格形成背离:

背离类型 价格表现 BRAR表现 信号含义
顶背离 价格创出新高 BR/AR未能创出新高 上涨动能衰竭,卖出信号
底背离 价格创出新低 BR/AR未能创出新低 下跌动能减弱,买入信号

5. 多周期配合策略

BRAR默认参数为26日,但可根据需要进行调整:

周期参数 特点 适用场景
13日 更敏感,信号更多 短线操作
26日 标准配置 波段操作
52日 更平滑,信号更可靠 中长线趋势判断

6. 注意事项与局限性

使用BRAR前需了解以下要点

局限性 说明
信号不够明确 BRAR指标的讯号不如其他指标明确,许多关键点依赖个人领悟
BR可能无限延伸 BR超过300后可能持续上升至500、700甚至1000,难以判断情绪顶峰
不能作为短线指标 BRAR是趋势指标,一般有效时间约15天,短线不具备直观参考性
不同市场阈值不同 各个市场的高档低档数据不尽相同,需根据个股历史表现设定
需配合CR使用 当BR超过300持续上升时,应改用CR指标

四、使用pandas_ta计算BRAR(附示例代码)

1. pandas_ta中的BRAR函数

pandas_ta库内置了BRAR指标的完整实现,函数位于momentum模块中。

2. 函数完整参数

python 复制代码
pandas_ta.momentum.brar(open_, high, low, close, length=None, scalar=None, drift=None, offset=None, **kwargs)

参数详解

参数 类型 默认值 说明
open_ pd.Series 必需 开盘价序列(注意下划线后缀)
high pd.Series 必需 最高价序列
low pd.Series 必需 最低价序列
close pd.Series 必需 收盘价序列
length int 26 计算周期
scalar float 100 放大倍数
drift int 1 价格变化的步长
offset int 0 结果偏移周期数

返回值pd.DataFrame,包含两列:ARBR

3. 示例代码

python 复制代码
import pandas as pd
import pandas_ta as ta
import numpy as np
import matplotlib.pyplot as plt

# ========== 第一步:准备数据 ==========
np.random.seed(42)
dates = pd.date_range(start='2024-01-01', end='2024-12-31', freq='D')
n = len(dates)

# 生成带趋势和波动的价格序列
trend = np.linspace(0, 30, n)
cycle = np.sin(np.linspace(0, 6 * np.pi, n)) * 12
noise = np.random.randn(n) * 2
base_price = 100 + trend + cycle + noise

df = pd.DataFrame(index=dates)
df['close'] = base_price
df['open'] = df['close'] + np.random.randn(n) * 1.5
df['high'] = df[['open', 'close']].max(axis=1) + np.abs(np.random.randn(n)) * 2 + 1
df['low'] = df[['open', 'close']].min(axis=1) - np.abs(np.random.randn(n)) * 2 - 1
df['volume'] = np.random.randint(1000000, 10000000, n)

print("=" * 60)
print("数据预览:")
print(df.head())
print("\n" + "=" * 60 + "\n")

# ========== 第二步:计算BRAR(基础用法) ==========
# 使用默认参数 length=26
brar_result = ta.brar(df['open'], df['high'], df['low'], df['close'])

# 将计算结果添加到DataFrame
df['AR'] = brar_result['AR']
df['BR'] = brar_result['BR']

print("BRAR计算结果(最近10行):")
print(df[['close', 'AR', 'BR']].tail(10))
print("\n" + "=" * 60 + "\n")

# ========== 第三步:手动验证BR计算 ==========
# 手动计算验证BR公式的正确性
df['HCY'] = df['high'] - df['close'].shift(1)  # H - 前日收盘
df['CYL'] = df['close'].shift(1) - df['low']   # 前日收盘 - L
df['HCY'] = df['HCY'].clip(lower=0)            # 负数归零
df['CYL'] = df['CYL'].clip(lower=0)            # 负数归零

# 计算26日总和
df['sum_HCY'] = df['HCY'].rolling(window=26).sum()
df['sum_CYL'] = df['CYL'].rolling(window=26).sum()
df['BR_manual'] = 100 * df['sum_HCY'] / df['sum_CYL']

# 验证一致性
diff = (df['BR'] - df['BR_manual']).abs().max()
print(f"pandas_ta与手动计算BR的最大差异:{diff:.10f}")
print("\n" + "=" * 60 + "\n")

# ========== 第四步:自定义参数 ==========
# 使用13周期(短线)
df['AR_13'] = ta.brar(df['open'], df['high'], df['low'], df['close'], length=13)['AR']
df['BR_13'] = ta.brar(df['open'], df['high'], df['low'], df['close'], length=13)['BR']

# 使用52周期(长线)
df['AR_52'] = ta.brar(df['open'], df['high'], df['low'], df['close'], length=52)['AR']
df['BR_52'] = ta.brar(df['open'], df['high'], df['low'], df['close'], length=52)['BR']

print("不同周期AR/BR对比(最近5行):")
print(df[['close', 'AR', 'AR_13', 'AR_52', 'BR', 'BR_13', 'BR_52']].tail())
print("\n" + "=" * 60 + "\n")

# ========== 第五步:生成买卖信号 ==========
# 定义信号条件
AR_OVERBOUGHT = 180
AR_OVERSOLD = 40
BR_OVERBOUGHT = 400
BR_OVERSOLD = 40

# 超买超卖信号
df['ar_signal'] = ''
df.loc[df['AR'] > AR_OVERBOUGHT, 'ar_signal'] = 'AR超买(卖出)'
df.loc[df['AR'] < AR_OVERSOLD, 'ar_signal'] = 'AR超卖(买入)'

df['br_signal'] = ''
df.loc[df['BR'] > BR_OVERBOUGHT, 'br_signal'] = 'BR超买(卖出)'
df.loc[df['BR'] < BR_OVERSOLD, 'br_signal'] = 'BR超卖(买入)'

# 金叉死叉信号
df['cross_above'] = (df['AR'] > df['BR']) & (df['AR'].shift(1) <= df['BR'].shift(1))
df['cross_below'] = (df['AR'] < df['BR']) & (df['AR'].shift(1) >= df['BR'].shift(1))

df['trade_signal'] = ''
df.loc[df['cross_above'], 'trade_signal'] = '金叉(买入信号)'
df.loc[df['cross_below'], 'trade_signal'] = '死叉(卖出信号)'

# BR<AR且BR<100的超卖组合信号
df['oversold_signal'] = (df['BR'] < df['AR']) & (df['BR'] < 100)

print("超买超卖信号统计:")
print(f"AR超买信号数量:{(df['AR'] > AR_OVERBOUGHT).sum()}")
print(f"AR超卖信号数量:{(df['AR'] < AR_OVERSOLD).sum()}")
print(f"BR超买信号数量:{(df['BR'] > BR_OVERBOUGHT).sum()}")
print(f"BR超卖信号数量:{(df['BR'] < BR_OVERSOLD).sum()}")

print("\n金叉死叉信号(最近10个):")
cross_signals = df[df['trade_signal'] != ''].tail(10)
if not cross_signals.empty:
    print(cross_signals[['close', 'AR', 'BR', 'trade_signal']])
else:
    print("近期无金叉死叉信号")

print("\nBR<AR且BR<100的超卖组合信号统计:")
print(f"信号数量:{df['oversold_signal'].sum()}")
print("\n" + "=" * 60 + "\n")

# ========== 第六步:BRAR与价格背离检测(简化版) ==========
# 计算20日价格变化和BR变化
df['price_change_20d'] = df['close'].diff(20)
df['br_change_20d'] = df['BR'].diff(20)

# 检测潜在背离
df['potential_bearish_div'] = (df['price_change_20d'] > 0) & (df['br_change_20d'] < 0)
df['potential_bullish_div'] = (df['price_change_20d'] < 0) & (df['br_change_20d'] > 0)

print("潜在背离信号统计(20日尺度):")
print(f"潜在顶背离(价格涨BR跌)数量:{df['potential_bearish_div'].sum()}")
print(f"潜在底背离(价格跌BR涨)数量:{df['potential_bullish_div'].sum()}")
print("注:完整背离需结合局部高/低点分析,此处为方向对比")
print("\n" + "=" * 60 + "\n")

# ========== 第七步:策略回测(金叉死叉策略) ==========
# 策略:金叉时买入,死叉时卖出
df['position'] = 0
in_position = False

for i in range(1, len(df)):
    if not in_position and df['cross_above'].iloc[i]:
        df.loc[df.index[i], 'position'] = 1
        in_position = True
    elif in_position and df['cross_below'].iloc[i]:
        df.loc[df.index[i], 'position'] = 0
        in_position = False
    else:
        df.loc[df.index[i], 'position'] = df['position'].iloc[i-1]

# 计算收益
df['returns'] = df['close'].pct_change()
df['strategy_returns'] = df['position'].shift(1) * df['returns']

total_return_buyhold = (1 + df['returns']).prod() - 1
total_return_strategy = (1 + df['strategy_returns']).prod() - 1

print("=" * 60)
print("策略绩效统计(BRAR金叉死叉策略回测):")
print(f"买入持有策略总收益率:{total_return_buyhold:.2%}")
print(f"BRAR金叉死叉策略总收益率:{total_return_strategy:.2%}")
print("\n注意:此为简化回测,仅供参考")
print("=" * 60 + "\n")

# ========== 第八步:可视化 ==========
plt.figure(figsize=(14, 12))

# 子图1:价格走势
plt.subplot(2, 1, 1)
plt.plot(df.index[-150:], df['close'][-150:], label='Close Price', 
         linewidth=1.5, color='black')
plt.title('Price Chart (Last 150 days)', fontsize=14)
plt.ylabel('Price')
plt.legend()
plt.grid(True, alpha=0.3)

# 子图2:BRAR指标
plt.subplot(2, 1, 2)
plt.plot(df.index[-150:], df['AR'][-150:], label='AR (人气指标)', 
         linewidth=1.5, color='blue')
plt.plot(df.index[-150:], df['BR'][-150:], label='BR (意愿指标)', 
         linewidth=1.5, color='red')

# 参考水平线
plt.axhline(y=100, color='gray', linestyle='-', linewidth=0.8, alpha=0.7, label='平衡线(100)')
plt.axhline(y=180, color='orange', linestyle='--', linewidth=0.8, label='AR超买线(180)')
plt.axhline(y=40, color='green', linestyle='--', linewidth=0.8, label='AR超卖线(40)')
plt.axhline(y=400, color='darkred', linestyle='--', linewidth=0.8, label='BR超买线(400)')
plt.axhline(y=40, color='darkgreen', linestyle='--', linewidth=0.8)

# 标记金叉死叉
golden_cross = df[df['cross_above']]
death_cross = df[df['cross_below']]

plt.scatter(golden_cross.index[-20:], golden_cross['AR'][-20:], 
            color='green', marker='^', s=80, label='金叉(买入)', alpha=0.8)
plt.scatter(death_cross.index[-20:], death_cross['AR'][-20:], 
            color='red', marker='v', s=80, label='死叉(卖出)', alpha=0.8)

plt.title('BRAR (人气意愿指标) - AR/BR Curves', fontsize=14)
plt.xlabel('Date')
plt.ylabel('Value')
plt.legend(loc='upper left')
plt.grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

# ========== 第九步:不同周期BRAR对比 ==========
plt.figure(figsize=(14, 6))
plt.plot(df.index[-150:], df['BR'][-150:], label='BR (26日)', linewidth=1.5, color='red')
plt.plot(df.index[-150:], df['BR_13'][-150:], label='BR (13日) - 短线', linewidth=1, alpha=0.7)
plt.plot(df.index[-150:], df['BR_52'][-150:], label='BR (52日) - 长线', linewidth=1.5, color='purple')
plt.axhline(y=100, color='gray', linestyle='-', linewidth=0.8)
plt.axhline(y=400, color='darkred', linestyle='--', linewidth=0.8)
plt.title('BR: Different Periods Comparison (13, 26, 52)', fontsize=14)
plt.xlabel('Date')
plt.ylabel('BR Value')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

# ========== 第十步:数据清洗提示 ==========
nan_count = df['AR'].isna().sum()
print(f"\nBRAR初始NaN数量:{nan_count}")
print("原因:BRAR需要至少length个周期的数据才能开始计算")
print("处理建议:df_clean = df.iloc[26:].copy()")

4. 关键注意事项

参数名称注意

由于open是Python的内置函数,pandas_ta使用open_作为参数名称:

python 复制代码
# 正确用法
df['AR'], df['BR'] = ta.brar(df['open'], df['high'], df['low'], df['close'])

# 注意:参数名是open_(带下划线),但传入时用df['open']

负值归零处理

BR计算中的HCY和CYL如果为负值,需要归零处理,pandas_ta内部已自动完成:

python 复制代码
# pandas_ta内部逻辑等价于
HCY = max(0, H - prev_close)
CYL = max(0, prev_close - L)

返回值解包

python 复制代码
# BRAR返回DataFrame包含AR和BR两列
result = ta.brar(df['open'], df['high'], df['low'], df['close'])

# 方法1:按列名提取
df['AR'] = result['AR']
df['BR'] = result['BR']

# 方法2:按索引提取
df['AR'] = result.iloc[:, 0]
df['BR'] = result.iloc[:, 1]

五、总结

BRAR(人气意愿指标)是一种融合东方"气"哲学思想的技术分析工具,其核心价值与定位如下:

维度 特点
核心思想 气极则衰,衰极则盛------物极必反的市场哲学
两大组成部分 AR(人气指标)+ BR(意愿指标)
核心功能 衡量多空力量对比、识别高低价位圈
最佳应用场景 中短期趋势判断、局部底部捕捉、反弹操作
主要局限 信号不够明确、BR可能无限延伸、不能用于短线

实战使用三原则

  1. AR看能量,BR看情绪:AR关注开盘价推算潜在动能,BR关注前日收盘价推算情绪温度,两者结合形成完整判断
  2. 交叉信号优先:AR与BR的金叉死叉是BRAR最核心的交易信号,比单独的超买超卖判断更可靠
  3. 等待狙击买点:当BR从150以上跌至50以下且BR<AR时,是罕见的绝佳买点(狙击点),应果断介入

最后提醒:BRAR的最大价值在于其"物极必反"的哲学思想------当情绪达到极端时,反转往往就在眼前。然而,由于BR可能无限延伸(如从300升至1000),在极度狂热时需改用CR指标。BRAR的核心应用是捕捉局部底部做反弹,而非用于短线日内交易。

相关推荐
wayz111 小时前
20260530 软件ETF(159852)量化分析
算法·金融·数据分析·量化交易
AIFQuant2 小时前
外汇交易平台技术栈深度解析:行情 API、清算、风控、前端一体化方案
前端·python·websocket·金融·restful
久违 °10 小时前
【AI-Agent】TagMatrix 数据标注工具开发
人工智能·数据分析·go·agent·数据隐私
2601_9599857414 小时前
MHMarkets迈汇:“减重药渠道拓宽估值空间”
金融
城数派21 小时前
2026年500米分辨率DEM地形数据(全球/全国/分省/分市)
数据库·arcgis·信息可视化·数据分析·excel
Sharewinfo_BJ1 天前
Power BI 5月重磅更新:8大新功能全面提升数据分析效率
大数据·人工智能·数据分析
weixin_459778721 天前
当 AI 开始理解企业:金融复杂系统下的智能体实践
人工智能·ai·金融·ai编程·ai-native
实在智能RPA1 天前
AI Agent 赋能金融反洗钱,自定义风控规则如何落地?
人工智能·ai·金融
weixin_468466851 天前
Crawl4Ai 智能数据采集与场景化应用指南
大数据·人工智能·爬虫·python·数据分析