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
函数通常与其他函数(如 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
。
核心代码
计算MID
# 计算MID
df['MID'] = (df['HIGH'].shift(1) + df['LOW'].shift(1)) / 2
-
df['HIGH'].shift(1)
:这一部分是将“HIGH”列中的数据向下移动一行。由于正在计算每一行的MID,所以需要使用前一天的高价。 -
df['LOW'].shift(1)
:这一部分是将“LOW”列中的数据向下移动一行。同样,需要使用前一天的低价。 -
(df['HIGH'].shift(1) + df['LOW'].shift(1))
:这一部分将前一天的高价和低价相加,得到前一天的价格总和。 -
/ 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
-
df['HIGH_MINUS_MID'] = df['HIGH'] - df['MID']
: 这一行创建了一个新的列'HIGH_MINUS_MID'
,其中存储了每一天的高价与MID(前一天的(HIGH + LOW)/ 2)之间的差值。这个差值表示了价格上涨的部分。 -
df['MID_MINUS_LOW'] = df['MID'] - df['LOW']
: 这一行创建了另一个新的列'MID_MINUS_LOW'
,其中存储了每一天的MID与低价之间的差值。这个差值表示了价格下跌的部分。 -
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 pdimport a_get_datadata = {'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)