Python 实现 CCI 指标计算:股票技术分析的利器系列(8)
- 介绍
- 算法解释
- 代码
- rolling函数介绍
- 核心代码
- 计算 CCI
- apply 函数
- abs 函数
- 完整代码
介绍
CCI指标的数值波动通常在一个区间内,常见的情况是在-100到+100之间。当CCI超过+100时,通常表示价格处于超买状态,可能会出现回调或下跌的趋势;当CCI低于-100时,通常表示价格处于超卖状态,可能会出现反弹或上涨的趋势。因此,CCI可以帮助交易者确认价格的转折点,并作为买入或卖出的参考依据。
先看看官方介绍:
CCI(商品路径指标)
用法
1.CCI 为正值时,视为多头市场;为负值时,视为空头市场;
2.常态行情时,CCI 波动于±100 的间;强势行情,CCI 会超出±100 ;
3.CCI>100 时,买进,直到CCI<100 时,卖出;
4.CCI<-100 时,放空,直到CCI>-100 时,回补。
算法解释
TYP:=(HIGH+LOW+CLOSE)/3;
CCI:(TYP-MA(TYP,N))/(0.015*AVEDEV(TYP,N));
-
计算TYP(典型价格):
- TYP 是指通过将最高价(HIGH)、最低价(LOW)和收盘价(CLOSE)相加,然后除以3得到的值。这个值代表了一定时间段内的典型价格。
-
计算CCI(商品通道指数):
- 首先,从TYP序列中减去TYP的N期简单移动平均(MA(TYP, N)),其中N是指定的周期数,通常是20。
- 接着,将差值除以一个常数(0.015)与TYP的N期平均绝对偏差(AVEDEV(TYP, N))的乘积。
- 平均绝对偏差是指TYP序列中每个数据点与序列的平均值的绝对差的平均值。
- 最终得到的值就是CCI指标,用来衡量价格相对于其平均价格的差异程度。
这个指标主要用于判断市场是否处于超买或超卖状态。CCI越高,说明价格偏离其平均值越多,可能意味着市场处于超买状态;而CCI越低,可能意味着市场处于超卖状态。
代码
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
。
核心代码
计算 CCI
# 计算 CCI
def calculate_CCI(data, n):typ = (data['HIGH'] + data['LOW'] + data['CLOSE']) / 3typ_ma = typ.rolling(window=n).mean()mean_deviation = typ.rolling(window=n).apply(lambda x: (x - x.mean()).abs().mean())cci = (typ - typ_ma) / (0.015 * mean_deviation)return cci
apply 函数
apply
函数是pandas库中的一个重要函数,它能够将指定的函数应用到DataFrame或Series的行或列上。apply
函数的灵活性使得我们能够对数据进行各种自定义的处理和计算。
DataFrame.apply(func, axis=0, raw=False, result_type=None, args=(), **kwds)
Series.apply(func, convert_dtype=True, args=())
func
:要应用的函数,可以是一个Python函数、lambda函数或者其他可调用的对象。axis
:指定函数是沿着DataFrame的行(axis=0)还是列(axis=1)进行应用,默认是沿着列方向。raw
:布尔值,表示是否将整行或整列的数据传递给函数,默认为False,表示传递的是每个元素。result_type
:结果的数据类型,默认为None,表示返回结果的数据类型与输入的数据类型相同;如果指定为’expand’,则返回一个DataFrame;如果指定为’reduce’,则返回一个Series。args
:要传递给函数的其他位置参数。
apply
函数能够接受的函数有很多种,包括lambda函数、自定义函数、numpy函数等。通常情况下,我们会使用lambda函数或者自定义函数来对数据进行处理,然后通过apply
函数将其应用到DataFrame或Series上。
下面是一个示例,演示如何使用apply
函数将一个自定义函数应用到DataFrame的列上:
import pandas as pd# 自定义函数,用于计算平方
def square(x):return x ** 2# 创建DataFrame
df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [6, 7, 8, 9, 10]})# 将自定义函数应用到DataFrame的每一列上
result = df.apply(square)
print(result)
abs 函数
abs()
函数是 Python 的内置函数之一,用于返回指定数字的绝对值。
在数学上,一个数的绝对值是该数到零的距离,因此无论该数是正数还是负数,它的绝对值都是非负数。
abs()
函数接受一个参数,并返回该参数的绝对值。如果参数是整数或浮点数,则返回相应的数值的绝对值;如果参数是复数,则返回该复数的模。
下面是一个简单的示例:
# 整数的绝对值
print(abs(-5)) # 输出:5# 浮点数的绝对值
print(abs(-3.14)) # 输出:3.14# 复数的模
print(abs(3 + 4j)) # 输出:5.0
完整代码
import pandas as pdimport a_get_datadata = {'CLOSE': 填每日收盘的数据,'HIGH': 填每日最高的数据,'LOW': 填每日最低的数据
}# 计算 CCI
def calculate_CCI(data, n):typ = (data['HIGH'] + data['LOW'] + data['CLOSE']) / 3typ_ma = typ.rolling(window=n).mean()mean_deviation = typ.rolling(window=n).apply(lambda x: (x - x.mean()).abs().mean())cci = (typ - typ_ma) / (0.015 * mean_deviation)return ccidf = pd.DataFrame(data)n = 14# 计算CCI指标
df["CCI"] = calculate_CCI(df, n)
print(df)