Python 实现 CHO 指标计算(济坚指数):股票技术分析的利器系列(12)
- 介绍
- 算法公式
- 代码
- rolling函数介绍
- 核心代码
- 计算 CHO
- 完整代码
介绍
CHO(济坚指数)是一种在金融领域中用于衡量市场波动性和风险的指数
先看看官方介绍:
CHO (济坚指数)
用法
1.CHO 曲线产生急促的「凸起」时,代表行情即将向上或向下反转;
2.股价>90 天平均线,CHO由负转正时,买进;
3.股价<90 天平均线,CHO由正转负时,卖出;
4.本指标也可设参考线,自定超买超卖的界限值;
5.本指标须配合OBOS、ENVELOPE同时使用。
算法公式
MID:=SUM(VOL*(2*CLOSE-HIGH-LOW)/(HIGH+LOW),0);
CHO:MA(MID,N1)-MA(MID,N2);
MACHO:MA(CHO,M);
优势 | 劣势 |
1. 提供反转信号 | 1. 存在滞后性 |
CHQ 曲线的急促凸起可提供市场反转信号 | 包含滚动平均值可能导致不能及时捕捉市场变化 |
2. 结合价格趋势 | 2. 可能产生假信号 |
结合股价与90天平均线关系,准确判断买卖时机 | 可能导致错误交易决策 |
3. 设定参考线 | 3. 参数选择需要根据市场特点调整 |
可根据需求设定超买超卖的界限值,提高适用性 | 参数选择不当可能影响指标准确性和适用性 |
4. 配合其他指标 | 4. 单一性 |
可与其他指标如 OBOS、ENVELOPE 结合使用 | 无法完全反映市场复杂情况,需要综合判断 |
代码
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
。
核心代码
计算 CHO
# 计算 MID
MID = df.apply(lambda row: row['VOL'] * (2 * row['CLOSE'] - row['HIGH'] - row['LOW']) / (row['HIGH'] + row['LOW']),
axis=1)
# 计算 CHO
CHO = MID.rolling(window=N1).mean() - MID.rolling(window=N2).mean()
- 计算 MID(Money Flow Index Distribution):
- 首先,对于数据框(DataFrame)中的每一行,根据特定的公式计算 MID 值。
- 公式中涉及了该行的 ‘VOL’(成交量)、‘CLOSE’(收盘价)、‘HIGH’(最高价)和 ‘LOW’(最低价)等数据。
- 计算 MID 的目的是衡量资金流向的情况,通过成交量和价格的关系来反映资金的流入流出情况。
- 计算 CHO(Chande Momentum Oscillator):
- 首先,对 MID 序列分别进行两个滚动平均计算,窗口大小分别为 N1 和 N2。
- 然后,用 N1 天的滚动平均值减去 N2 天的滚动平均值,得到 CHO 值。
- CHO 的计算实际上是通过比较两个不同期间的资金流向指标的变化情况来衡量市场动量的指标,可用于辅助判断价格趋势的变化。
完整代码
import pandas as pd
import a_get_data
data = {
'CLOSE': 填每日收盘的数据,
'HIGH': 填每日最高的数据,
'LOW': 填每日最低的数据
'OPEN': 填每日开盘的数据
'VOL': 填每日交易量的数据
}
df = pd.DataFrame(data)
# 计算 CHO
def calculate_CHO(df, N1, N2, M):
# 计算 MID
MID = df.apply(lambda row: row['VOL'] * (2 * row['CLOSE'] - row['HIGH'] - row['LOW']) / (row['HIGH'] + row['LOW']),
axis=1)
# 计算 CHO
CHO = MID.rolling(window=N1).mean() - MID.rolling(window=N2).mean()
# 计算 MACHO
MACHO = CHO.rolling(window=M).mean()
return CHO, MACHO
N1 = 10
N2 = 20
M = 6
CHO, MACHO = calculate_CHO(df, N1, N2, M)
df['CHO'] = CHO
df['MACHO'] = MACHO
print(df)