[量化投资-学习笔记007]Python+TDengine从零开始搭建量化分析平台-布林带

布林带(Bollinger Bands)也称为布林通道、保力加通道,是由约翰·布林格(John Bollinger)发明的技术分析指标。布林通道通常被用来确认资产价格波动范围。

布林通道是由三条平滑的曲线组成的趋势线图表,中线为均线,上/下线为中线±2个标准差。

在上一个章节没有自己造轮子,直接使用 Pandas 函数计算 MACD,非常方便的实现了计算和绘图。

本次使用更快捷的方式,直接上飞机:使用 AI 来写代码。

我在上篇文章《利用AI快速跨过新手区:用DevChat编写Python程序》 介绍了如何使用 DevChat 编写程序。

这次直接借助 DevChat 来编写布林带并绘图。

目录

  • AI 编程
  • 程序优化
  • 进阶
  • 题外话

AI 编程

在这里插入图片描述

因为数据源来源不一致,对程序进行修改,直接套用之前的代码。

import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import requests
import json
from requests.auth import HTTPBasicAuth
import datetime
import numpy as np
import fun

## def global variables
global dbname 
global stbname 
global username
global password
global tdurl
global logfile

dbname = 'trade_data_a'
stbname = 'tdata'
username = 'root'
password = 'taosdata'
## 如果是本地数据库将地址修改为localhost
tdurl = 'http://10.7.7.14:6041/rest/sql/trade_data_a?tz=Asia/Shanghai'
logfile = 'error.log'

##SQL
st = '2022-06-01'
et = '2022-10-01'
sql = 'select tdate,close from trade_data_c.tdata where fcode="000001" and tdate>="'+st+'" and tdate<="'+et+'"'

## Get data to DataFrame
def request_get_d(resInfo):
    load_data = json.loads(resInfo)
    data = load_data.get("data")
    df = pd.DataFrame(data)
    df.rename(columns={0:'tdate',1:'close'},inplace=True)
    return df

if __name__ == '__main__':
    # 指定默认字体
    matplotlib.rcParams['font.sans-serif'] = ['SimHei']
    matplotlib.rcParams['font.family']='sans-serif'
    # 解决保存图像是负号'-'显示为方块的问题
    matplotlib.rcParams['axes.unicode_minus'] = False    
    rt = fun.request_post(tdurl,sql,username,password)
    scode = fun.check_return(rt)
    if scode != 'error':
        df = request_get_d(rt)
# 计算20日移动平均线、标准差、布林上线和布林下线
        df['20日MA'] = df['close'].rolling(window=20).mean()
        df['20日STD'] = df['close'].rolling(window=20).std()
        df['布林上线'] = df['20日MA'] + (df['20日STD'] * 2)
        df['布林下线'] = df['20日MA'] - (df['20日STD'] * 2)

# 绘制布林带
        df[['close','20日MA','布林上线','布林下线']].plot(figsize=(12,6))
        plt.title('平安银行布林带')
        plt.ylabel('价格 (人民币)')
        plt.show()

运行脚本,图形可以正常绘制,但是中文显示有问题。不过不急,直接问AI。
在这里插入图片描述

在这里插入图片描述
修改后图形就显示正常了。

在这里插入图片描述

程序优化

利用 DevChat 对程序进行进一步优化:

import pandas as pd
import matplotlib.pyplot as plt
import requests
import json
from matplotlib import font_manager

# Global variables
DB_NAME = 'trade_data_a'
STB_NAME = 'tdata'
USERNAME = 'root'
PASSWORD = 'taosdata'
TD_URL = 'http://10.7.7.14:6041/rest/sql/trade_data_a?tz=Asia/Shanghai'
LOG_FILE = 'error.log'

# Constants
START_DATE = '2022-06-01'
END_DATE = '2022-10-01'
SQL = f'select tdate,close from trade_data_c.tdata where fcode="000001" and tdate>="{START_DATE}" and tdate<="{END_DATE}"'

# Specify default font
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.family'] = 'sans-serif'

# Resolve issue with negative numbers being displayed as a square
plt.rcParams['axes.unicode_minus'] = False


def request_get_d(resInfo):
    load_data = json.loads(resInfo)
    data = load_data.get("data")
    df = pd.DataFrame(data)
    df.rename(columns={0: 'tdate', 1: 'close'}, inplace=True)
    return df


if __name__ == '__main__':
    rt = fun.request_post(TD_URL, SQL, USERNAME, PASSWORD)
    scode = fun.check_return(rt)
    
    if scode != 'error':
        df = request_get_d(rt)
        # Calculate 20-Day Moving Average, Standard Deviation, Upper Band and Lower Band
        df['20 Day MA'] = df['close'].rolling(window=20).mean()
        df['20 Day STD'] = df['close'].rolling(window=20).std()
        df['Upper Band'] = df['20 Day MA'] + (df['20 Day STD'] * 2)
        df['Lower Band'] = df['20 Day MA'] - (df['20 Day STD'] * 2)
        # Draw Bollinger Bands
        df[['close', '20 Day MA', 'Upper Band', 'Lower Band']].plot(figsize=(12, 6))
        plt.title('Ping An Bank Bollinger Bands')
        plt.ylabel('Price')
        plt.show()

别的不说,起码看上去挺漂亮的。不过有两个小问题:

  1. import fun 被删除了,这是我的一个存储函数的文件,不引用这个,很多自定义函数会报错。
  2. 中文名称变英文了。
    在这里插入图片描述

进阶

直接让 DevChat 编写完整的程序。
在这里插入图片描述
在这里插入图片描述

import taos
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

# 连接到 TDengine 数据库
conn = taos.connect(host='10.7.7.14', user='root', password='taosdata', database='trade_data_c')

# 查询一段时间内的收盘价
query = "select tdate,close from trade_data_c.tdata where fcode='000001' and tdate>= '2022-03-01' AND tdate <= '2023-02-28'"
result = conn.query(query)
df = pd.DataFrame(result.fetch_all(), columns=['Timestamp', 'Close'])
df['Timestamp'] = pd.to_datetime(df['Timestamp'])
df.set_index('Timestamp', inplace=True)

# 计算20日均线和标准差
df['20 Day MA'] = df['Close'].rolling(window=20).mean()
df['20 Day STD'] = df['Close'].rolling(window=20).std()

# 计算布林带上线和下线
df['Upper Band'] = df['20 Day MA'] + (df['20 Day STD'] * 2)
df['Lower Band'] = df['20 Day MA'] - (df['20 Day STD'] * 2)

# 绘制布林带图形
plt.figure(figsize=(12, 6))
plt.plot(df.index, df['Close'], label='Close')
plt.plot(df.index, df['Upper Band'], label='Upper Band')
plt.plot(df.index, df['Lower Band'], label='Lower Band')
plt.title('Bollinger Bands')
plt.xlabel('Timestamp')
plt.ylabel('Price')
plt.legend()
plt.show()

# 提示买卖信号
last_close = df['Close'].iloc[-1]
last_upper_band = df['Upper Band'].iloc[-1]
last_lower_band = df['Lower Band'].iloc[-1]

if last_close > last_upper_band:
    print('做空')
elif last_close < last_lower_band:
    print('做多')
else:
    print('继续观察')

在这里插入图片描述
有一种要失业的预感!!

题外话

布林带或者叫布林通道,顾名思义,绘制了一条以均线为中心,4倍标准差宽度的通道。

和 MACD 一样,布林带依然是对价格趋势的描述,只是相较于 MACD 描述趋势的变化程度,布林带更关注于价格的异常波动。

要搞懂布林带,就需要从定义入手,除了之前提到的均线,另一个重要的概念就是标准差。

标准差是反映一组数据离散程度最常用的一种量化形式,是表示精确度的重要指标。标准差的计算步骤如下:

  1. 求平均:计算数据集中数值的平均值。
  2. 计算每个数值与平均值的差:从每个数值中减去平均值,然后求差的平方。
  3. 求结果的平均:将所有差的平方相加,然后除以数据集中的数值个数,再取平方根。

由此看出,布林带绘制了一条价格变化的通道,在绝大多数情况下,价格会处于通道内,并围绕中线上下波动。

对于单边趋势(如上涨),价格如果突破布林带,说明开始了加速行情。
对于震荡趋势,价格如果突破了布林带,说明要开始回调或突破。

世界上并不存在圣杯和银弹,像盲人摸象一样,任何指标都只能反应市场的一部分,而且计算的过程越复杂,离真是可能越远。

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

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

相关文章

js原型链

什么叫原型链 原型链是js中的核心&#xff0c;原型链将各个属性链接起来&#xff0c;在原型链上面定义&#xff0c;原型链上的其他属性能够使用&#xff0c;原型链就是保证继承 原型链区分 原型链分为显式原型和隐式原型 显式原型&#xff1a;只有函数和构建函数才有显式原型…

CCF CSP认证 历年题目自练Day44

题目一 试题编号&#xff1a; 201612-3 试题名称&#xff1a; 权限查询 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述   授权 (authorization) 是各类业务系统不可缺少的组成部分&#xff0c;系统用户通过授权机制获得系统中各个…

[ACTF2020 新生赛]BackupFile 1

题目环境&#xff1a; 好好好&#xff0c;让找源文件是吧&#xff1f;咱们二话不说直接扫它后台 使用dirsearch工具扫描网站后台&#xff08;博主有这个工具的压缩包&#xff0c;可以私聊我领取&#xff09;python dirsearch.py -u http://0d418151-ebaf-4f26-86b2-5363ed16530…

01-基于IDEA,Spring官网,阿里云官网,手动四种方式创建SpringBoot工程

快速上手SpringBoot SpringBoot技术由Pivotal团队研发制作&#xff0c;功能的话简单概括就是加速Spring程序初始搭建过程和Spring程序的开发过程的开发 最基本的Spring程序至少有一个配置文件或配置类用来描述Spring的配置信息现在企业级开发使用Spring大部分情况下是做web开…

基于机器学习的 ICU 脑血管疾病死亡风险智能预测系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 Wechat / QQ 名片 :) 1. 项目简介 重症患者或重大手术后的患者在重症监护室&#xff08;ICU&#xff09;内通过多种生命支持系统以维持生理功能。患者在ICU 内会被频繁持续的记录生命体征和实验室测量等多种数据。由于高频…

为什么有了MAC地址,还需要IP地址?

解释 搞懂这个问题&#xff0c;首先需要了解交换机的功能 交换机内部有一张MAC地址映射表&#xff0c;记录着MAC地址和端口的对应关系。 如果A要给B发送一个数据包&#xff0c;构造如下格式的数据结构&#xff1a; 到达交换机时&#xff0c;交换机内部通过自己维护的 MAC 地…

b2b.ccb.com:443 需要你的凭据

忙活了一天&#xff0c;晚上回来准备查一下公户的最近的账单。因为昨天晚上熬夜重新做了电脑系统&#xff0c;就下载了建设银行的E路护航&#xff0c;一切安装就绪&#xff0c;准备进入企业网银时&#xff0c;被这些垃圾搞的系统及软件恶心到了&#xff0c;在此记录一下&#x…

Flutter利用GridView创建网格布局实现优美布局

文章目录 简介使用详解导入依赖项创建一个基本的 GridView一些参数说明使用GridView.count来构造 其他控制总结 简介 GridView 是 Flutter 中用于创建网格布局的强大小部件。它允许你在行和列中排列子小部件&#xff0c;非常适合显示大量项目&#xff0c;例如图像、文本、卡片…

js树形数组遍历练习,扁平化、格式化、获取节点父级

1.树形数组扁平化 数组扁平化的方式很多&#xff0c;这里主要是用递归处理&#xff0c;除此之外还有正则、扩展运算符等等 const list [{name:1,id:1,children:[{name:11,id:11,children:[{name:111,id:111}]},{name:12},]},{name:2,id:2,children:[{name:21,id:21,children:…

数据结构-栈和队列(一)

目录 1.栈 1.1 栈的概念及结构 1.2 栈的实现 初始化栈&#xff1a; 入栈&#xff1a; 判空函数&#xff1a; 出栈&#xff1a; 获取栈顶元素&#xff1a; 获取栈中有效元素的个数&#xff1a; 销毁栈&#xff1a; 完整代码&#xff1a; 测试&#xff1a; 2. 队列 …

在 Python 中使用 Selenium 按文本查找元素

我们将通过示例介绍在Python中使用selenium通过文本查找元素的方法。 在 Python 中使用 Selenium 按文本查找元素 软件测试是检查应用程序是否满足用户需求的技术。 该技术有助于使应用程序成为无错误的应用程序。 软件测试可以手动完成&#xff0c;也可以通过某些软件完成。…

解决Docker启动之npm版本不兼容问题

报错内容&#xff1a; npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion1, but package-lock.json was generated for lockfileVersion2. Ill try to do my best with it! npm WARN tar ENOENT: no such file or directory, open /home/wvp-…

ConcurrentHashMap 底层具体实现知道吗?实现原理是什么?

&#xff08;本文引自mic老师文档&#xff09; 之前分享过一期 HashMap 的面试题&#xff0c;然后有个小伙伴私信我说&#xff0c;他遇到了一个 ConcurrentHashMap 的问题不知道怎么回答。 于是&#xff0c;就有了这一期的内容&#xff01;&#xff01; …

Skywalking介绍

一个优秀的项目&#xff0c;除了具有高拓展的架构、高性能的方案、高质量的代码之外&#xff0c;还应该在上线后具备多角度的监控功能。现在企业中的监控服务也有很多&#xff0c;Skywalking除了提供多维度、多粒度的监控之外&#xff0c;也提供了良好的图形化界面以及性能剖析…

Python--- lstrip()--删除字符串两边的空白字符、rstrip()--删除字符串左边的空白字符、strip()--删除字符串右边的空白字符

strip() 方法主要作用&#xff1a;删除字符串两边的空白字符&#xff08;如空格&#xff09; lstrip() 方法 left strip&#xff0c;作用&#xff1a;只删除字符串左边的空白字符 rstrip() 方法&#xff0c;作用&#xff1a;只删除字符串右边的空白字符 strip 英 /strɪp…

Ansible playbook自动化运维工具详解

Ansible playbook自动化运维工具详解 一、playbook的相关知识1.1、playbook 的简介1.2、playbook的 各部分组成 二、基础的playbook剧本编写实例三、 playbook的定义、引用变量3.1、基础变量的定义与引用3.2、引用fact信息中的变量 四、playbook中的when条件判断和变量循环使用…

P02项目诊断报警组件(学习操作日志记录、单元测试开发)

★ P02项目诊断报警组件 诊断报警组件的主要功能有&#xff1a; 接收、记录硬件设备上报的报警信息。从预先设定的错误码对照表中找到对应的声光报警和蜂鸣器报警策略&#xff0c;结合当前的报警情况对设备下发报警指示。将报警消息发送到消息队列&#xff0c;由其它组件发送…

Collection集合 迭代器遍历Iterator 和集合增强For

迭代器遍历Iterator 标准写法: 增强For for(类型 名称 : 集合 ) 举例: 不仅可以集合也可以数组 底层仍然是iterator

设计模式—结构型模式之装饰器模式

设计模式—结构型模式之装饰器模式 适配器是连接两个类&#xff0c;可以增强一个类&#xff0c;装饰器是增强一个类。 向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。属于对象结构型模式。 创建了一个装饰类&#xff0c;用来包装原有的类&#xff0c;并在保…

ZZ308 物联网应用与服务赛题第E套

2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 &#xff08;E卷&#xff09; 赛位号&#xff1a;______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等&#xff1b; 2.竞赛任务中所使用的…