Python 实现 CR 指标计算 (带状能量线):股票技术分析的利器系列(13)

  • 介绍
  • 算法公式
  • 代码
  • rolling函数介绍
  • 核心代码
  • 计算MID
  • 计算CR
  • 计算移动平均
  • 完整代码



介绍

CR指标,又称带状能量线,通过计算股价的动能和变化率,帮助投资者判断市场趋势的强弱及转折点。

先看看官方介绍:

CR (带状能量线)
用法
1.CR>400时,其10日平均线向下滑落,视为卖出信号;CR<40买进;
2.CR 由高点下滑至其四条平均线下方时,股价容易形成短期底部;
3.CR 由下往上连续突破其四条平均线时,为强势买进点;
4.CR 除了预测价格的外,最大的作用在于预测时间;
5.BR、AR、CR、VR 四者合为一组指标群,须综合搭配使用。

算法公式

MID:=REF(HIGH+LOW,1)/2;
CR:SUM(MAX(0,HIGH-MID),N)/SUM(MAX(0,MID-LOW),N)*100;
MA1:REF(MA(CR,M1),1+M1/2.5);
MA2:REF(MA(CR,M2),1+M2/2.5);
MA3:REF(MA(CR,M3),1+M3/2.5);
MA4:REF(MA(CR,M4),1+M4/2.5);

优势

详细说明

简单易懂的买卖信号

CR指标提供了明确的买入和卖出信号,基于CR值的高低和其与平均线的关系进行判断,使得投资者能够快速做出决策。

辅助短期底部判断

当CR从高点下滑至其平均线下方时,提供了短期底部的判断依据,有助于把握低点买入机会。

强势买入点的识别

当CR连续突破其平均线时,标志着市场的强势,为买入提供了信号。

预测时间的能力

CR不仅能预测价格趋势,还能较准确地预测时间,这对于投资者的持仓策略和交易时机的把握十分重要。

与其他指标综合使用

CR与BR、AR、VR等指标组合使用,可以提高分析的综合性和准确性,为投资决策提供更多参考。

劣势

详细说明

可能存在滞后性

CR指标的买卖信号可能存在一定的滞后性,导致无法及时捕捉到市场变化。

假信号的产生

由于市场波动的复杂性,CR指标也可能产生假信号,导致错误的交易决策。

依赖其他指标的配合

CR指标作为单一指标,可能无法全面反映市场情况,需要结合其他指标进行综合分析,增加了分析的复杂度。

参数设置的依赖性

CR指标的有效性和适用性与参数设置密切相关,如果参数设置不当,可能会影响指标的准确性和可靠性。

代码

rolling函数介绍

rolling 函数通常与其他函数(如 meansumstd 等)一起使用,以计算滚动统计量,例如滚动均值、滚动总和等。

以下是 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: 窗口类型,例如 Noneboxcartriang 等,默认为 None
  • on: 在数据帧中执行滚动操作的列,默认为 None,表示对整个数据帧执行操作。
  • axis: 执行滚动操作的轴,默认为 0,表示按列执行操作。
  • closed: 确定窗口的哪一端是闭合的,默认为 None

核心代码

计算MID
# 计算MID
df['MID'] = (df['HIGH'].shift(1) + df['LOW'].shift(1)) / 2
  1. df['HIGH'].shift(1):这一部分是将“HIGH”列中的数据向下移动一行。由于正在计算每一行的MID,所以需要使用前一天的高价。
  2. df['LOW'].shift(1):这一部分是将“LOW”列中的数据向下移动一行。同样,需要使用前一天的低价。
  3. (df['HIGH'].shift(1) + df['LOW'].shift(1)):这一部分将前一天的高价和低价相加,得到前一天的价格总和。
  4. / 2:最后,将前一天的高低价总和除以2,以计算得到前一天的中间价(MID)。
计算CR
# 计算CR
df['HIGH_MINUS_MID'] = df['HIGH'] - df['MID']
df['MID_MINUS_LOW'] = df['MID'] - df['LOW']
df['CR'] = df['HIGH_MINUS_MID'].clip(lower=0).rolling(window=N).sum() / df['MID_MINUS_LOW'].clip(lower=0).rolling(window=N).sum() * 100
  1. df['HIGH_MINUS_MID'] = df['HIGH'] - df['MID']: 这一行创建了一个新的列 'HIGH_MINUS_MID',其中存储了每一天的高价与MID(前一天的(HIGH + LOW)/ 2)之间的差值。这个差值表示了价格上涨的部分。
  2. df['MID_MINUS_LOW'] = df['MID'] - df['LOW']: 这一行创建了另一个新的列 'MID_MINUS_LOW',其中存储了每一天的MID与低价之间的差值。这个差值表示了价格下跌的部分。
  3. df['CR'] = df['HIGH_MINUS_MID'].clip(lower=0).rolling(window=N).sum() / df['MID_MINUS_LOW'].clip(lower=0).rolling(window=N).sum() * 100: 这一行是CR指标的计算过程。首先,它计算了一个时间窗口内(长度为N)高价与MID之间的正差总和,然后除以同样时间窗口内MID与低价之间的正差总和。这里使用了 .clip(lower=0) 来将负值截断为0,因为只需要关心价格的上涨部分。最后,乘以100,得到百分比值。
计算移动平均
# 计算移动平均
df['MA1'] = df['CR'].rolling(window=M1).mean().shift(1 + int(M1/2.5))
df['MA2'] = df['CR'].rolling(window=M2).mean().shift(1 + int(M2/2.5))
df['MA3'] = df['CR'].rolling(window=M3).mean().shift(1 + int(M3/2.5))
df['MA4'] = df['CR'].rolling(window=M4).mean().shift(1 + int(M4/2.5))

完整代码

import pandas as pd

import a_get_data

data = {
    'CLOSE': 填每日收盘的数据,
    'HIGH': 填每日最高的数据,
    'LOW': 填每日最低的数据
    'OPEN': 填每日开盘的数据
    'VOL': 填每日交易量的数据
}

df = pd.DataFrame(data)

N = 26
M1 = 10
M2 = 20
M3 = 40
M4 = 62

# 计算MID
df['MID'] = (df['HIGH'].shift(1) + df['LOW'].shift(1)) / 2

# 计算CR
df['HIGH_MINUS_MID'] = df['HIGH'] - df['MID']
df['MID_MINUS_LOW'] = df['MID'] - df['LOW']
df['CR'] = df['HIGH_MINUS_MID'].clip(lower=0).rolling(window=N).sum() / df['MID_MINUS_LOW'].clip(lower=0).rolling(
    window=N).sum() * 100

# 计算移动平均
df['MA1'] = df['CR'].rolling(window=M1).mean().shift(1 + int(M1 / 2.5))
df['MA2'] = df['CR'].rolling(window=M2).mean().shift(1 + int(M2 / 2.5))
df['MA3'] = df['CR'].rolling(window=M3).mean().shift(1 + int(M3 / 2.5))
df['MA4'] = df['CR'].rolling(window=M4).mean().shift(1 + int(M4 / 2.5))

# 删除中间计算的列
df.drop(['MID', 'HIGH_MINUS_MID', 'MID_MINUS_LOW', "HIGH", "HIGH", "LOW", "OPEN", "VOL"], axis=1, inplace=True)

print(df)

Python 实现 CR 指标计算 (带状能量线):股票技术分析的利器系列(13)_股票分析