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

news2024/9/29 9:21:58

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 如下:

select
    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) //计算5日的收盘价平均值,滑动窗口为1天。
    )
where
    ts >= "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 datalist


def 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。
原始数据获取:

select
    close
from
    (
        select
            _wstart as ts,
            last(close) as close
        from
            trade_data_a.tdata
        where
            fcode = "000001" interval(1d) //获取每日收盘价
    )
where
    ts >= "2022-08-01" and ts <= "2022-10-01" //获取指定日期收盘价

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

def calc_ma(days,ma):
    ma_n = []
    days = days-1
    for 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.coloradmin.cn/o/1140385.html

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

相关文章

带你深入理解“栈”(c语言 c++和stl Stack三个版本的模拟实现)

目录 一.栈的概念及结构 二.栈的实现&#xff08;c语言版&#xff09; 2.1静态增长的栈 2.2动态增长的栈 2.3动态栈的模拟实现 1.栈的初始化 2.入栈 3.出栈 4.获取栈顶元素 5.获取栈中有效数据个数 6.检查栈是否为空 7.栈的销毁 三.C 版本模拟实现栈 1.C版本的源代码…

java代理示例

以上代码通过Apache HttpComponents库&#xff0c;使用Java其中&#xff0c;proxy_host参数为代理服务器的主机名&#xff0c;proxy_port参数为服务器的端口号。程序首先创建了一个HttpGet对象&#xff0c;然后创建了一个HttpClient对象。接着&#xff0c;设置了HttpGet对象的U…

使用Typecho搭建个人博客网站,并内网穿透实现公网访问

使用Typecho搭建个人博客网站&#xff0c;并内网穿透实现公网访问 文章目录 使用Typecho搭建个人博客网站&#xff0c;并内网穿透实现公网访问前言1. 安装环境2. 下载Typecho3. 创建站点4. 访问Typecho5. 安装cpolar6. 远程访问Typecho7. 固定远程访问地址8. 配置typecho 前言 …

接口测试 —— Requests库GET请求!

Requests库GET请求是使用HTTP协议中的GET请求方式对目标网站发起请求。 &#xff08;不带参数的GET请求请看上一篇文章的练习&#xff09; 1、Requests库待参数的GET请求 使用Get方法带参数请求时&#xff0c;是params参数字典&#xff0c;而不是data参数字典。data参数字典…

亚马逊云科技Amazon Lightstail(VPS)与其他主流VPS相比优势在哪里?

亚马逊云科技作为全球网络科技的一方巨擘&#xff0c;在全球云计算领域可谓一枝独秀。而说到云计算领域&#xff0c;作为入门和基础使用场景的VPS就是一个无法绕开的话题。那么亚马逊云科技又有什么样的优势呢&#xff1f;今天这篇文章就市面现有的VPS服务做比较&#xff0c;解…

MYSQL数据库的概念和sql语句

数据是什么 数&#xff1a;数字信息 据&#xff1a;属性或某种凭据 数据&#xff1a;对一些列对对象的具体属性的描述信息的集合。 数据库是什么 数据库&#xff1a;就是用来组织 (按照规则组织起来的) &#xff0c;存储和管理 (对数据的增、删、改、查) 数据的仓库。 数…

【C++】set multiset

文章目录 前言1.set介绍2.set的使用3.multiset介绍4.multiset的使用 前言 知识铺垫&#xff1a;关联式容器和值键对概念 链接-【C】关联式容器 & 键值对&#xff08;概念介绍&#xff09; 1.set介绍 set文档 翻译&#xff1a; set是按照一定次序存储元素的容器&#xff…

2023年安全生产监管人员证考试题库及安全生产监管人员试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年安全生产监管人员证考试题库及安全生产监管人员试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试…

typedef复杂函数接口的解释

文章目录 typedef定义函数解释interface.h接口1、函数定义2、函数实现加载动态链接库3、sdologinentry.dll或者sdologinentry64.dll动态链接库哪个工程生成的并导出三个接口函数4、sdologinsdk.dll或者sdologinsdk64.dll动态链接库哪个工程生成并导出三个接口函数 typedef定义函…

redis爆满导致数据丢失

记一则redis爆满导致数据丢失的一场事故 某功能上线后&#xff0c;发现出现问题&#xff0c;最后定位到了 redis. 由于存储的数据过多&#xff0c;导致阿里云4G大小的 redis 爆满&#xff0c;触发了回收策略。 于是临时扩容,运维同学当时未找到阿里云配置。 后面我用工具连接了…

微服务-Feign

文章目录 Feign介绍Feign的基本使用自定义Feign的配置Feign性能优化Feign最佳实践 Feign介绍 RestTemplate远程调用存在的问题&#xff1a;代码可读性差&#xff0c;java代码中夹杂url&#xff1b;参数复杂很难维护 String url "http://userservice/user/" order.g…

常见MySQL数据库无法启动的解决方案

前言&#xff1a; 数据库无法启动是在运维中常见的问题&#xff0c;大多是重启服务器、磁盘损坏、配置不当导致的。建议您在面板计划任务中做个数据库全部备份的计划任务&#xff0c;这样在遇到问题的情况下可以及时通过备份进行恢复。 在根据下面的案例尝试恢复或者启动数据库…

dedecms 文件上传(CVE-2019-8933)

dedecms 文件上传&#xff08;CVE-2019-8933&#xff09; 漏洞简介 远程攻击者可通过在添加新模板时&#xff0c;将文件名…/index.html更改成…/index.php利用该漏洞向uploads/目录上传.php文件并执行该文件。 后台路径&#xff1a;/uploads/dede/ 后台密码&#xff1a;admi…

贪心算法学习——最大数

目录 ​编辑 一&#xff0c;题目 二&#xff0c;题目接口 三&#xff0c;解题思路级代码 一&#xff0c;题目 给定一组非负整数 nums&#xff0c;重新排列每个数的顺序&#xff08;每个数不可拆分&#xff09;使之组成一个最大的整数。 注意&#xff1a;输出结果可能非常大…

WEB使用百度地图展示某地地址

第一步 进入百度地图开发平台 百度地图开放平台 | 百度地图API SDK | 地图开发 第二步注册 获取AK秘钥&#xff0c;点击【创建应用】进入AK申请页面&#xff0c;填写应用名称&#xff0c;务必选择AK类型为“浏览器端”&#xff0c;JS API只支持浏览器端AK进行请求与访问 下面…

AVM赛道研究:预计2024年渗透率突破50%!下一个破局点在哪儿?

作为一个典型的基础智能化细分赛道&#xff0c;全景环视&#xff08;AVM&#xff09;的发展历程值得市场借鉴。 这其中的原因包括&#xff0c;①对比渗透率仍处低位的高阶智驾&#xff0c;单一AVM赛道的产品基本进入成熟期&#xff08;渗透率继续高歌猛进&#xff09;&#xf…

《算法通关村—如何基于数组(或者链表)实现栈》

《算法通关村—如何基于数组&#xff08;或者链表&#xff09;实现栈》 理解什么是栈 栈和队列是比较特殊的线性表&#xff0c;又称之为访问受限的线性表。栈是很多表达式、符号等运算的基础&#xff0c;也是递归的底层实现。理论上递归能做的题目栈都可以&#xff0c;只是有…

NLog详解

目录 1.简介 2.项目中使用NLog 2.1 快速使用NLog 2.2 通过配置文件使用NLog 3.NLog配置参数详解 3.1 全局配置 3.2 根元素 3.2.1 targets 3.2.1.1 layout 3.2.2 rules 3.2.3 extensions 3.2.4 include 3.2.5 variable 4.附录 1.简介 NLog是一个基于.NET平台编写…

【C++代码】分糖,分饼干,摇摆序列,贪心算法--代码随想录

贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。靠自己手动模拟&#xff0c;如果模拟可行&#xff0c;就可以试一试贪心策略&#xff0c;如果不可行&#xff0c;可能需要动态规划。贪心算法一般分为如下四步&#xff1a; 将问题分解为若干个子问题找出适合的…

Shell 邮件发送告警测试

1.先编辑mail配置文件 #cat /etc/mail.rc#开启ssl set ssl-verifyignore#证书目录&#xff0c;下方为centos系统证书默认位置&#xff0c;也自行生成证书并指定 set nss-config-dir/etc/pki/nssdb# 配置的第三方smtp服务器的地址及端口 set smtpsmtps://smtp.163.com:465 # 认…