akshare量化股票市场情绪指标ARBR


# https://zhuanlan.zhihu.com/p/61488013/

# 先引入后面可能用到的包(package)
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import akshare as ak
import talib as ta

'''人气指标(AR)和意愿指标(BR)
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 日,计算周期可以根据自己的经验或回测结果进行修正。

双方的分界线是 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指标图上的走势却一底比一底高,说明出现底背离,股价短期内将低位反转,是比较强烈的买入信号。
'''

# 正常显示画图时出现的中文和负号
from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

# 引入TA-Lib库
import talib as ta
from datetime import datetime, timedelta

index2 = {'上证综指': '000001', '深证成指': '399001',
         '沪深300': '000300', '创业板指': '399006',
         '上证50': '000016', '中证500': '000905',
         '中小板指': '399005', '上证180': '000010'}
index={'上证综指': '000001'}
n = 250
tineperiod=26
for code in index.values():
    t = datetime.now()
    t0 = t - timedelta(n)
    start = t0.strftime('%Y%m%d')
    end = t.strftime('%Y%m%d')
    index_zh_a_hist_df = ak.index_zh_a_hist(symbol=code, period="daily", start_date=start, end_date=end)
    # print(index_zh_a_hist_df)
    index_zh_a_hist_df.index = pd.to_datetime(index_zh_a_hist_df['日期'])
    df = index_zh_a_hist_df.sort_index()
    df['HO'] = df['最高'] - df['开盘']
    df['OL'] = df['开盘'] - df['最低']
    df['HCY'] = df['最高'] - df['收盘'].shift(1)
    df['CYL'] = df['收盘'].shift(1) - df['最低']
    # 计算AR、BR指标
    df['AR'] = ta.SUM(df.HO, timeperiod=tineperiod) / ta.SUM(df.OL, timeperiod=tineperiod) * 100
    df['BR'] = ta.SUM(df.HCY, timeperiod=tineperiod) / ta.SUM(df.CYL, timeperiod=tineperiod) * 100
    # print(df['AR'].values[tineperiod-1:])
    # print(df['BR'].values[tineperiod-1:])
    for i in df['AR'].values[tineperiod-1:]:
        for j in df['BR'].values[tineperiod-1:]:
            if i<=100 and j<=100:
                print('空方优势')
                if 60>i and i>j and j<40:
                    print('随时可能反转上涨,考虑买进')
            elif i>=100 and j>=100:
                print('多方优势')
                if 180 < i and i < j and j > 400:
                    print('可能反转下跌,考虑卖出')
    result= df[['收盘', 'AR', 'BR']].dropna()
    result['收盘'].plot(color='g', figsize=(14, 5))
    plt.xlabel('')
    plt.title(code + '价格走势', fontsize=15)
    df[['AR', 'BR']].plot(figsize=(14, 5))
    plt.xlabel('')
    plt.show()

相关