[量化投资-学习笔记008]Python+TDengine从零开始搭建量化分析平台-CCI和ATR

目录

  • [1. 指标简介](#1. 指标简介)
  • [2. 程序编写](#2. 程序编写)
  • 题外话

1. 指标简介

将这两个指标放在一起,一方面是因为这两个指标都属于摆动指数,可以反应市场的活跃度。

另一方面是因为CCI和ATR与之前提到的EMA,MACD,布林带的三个指标的计算基础不同。之前的三个指标都是以收盘价作为计算基础,而CCI和ATR是以收盘价、最高价、最低价三个价格最为计算基础。

下面分别进行介绍。

CCI

CCI 指标(Commodity Channel Index / CCI)全称为商品通道指数,是一种用于衡量价格趋势强弱的震荡类指标。

CCI 旨在更全面地分析一定时间段内的综合价格走势,更好地反映价格的变化和波动。与其他震荡指标不同,CCI 不仅以收盘价为参考,还使用了最高价、最低价和收盘价的平均值作为计算基础。

计算公式:

  1. 计算典型价格(TP):TP =(最高价 + 最低价 + 收盘价)/ 3
  2. 计算典型价格移动平均线(TPSMA):TPSMA = (TP1 + TP2 + TP3 + ... + TPn) / n
  3. 计算均值偏差(Mean Deviation):MD = ( |TP1 - TPSMA1| +...+ |TPn - TPSMAn| ) / n
  4. 计算CCI指数:CCI = ( TPt - TPSMAt )/ ( 0.015 X MDt ),其中t代表当前K线上的数据,0.015用于将70%到80%的CCI数据归纳在100和-100之间.

ATR

ATR指标(Average True Range / ATR)是一种用于衡量资产价格波动的指标。

ATR指标的计算方法:

  1. 计算波动幅度TR(True Range):max(当天最高价和最低价之间的距离,前一天收盘价和当天最高价之间的距离,前一天收盘价和当天最低价之间的距离)。
  2. 取一定时间周期内(通常默认为14个交易日)TR的平均值,即可得到平均真实波动幅度ATR。

ATR的波动幅度概念可以显示出交易者的期望和市场交易的活跃程度。波动率越高,ATR值越高;反之,波动率越低,ATR值也越低。

2. 程序编写

由俭入奢,由易奢入俭难。自从用了 AI,就不想自己写代码了。

关门放 DevChat。

对程序进行修改,除了地址、用户名密码、数据库、SQL外,需要调整REstful查询方式。

python 复制代码
response = requests.post(query_url, data=query, auth=(user, password))
data = json.loads(response.content.decode())

TDengine 查询方面需要做出几项修改:

  1. Restful 需要使用 POST 方式;
  2. Body 中的内容是 SQL 明文;
  3. 返回的结果是 json 格式。

为方便图形查看,添加收盘价图形,并在 CCI 图形上添加趋势线来区分超买超卖区域。

python 复制代码
import requests
import pandas as pd
import numpy as np
import json
from matplotlib import pyplot as plt

# 设置TDengine数据库的连接信息
host = 'http://10.7.7.14'
port = '6041'
user = 'root'
password = 'taosdata'
database = 'trade_data_c'

# 从TDengine查询一段时间内的收盘价
query_url = f"{host}:{port}/rest/sql/{database}"
query = "select tdate,close,high,low from trade_data_c.tdata where fcode='000001' and tdate>= '2022-03-01' AND tdate <= '2023-02-28'"
response = requests.post(query_url, data=query, auth=(user, password))
data = json.loads(response.content.decode())
df = pd.DataFrame(data['data'], columns=['tdate', 'close','high','low'])
df['tdate'] = pd.to_datetime(df['tdate'])
df.set_index('tdate', inplace=True)

# 计算ATR
df['high - low'] = df['close'].diff().abs()
df['high - close_pre'] = (df['high'] - df['close'].shift()).abs()
df['low - close_pre'] = (df['low'] - df['close'].shift()).abs()
df['TR'] = df[['high - low', 'high - close_pre', 'low - close_pre']].max(axis=1)
df['ATR'] = df['TR'].rolling(window=14).mean()

# 计算CCI
tp = (df['high'] + df['low'] + df['close']) / 3
ma = tp.rolling(window=20).mean()
md = tp.rolling(window=20).std()
df['CCI'] = (tp - ma) / (0.015 * md)

# 绘制ATR和CCI图形
plt.figure(figsize=(12, 8))
plt.subplot(3, 1, 1)
plt.plot(df.index, df['close'])
plt.title('CLOSE')
plt.xlabel('Date')
plt.ylabel('Value')

plt.subplot(3, 1, 2)
plt.plot(df.index, df['ATR']*10)
plt.title('ATR')
plt.xlabel('Date')
plt.ylabel('Value(x10)')

plt.subplot(3, 1, 3)
plt.plot(df.index, df['CCI'])
plt.axhline(y=0,color='red',linestyle='--')
plt.axhline(y=100,color='red',linestyle='--')
plt.axhline(y=-100,color='red',linestyle='--')
plt.title('CCI')
plt.xlabel('Date')
plt.ylabel('Value')

plt.tight_layout()
plt.show()

仔细想了想,我做的这些修改是否都可以由AI自动完成呢?

题外话

相比于只使用收盘价,采用更多的价格理论上应该更能贴近真实的市场。

但事实却不一定如此,有时最高价、最低价只是市场上的噪音,不应该考虑在内。

相关推荐
kakwooi27 分钟前
Hadoop---MapReduce(3)
大数据·hadoop·mapreduce
数新网络28 分钟前
《深入浅出Apache Spark》系列②:Spark SQL原理精髓全解析
大数据·sql·spark
深度学习lover31 分钟前
<项目代码>YOLOv8 苹果腐烂识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·苹果腐烂识别
dayouziei1 小时前
java的类加载机制的学习
java·学习
热爱跑步的恒川1 小时前
【论文复现】基于图卷积网络的轻量化推荐模型
网络·人工智能·开源·aigc·ai编程
API快乐传递者2 小时前
淘宝反爬虫机制的主要手段有哪些?
爬虫·python
阡之尘埃3 小时前
Python数据分析案例61——信贷风控评分卡模型(A卡)(scorecardpy 全面解析)
人工智能·python·机器学习·数据分析·智能风控·信贷风控
aloha_7894 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
dsywws5 小时前
Linux学习笔记之vim入门
linux·笔记·学习
晨曦_子画6 小时前
3种最难学习和最容易学习的 3 种编程语言
学习