本文使用Python语言绘制一只股票的CCI(Commodity channel index)曲线,论文参考《Commodity channel index: Tool for trading cyclic trends》,该指标可以用来测量股价、外汇或者贵金属交易是否已超出常态分布范围, 波动于正无穷大和负无穷大之间 。
参考招商证券软件对CCI指标的应用:
参考百度对CCI公式的定义:
* CCI(n) = (TP- MA) ÷MD ÷0.015
* TP = (最高价 + 最低价 + 收盘价) ÷ 3
* MA = 最近n日(TP)价的累计和÷n
* MD = 最近n日 (TP-MA )的绝对值的累计和 ÷ n
* 系统默认n为14
根据公式,需要获得一只股票每天的盘口数据,可以使用AKShare库获取:
import akshare as ak
import datetime
date = datetime.datetime.now().strftime("%Y%m%d")
stock_zh_a_spot_em_df = ak.stock_zh_a_spot_em()
stock_zh_a_spot_em_df.to_csv('E:\\股票盘口信息\\{}.csv'.format(date), encoding='utf_8_sig')
这样我们就获得了每一天的盘口数据,CSV格式,文件内容如下:
采用下面的代码,绘制CCI曲线,股票选择平安银行,代码“000001”,csv格式的文件中“代码”列是数值,所以前面五个0会去掉,故下面代码中stock_num为1,又如上图“代码”列中的758,表示“000758”中色股份。
import math
import os.path
import matplotlib.pyplot as plt
import pandas as pd
date = []
zg = []
zd = []
zxj = []
TP = []
MA = []
MD = []
CCI = []
n = 14
plt.figure(figsize=(10, 5))
stock_num = 1
path = 'E:\\股票盘口信息'
name_list = os.listdir(path)
for name in name_list:
filename = 'E:\\股票盘口信息\\' + name
data = pd.read_csv(filename, encoding='utf_8_sig')
for i in range(0, len(data.get('代码'))):
if data.get('代码')[i] == stock_num:
zg.append(data.get('最高')[i])
zd.append(data.get('最低')[i])
zxj.append(data.get('最新价')[i])
TP.append((data.get('最高')[i] + data.get('最低')[i] + data.get('最新价')[i]) / 3)
date.append(name)
break
for i in range(0, len(date)):
if i >= (n - 1):
count = 0
for j in range(0, n):
count += TP[i - j]
MA.append(count/n)
else:
MA.append(0)
for i in range(0, len(date)):
if i >= (n - 1):
count = 0
for j in range(0, n):
count += math.fabs(TP[i - j] - MA[i - j])
MD.append(count/n)
else:
MD.append(0)
for i in range(0, len(date)):
CCI.append((TP[i] - MA[i])/(MD[i]*0.015))
plt.plot(date, CCI, 'b')
plt.grid()
plt.show()
拿证券软件的曲线对应:
可能是中间有几天数据缺失的原因,形状有些不一样,如果是代码问题是留言指正。
==============================
(抱怨几句)去年11月12月项目比较忙,加上☀了一个星期,年底部门会议又多,停更了几个月。说实话,年纪确实大了,以前在实验室,从早上9点整到晚上22点,还能开开心心吃个宵夜再回家,现在每天7点下班回家后就躺在沙发上起不来,感觉消耗特别大,借迪迪哥一句“哎~人生啊”。