[量化投资-学习笔记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 如下:

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java八股文(基础篇)

面向过程和面向对象的区别 面向过程&#xff1a;在解决问题时&#xff0c;特别自定义函数编写一步一步的步骤解决问题。 面向对象&#xff1a;其特点就是 继承&#xff0c;多态&#xff0c;继承&#xff0c;在解决问题时&#xff0c;不再注重函数的编写&#xff0c;而在于注重…

这么理解矩阵乘法,让你吊打面试官

大家好啊&#xff0c;我是董董灿。 很多与深度学习算法相关的面试&#xff0c;面试官可能都会问一个问题&#xff0c;那就是你是如何理解矩阵乘算法的。 更有甚者&#xff0c;会让你当场手写矩阵乘算法&#xff0c;然后问细节&#xff0c;问如何优化&#xff0c;面试现场&…

治疗红斑性肢痛症的【Chromocell】申请870万美元纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于美国的生物制药公司Chromocell Therapeutics Corporation&#xff08;简称&#xff1a;Chromocell&#xff09;近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#x…

VM搭建虚拟机2(自定义安装)

文章目录 自定义安装选择你的centos下载目录设置用户名密码自定义安装目录注意&#xff0c;尽量别再同一位置安装虚拟机设置处理器数量内存根据所需配置&#xff08;默认1G&#xff09;NAT按需设置磁盘大小点击完成即可等待安装即可 VMware、centos、典型安装 自定义安装 选择你…

【机器学习(二) 线性代数基础I(Linear Algebra Foundations)】

机器学习&#xff08;二&#xff09; 线性代数基础I&#xff08;Linear Algebra Foundations) 这一节主要介绍一些线性代数的基础。 目录 机器学习&#xff08;二&#xff09; 线性代数基础I&#xff08;Linear Algebra Foundations)1. 向量 Vectors2. 复杂度 Complexity3.线…

【Linux】第七站:vim的使用以及配置

文章目录 一、vim1.vim的介绍2.vim基本使用3.vim的命令模式常用命令4.底行模式 二、vim的配置 一、vim 1.vim的介绍 vim编辑器&#xff0c;用来文本编写&#xff0c;可以写代码 它是一个多模式的编辑器 它有很多的模&#xff0c;不过我们暂时先只考虑这三种模式 命令模式插入模…

2023年阿里云双11有什么优惠活动?详细攻略来了!

随着双十一的临近&#xff0c;阿里云也正式开启了双11大促&#xff0c;推出了“金秋云创季”活动&#xff0c;那么&#xff0c;2023年阿里云双11的优惠活动究竟有哪些呢&#xff1f;本文将为大家详细介绍。 一、阿里云双11活动时间 1、2023年10月27日-2023年10月31日&#xff…

洛谷 B2009 计算 (a+b)/c 的值 C++代码

目录 题目描述 AC Code 切记 题目描述 题目网址&#xff1a;计算 (ab)/c 的值 - 洛谷 AC Code #include<bits/stdc.h> using namespace std; int main() {int a,b,c;cin>>a>>b>>c;cout<<(ab)/c<<endl;return 0; } 切记 不要复制题…

[论文阅读]Ghost-free High Dynamic Range Imaging with Context-aware Transformer

Ghost-free HDRI with Context-aware Transformer 背景介绍已有算法本文算法实验对比 背景介绍 高动态范围成像&#xff08;HDR&#xff09;是一种图像技术&#xff0c;它能够捕捉到比传统图像更广泛的亮度范围。1997年&#xff0c;Paul Debevec在他的论文《Recovering High D…

Netty复习:(2)IdleStateHandler的用法

一、handler定义&#xff1a; package handler;import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter;public class MyChatServerHandler3 extends ChannelInboundHandlerAdapter {Overridepublic void userEventTriggered(…

第N个斐波那契数列

第N个斐波那契数列 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 class Solution { public:int tribonacci(int n) {int a[4]{0,1,1,2};if(n<4) return a[n];int kn-3;for(int i0; i<k;i){int tmpa[3];a[3]a[1]a[2]a[3];//不是【0】开始&…

从零开始搭建Prometheus+grafana服务器组件监控系统

服务器及相关组件监控 本文档主要记录了常用企业级服务器及各种组件的监控手段和监控部署方案&#xff0c;使企业可以实时感知服务器组件的健康状态&#xff0c;并在服务器或组件出现异常时及时做出反应。 本方案采用的Prometheusgrafana的方式实现对服务器及各种组件的监控&am…

CentOS 搭建本地 yum 源方式 安装 httpd 服务

CentOS 搭建本地 yum 源方式 安装 httpd 服务 修改 yum 源 挂载光驱 mkdir -p /mnt/cdrom mount /dev/cdrom /mnt/cdromvi /etc/fstab追加以下内容&#xff1a; /dev/cdrom /mnt/cdrom iso9660 defaults 0 0手动修改CentOS-Base.repo 备份 yum 源配置文件 mv /etc/yum.re…

06 MIT线性代数-线性无关,基和维数Independence, basis, and dimension

1. 线性无关 Independence Suppose A is m by n with m<n (more unknowns than equations) Then there are nonzero solutions to Ax0 Reason: there will be free variables! A中具有至少一个自由变量&#xff0c;那么Ax0一定具有非零解。A的列向量可以线性组合得到零向…

ubuntu PX4 vscode stlink debug设置

硬件 stlink holybro debug板 pixhawk4 安装openocd 官方文档&#xff0c;但是第一步安装建议从源码安装&#xff0c;bug少很多 github链接 编译安装&#xff0c;参考 ./bootstrap (when building from the git repository)./configure [options]makesudo make install安装后…

CentOS 7 安装和配置java环境

1 安装包准备 安装包可以通过下面地址进行版本选择安装&#xff1a; https://www.oracle.com/java/technologies/downloads/#java8 2 正式开始安装 本次分享的安装方法直接通过编辑/etc/profile文件实现java的安装 2.1 新建安装包存放目录 mkdir /java cd /java/ 2.2 解压安…

【音视频|PCM】PCM格式详解

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

javascript数据类型

目录 原始数据类型 引用数据类型 类型检测 类型转换 总结 原始数据类型 JavaScript 中有六种原始数据类型&#xff0c;它们是&#xff1a; Undefined&#xff08;未定义&#xff09;: 表示一个未被赋值的变量。Null&#xff08;空值&#xff09;: 表示一个空对象指针。B…

SpringBoot 公司推广系统 公司广告系统

SpringBoot 公司推广系统 公司广告系统 系统功能 首页功能: 广告展示 方案列表 站内搜索 资讯 查看详细咨询 登录注册 收藏 咨询方案 在线客服实时聊天 后台管理功能: 系统管理分为: 用户管理 角色管理 客户管理 首页轮播管理 公告管理 方案管理: 方案管理 资讯管理: 类型管…

打包个人项目成python算法包

*免责声明&#xff1a; 1\此方法仅提供参考 2\搬了其他博主的操作方法,以贴上路径. 3* 场景一: 使用conda pack进行打包个人项目 场景二: … 场景一: 使用conda pack进行打包个人项目 1.1 导出包列表 activate jiancepip list --formatfreeze >requirements.txt 1.…