[量化投资-学习笔记002]Python+TDengine从零开始搭建量化分析平台-MA均线的多种实现方式

MA 均线时最基本的技术指标,也是最简单,最不常用的(通常使用EMA、SMA)。

以下用两种不同的计算方法和两种不同的画图方法进行展示和说明。

MA 均线指标公式

MA (N)=(C1 +C2 +C3 +…+C N )/N

目录

  • 方式一
    • 1.SQL 直接查询均值
    • 2.使用 pyplot 进行绘图
    • 3.使用 Grafana 绘图
  • 方式二
    • 1.使用 Python 计算 MA
    • 2.使用 pyplot 进行绘图
  • 高能预警
  • 题外话

方式一

1.SQL 直接查询均值

TDengine 提供了很多时间相关函数,其中有个窗口函数 interval 可以进行滑动时间窗口的运算。函数说明见官方文档。

直接查询 2022-08-01 到 2022-10-01 时间段的 5 日 MA,SQL 如下:

selectma
from(select_wend as ts,avg(close) as mafrom(select_wstart,last(close) as closefromtrade_data_a.tdatawherefcode = "000001" interval(1d) // 获取每日最后一分钟的收盘价作为当日收盘价) interval(5d) sliding(1d) //计算5日的收盘价平均值,滑动窗口为1天。)
wherets >= "2022-08-01" and ts <= "2022-10-01" //选取指定时间范围内数据

数据结构见之前的文章《[量化投资-学习笔记001]Python+TDengine从零开始搭建量化分析平台-数据存储》

Python 代码如下:

def request_get(resInfo):load_data = json.loads(resInfo)data = load_data.get("data")datalist= []for i in range(len(data)):datalist.append(float(data[i][0]))return datalistdef get_ma(sql):ma = []rt = request_post(tdurl,sql,username,password)if check_return(rt) == 'error':print(rt)else:ma = request_get(rt)return ma

2.使用 pyplot 进行绘图

if __name__ == '__main__':ma5 = get_ma(ma5_sql)ma10 = get_ma(ma10_sql)plt.title("MA")plt.plot(ma5,'b',linewidth=1.0,label='MA5')plt.plot(ma10,'y',linewidth=1.0,label='MA10')plt.legend()plt.grid()plt.show()

在这里插入图片描述

3.使用 Grafana 绘图

Grafana 可以直接访问 TDengine 数据库,我们直接添加一张时间序列图即可。
SQL 如下:

select ts,ma from (select _wend as ts,avg(close) as ma from (select _wstart,last(close) as close from trade_data_a.tdata where fcode="000001" interval(1d)) interval(5d) sliding(1d) )where ts>=$from and ts<=$to

在这里插入图片描述

注意:
Grafana 中的时间序列图必须带上时间。
时间范围可以使用 Grafana 自带函数 $from 和 $to,方便图形的缩放。

方式二

1.使用 Python 计算 MA

通过查询 TDengine 数据库获取原数据,然后使用 Python 计算 MA。
原始数据获取:

selectclose
from(select_wstart as ts,last(close) as closefromtrade_data_a.tdatawherefcode = "000001" interval(1d) //获取每日收盘价)
wherets >= "2022-08-01" and ts <= "2022-10-01" //获取指定日期收盘价

这里计算 MA 时取巧,使用了 numpy 的均值函数。

def calc_ma(days,ma):ma_n = []days = days-1for i in range(len(ma)):if i >= days:ma_n.append(np.mean(ma[i-days:i+1]))else:if i == 0:ma_n.append(ma[i])else:ma_n.append(np.mean(ma[:i]))return ma_n

注意:
以上对初始的几个值按实际个数进行了平均,因此结果与方式一存在偏差。

2.使用 pyplot 进行绘图

if __name__ == '__main__':ma5_n = calc_ma(5,get_ma(sql_ma))ma10_n = calc_ma(10,get_ma(sql_ma))plt.title("MA")plt.plot(ma5_n,'g',linewidth=1.0,label='MA5_N')plt.plot(ma10_n,'r',linewidth=1.0,label='MA10_N')plt.legend()plt.grid()plt.show()

在这里插入图片描述

高能预警

从图形上来看,不管哪种方式,展示出的图形都相差不大,但为了对比,我们讲方式一和方式二的图形放到一起进行对比。

if __name__ == '__main__':ma5 = get_ma(ma5_sql)ma10 = get_ma(ma10_sql)ma5_n = calc_ma(5,get_ma(sql_ma))ma10_n = calc_ma(10,get_ma(sql_ma))plt.title("MA")plt.plot(ma5,'b',linewidth=1.0,label='MA5')plt.plot(ma10,'y',linewidth=1.0,label='MA10')plt.plot(ma5_n,'g',linewidth=1.0,label='MA5_N')plt.plot(ma10_n,'r',linewidth=1.0,label='MA10_N')plt.legend()plt.grid()plt.show()

在这里插入图片描述

WTF!!

大坑出现了!!

为何图形形状差不多,但是数据却对不上??

问题就出在 TDengine 的滑动时间窗口函数上面,这个函数是按照时间维度顺序滑动的,默认时间是连续的。

但是
交易时间是不连续的!
交易时间是不连续的!
交易时间是不连续的!

这就造成了方式一中不仅相同时间段的数据条数多了,数值计算也错了。

所以,TDengine 的时间窗口函数对于这种不连续的时间真是无能为力,只能老老实实自己进行计算了。

但如果只是想看看趋势什么的,不考虑精确性,用 TDengine+Grafana 还是挺方便的。

题外话

MA 是技术分析指标。对于技术分析有时模糊的准确比精准的错误更重要。
我之前有个课后作业对技术分析的多解性做了说明,有兴趣的同学可以看两眼:https://www.zhihu.com/question/34886985/answer/3264087568

技术分析除了具有多解性,还具有反身性,这就造成了技术分析的误差非常大,而且越追求精准,误差越大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/124522.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RHCE---shell脚本编程sed

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 Liunx中筛选文本时常用的命令&#xff0c;常常会被提及文本三剑客&#xff0c;前文我们学习了文本三剑客中的grep 命令&#xff0c;除了grep命令我们也常用到sed命令&#xff0c;sed命令有…

window系统修改rabbitmq 默认端口

安装完rabbitmq之后&#xff0c;默认的client端口是5672, 控制台访问端口是15672&#xff0c;rabbitmq管理工具启动之后在浏览器中输入地址&#xff1a; ​ ​http://localhost:15672/​​​ 就可以访问后台​ ​​​&#xff0c; 默认管理员账号&#xff1a;guest 密码&#x…

【0基础学Java第四课】-- 逻辑控制

4. 逻辑控制 4.1 顺序结构4.2 分支结构4.2.1 if语句判断一个数字是奇数还是偶数判断一个数字是正数&#xff0c;负数&#xff0c;还是零判断一个年份是否为闰年 4.2.2 switch 语句 4.3 while循环打印 1 - 10 的数字计算 1 - 100 的和计算 5 的阶乘计算1&#xff01;2&#xff0…

Openssl数据安全传输平台014:OCCI环境搭建和使用:Centos8-Oracle19c代码跑通 + Window代码没跑通(不影响本项目)

文章目录 0 代码仓库1 启动Centos oracle数据库2 Winsows安装配置OCCI库2.1 下载文件2.2 VS 配置2.2.1 VC包含目录2.2.2 VC库目录2.2.3 连接器-附加依赖项2.2.4 代码测试-Oracle11g2.2.4.1 准备2.2.4.2 代码测试 3 Centos安装配置occi库3.0 强调3.1 下载instantclient库文件压缩…

ubuntu 安装串口工具和添加虚拟串口

目录 一、串口工具安装 二、使用Windows本身虚拟的串口 &#xff08;一&#xff09;添加串口 1、保证虚拟机是关闭状态&#xff0c;打开“虚拟机设置”&#xff0c;点击“添加”。 2、选中“串行端口”&#xff0c;点击“完成”。 3、选中刚添加的串口&#xff0c;下拉选…

python快速入门

语法结构 基本输出 使用print函数来完成基本输出 print("I am xl")注释 单行注释使用# 多行注释 多行注释""" 多行注释 """缩进 python和其他语言最大的区别就是用缩进来区分子代码区域而不是大括号 续行 使用\符号来完成续行…

宠物用品小程序

近年来&#xff0c;越来越多的人选择将宠物视为家庭的一员&#xff0c;为宠物购买各种用品成为了一项重要的消费活动。因此&#xff0c;宠物用品小程序应运而生&#xff0c;为消费者提供了一个便捷的购买平台&#xff0c;同时也为宠物带来了更加幸福的生活。 登录乔拓云平台进入…

京东平台数据分析(京东销量):2023年9月京东吸尘器行业品牌销售排行榜

鲸参谋监测的京东平台9月份吸尘器市场销售数据已出炉&#xff01; 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年9月&#xff0c;京东吸尘器的销量为19万&#xff0c;环比下滑约12%&#xff0c;同比下滑约25%&#xff1b;销售额为1.2亿&#xff0c;环比下滑约11%&…

前端实现埋点监控

前端实现埋点&监控 实现埋点功能的意义主要体现在以下几个方面&#xff1a; 数据采集&#xff1a;埋点是数据采集领域&#xff08;尤其是用户行为数据采集领域&#xff09;的术语&#xff0c;它针对特定用户行为或事件进行捕获、处理和发送的相关技术及其实施过程。通过埋…

本地生活商家用批量剪辑有用吗?

可以用&#xff0c;现在很多本地生活商家&#xff0c;都会通过借助批量剪辑工具来提升视频的曝光量&#xff0c;从而带动店铺的客流量。 推荐本地生活商家使用超级编导批量剪辑工具&#xff0c;这是一款0基础小白也可以很快上手的批量剪辑工具&#xff0c;剪辑页面布局以及功能…

python_PyQt5日周月K线纵向对齐显示_3_聚焦某段图形

目录 写在前面&#xff1a; 结果显示&#xff1a; 代码&#xff1a; 写在前面&#xff1a; “PyQt5日周月K线纵向对齐显示”&#xff0c;将分三篇博文描述 1 数据处理。将数据处理成适合图形显示的格式。&#xff08;已写&#xff0c;请看往期博文&#xff09; 2 显示工具…

不小心commit错误代码,还没push的回滚解决方法

命令&#xff1a;git reset --soft HEAD^ 第一步&#xff1a;找到项目所在文件夹 第二步&#xff0c;右键点击git base here 第三步&#xff0c;命令行输入git reset --soft HEAD^ 回车即可

【斗破年番】暗杀行动开始,萧炎斩杀负伤,彩鳞心疼霸气回击

【侵权联系删除】【文/郑尔巴金】 深度爆料&#xff0c;《斗破苍穹》年番第69集刚刚更新了&#xff01;在这集剧情中&#xff0c;萧炎和美杜莎筹划了一场暗杀行动&#xff0c;以保障炎盟的安全。他们根据小医仙提供的地图&#xff0c;分别负责击杀慕兰三老和雁落天这两位敌方强…

sql-50练习题0-5

sql练习题0-5题 前言数据库表结构介绍学生表课程表成绩表教师表 0-1 查询"01"课程比"02"课程成绩高的学生的信息及课程分数0-2查询"01"课程比"02"课程成绩小的学生的信息及课程分数0-3查询平均成绩大于等于60分的同学的学生编号和学生…

C语言 每日一题 PTA 10.30 day8

1.高空坠球 皮球从某给定高度自由落下&#xff0c;触地后反弹到原高度的一半&#xff0c;再落下&#xff0c;再反弹&#xff0c;……&#xff0c;如此反复。问皮球在第n次落地时&#xff0c;在空中一共经过多少距离&#xff1f;第n次反弹的高度是多少&#xff1f; 输入格式 : …

Element 多个Form表单 同时验证

一、背景 在一个页面中需要实现两个Form表单&#xff0c;并在页面提交时需要对两个Form表单进行校验&#xff0c;两个表单都校验成功时才能提交 所用技术栈&#xff1a;Vue2Element UI 二、实现效果 三、多个表单验证 注意项&#xff1a; 两个form表单&#xff0c;每个表单上…

R语言与作物模型(以DSSAT模型为例)融合应用

随着基于过程的作物生长模型&#xff08;Process-based Crop Growth Simulation Model&#xff09;的发展&#xff0c;R语言在作物生长模型和数据分析、挖掘和可视化中发挥着越来越重要的作用。想要成为一名优秀的作物模型使用者与科研团队不可或缺的人才&#xff0c;除了掌握对…

秒级启动的集成测试框架

本文介绍了一种秒级启动的集成测试框架&#xff0c;使用该框架可以方便的修改和完善测试用例&#xff0c;使得测试用例成为测试过程的产物。 背景 传统的单元测试&#xff0c;测试的范围往往非常有限&#xff0c;常常覆盖的是一些工具类、静态方法或者较为底层纯粹的类实现&…

PostMan 之 Mock 接口测试

在测试的时候经常会碰到后端开发工程师的接口还没有开发完成&#xff0c;但是测试任务已经分配过来。没有接口怎么测试呢&#xff1f; 测试人员可以通过 mock server 自己去造一个接口来访问。mock server 可用于模拟真实的接口。收到请求时&#xff0c;它会根据配置返回对应的…

桶装水送水多门店水票押金押桶小程序开发

桶装水送水多门店水票押金押桶小程序开发 用户注册和登录首页展示各门店的桶装水品牌和价格用户可以选择门店和水品牌&#xff0c;并下单购买桶装水用户可以选择送水时间和地址用户可以查看自己的订单历史和当前订单状态用户可以申请退款或修改订单信息门店可以登录后台管理系…