Python 实现 CCI 指标计算:股票技术分析的利器系列(8)

Python 实现 CCI 指标计算:股票技术分析的利器系列(8)


介绍

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));
  1. 计算TYP(典型价格):

    • TYP 是指通过将最高价(HIGH)、最低价(LOW)和收盘价(CLOSE)相加,然后除以3得到的值。这个值代表了一定时间段内的典型价格。
  2. 计算CCI(商品通道指数):

    • 首先,从TYP序列中减去TYP的N期简单移动平均(MA(TYP, N)),其中N是指定的周期数,通常是20。
    • 接着,将差值除以一个常数(0.015)与TYP的N期平均绝对偏差(AVEDEV(TYP, N))的乘积。
    • 平均绝对偏差是指TYP序列中每个数据点与序列的平均值的绝对差的平均值。
    • 最终得到的值就是CCI指标,用来衡量价格相对于其平均价格的差异程度。

这个指标主要用于判断市场是否处于超买或超卖状态。CCI越高,说明价格偏离其平均值越多,可能意味着市场处于超买状态;而CCI越低,可能意味着市场处于超卖状态。

代码

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

核心代码

计算 CCI
# 计算 CCI
def calculate_CCI(data, n):
    typ = (data['HIGH'] + data['LOW'] + data['CLOSE']) / 3
    typ_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 pd

import a_get_data

data = {
    'CLOSE': 填每日收盘的数据,
    'HIGH': 填每日最高的数据,
    'LOW': 填每日最低的数据
}

# 计算 CCI
def calculate_CCI(data, n):
    typ = (data['HIGH'] + data['LOW'] + data['CLOSE']) / 3
    typ_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


df = pd.DataFrame(data)

n = 14

# 计算CCI指标
df["CCI"] = calculate_CCI(df, n)
print(df)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盗理者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值