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

news2024/12/30 2:49:19

布林带(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. 求结果的平均:将所有差的平方相加,然后除以数据集中的数值个数,再取平方根。

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

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

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

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

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

相关文章

HDPE双壁波纹管存在缺点,在选择使用时需要根据实际情况进行考虑

惠洁友情提醒HDPE双壁波纹管脆性较大&#xff1a;HDPE双壁波纹管的脆性较大&#xff0c;容易受到冲击和碰撞的影响&#xff0c;如果使用过程中出现破损或裂缝&#xff0c;可能会影响到其密封性能和使用寿命。 对温度敏感&#xff1a;HDPE双壁波纹管的性能受温度影响较大&#…

安全测试,接口返回内容遍历~

最近公司被人大量爬取数据&#xff0c;查了一下发现&#xff0c;用户主页接口&#xff0c;没有加用户登录校验&#xff0c;返回了用户的敏感信息有手机号和邮箱&#xff0c;其实这个接口是用不到这些信息的。再加上用户id是自增长的&#xff0c;所以很容易被别人爬取。 既然这…

【milkv】添加LCD屏GC9306

前言 本章介绍如何添加LCD屏GC9306驱动。 电路图 dts build\boards\cv180x\cv1800b_milkv_duo_sd\dts_riscv\cv1800b_milkv_duo_sd.dts &spi2 {status "okay";/delete-node/ spidev0;gc9306: gc93060{compatible "sitronix,gc9306";reg <0&g…

[PHP]得推跑腿O2O系统 v3.41

得推跑腿系统是一个以phpMySQL进行开发的主要针对本地跑腿服务的O2O系统&#xff0c;支持wap\\小程序\\App。 主要功能模块&#xff1a; 用户端&#xff1a; 1.跑腿任务发布 2.跑腿任务管理追踪 3.在线支付 4.常用地址管理 跑腿端&#xff1a; 1.跑腿任务抢单 2.跑腿员认证 3.…

Win11 Edge浏览器进入朔日考试系统(无纸化测评系统)的方法

Win11 Edge浏览器进入朔日考试系统&#xff08;无纸化测评系统&#xff09;的方法 笔记本型号&#xff1a;联想 使用浏览器&#xff1a;edge浏览器 操作系统&#xff1a;Windows11 网址&#xff1a;http://172.31.0.139/WZHEDU/ 注意:使用此方法打开edge浏览器会频繁出现弹窗&a…

第17章 反射机制

通过本章需要理解反射机制操作的意义以及Class类的作用&#xff0c;掌握反射对象实例化操作&#xff0c;并且可以深刻理解反射机制与工厂模式结合意义。掌握类结构反射操作的实现&#xff0c;并且可以通过反射实现类中构造方法、普通方法、成员属性的操作。掌握反射机制与简单J…

19.13 Boost Asio 发送TCP流数据

Boost框架中默认就提供了针对TCP流传输的支持&#xff0c;该功能可以用来进行基于文本协议的通信&#xff0c;也可以用来实现自定义的协议。一般tcp::iostream会阻塞当前线程&#xff0c;直到IO操作完成。 首先来看服务端代码&#xff0c;如下所示在代码中首先通过GetFileSize…

2023.11.08 homework

小学五年级数学

Vim编辑器学习

B站学习vim指令链接 1&#xff1a;vim下有两种模式&#xff0c;一种是命令模式&#xff0c;一种是编辑模式 2&#xff1a;命令到编辑模式&#xff0c;按键盘i&#xff0c;编辑到命令格式按Esc 3&#xff1a;&#xff1a;wq 保存并退出 &#xff1a;wq code.c保存并把文件命名为…

【机器学习基础】机器学习概述

目录 前言 一、机器学习概念 二、机器学习分类 三、机器学习术语 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x…

Mysql数据库 11.SQL语言 储存过程 下 储存过程管理和游标

一、存储过程管理 1.查询存储过程 查询所有储存过程 语法 show procedure status; 代码实现 #查询存储过程 show procedure status; 运行结果 加入条件查询储存过程 语法 show procedure status where db储存过程名; 代码实现 #查询带有条件的储存过程 查询名字为pro…

第五届泰迪杯数据分析技能赛B题源码图片分享

需要B题源码以及第六届带队”指导“请私信本人&#xff0c;团队包含技能赛双一等&#xff0c;数学建模省一&#xff0c;泰迪杯挖掘国一&#xff0c;研究生队友。 去年一等作品可视化图如下&#xff0c;私信获取源码

clickhouse通过java jdbc实现增删改查,保姆级教程

一、clickhouse是一款开源的用于在线分析处理查询(OLAP :Online Analytical Processing)MPP架构的列式存储数据库。 二、clickhouse可以做用户行为分析&#xff0c;流批一体 三、我们现在用java通过jdbc的方式来操作clickhouse 四、先安装clickhouse&#xff0c;安装资料自行…

长春理工大学漏洞报送证书

获取来源&#xff1a;edusrc&#xff08;教育漏洞报告平台&#xff09; url&#xff1a;主页 | 教育漏洞报告平台 兑换价格&#xff1a;10金币 获取条件&#xff1a;提交长春理工大学任意中危或以上级别漏洞

尚硅谷大数据项目《在线教育之实时数仓》笔记007

视频地址&#xff1a;尚硅谷大数据项目《在线教育之实时数仓》_哔哩哔哩_bilibili 目录 第9章 数仓开发之DWD层 P053 P054 P055 P056 P057 P058 P059 P060 P061 P062 P063 P064 P065 第9章 数仓开发之DWD层 P053 9.6 用户域用户注册事务事实表 9.6.1 主要任务 读…

kafka笔记要点和集群安装、消息分组、消费者分组以及与storm的整合机制

kafka笔记 1/kafka是一个分布式的消息缓存系统 2/kafka集群中的服务器都叫做broker 3/kafka有两类客户端&#xff0c;一类叫producer&#xff08;消息生产者&#xff09;&#xff0c;一类叫做consumer&#xff08;消息消费者&#xff09;&#xff0c;客户端和broker服务器之间…

SAP BASIS SET_PARAMETER_ID_TOO_LONG

ji 原因 DATA:curvbelnid(40) TYPE c,"问题在这里curposnrid(40) TYPE c. "问题在这里curvbelnid sy-uname && VN.curposnrid sy-uname && PR.SET PARAMETER ID curvbelnid FIELD i_vbeln . SET PARAMETER ID curposnrid FIELD i_posnr . 改成 D…

【Proteus仿真】【STM32单片机】汽车尾灯控制设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用按键、LED模块等。 主要功能&#xff1a; 系统运行后&#xff0c;系统运行后&#xff0c;系统开始运行&#xff0c;K1键控制左转向灯&#xff…

web前端-Gulp入门

web前端-Gulp入门 gulp的概述使用gulp准备工作gulp的常用APIgulp的常用插件gulpfile.js的初体验打包css文件打包scss文件打包js打包html打包images创建一个默认任务创建一个删除任务gulp启动服务创建一个监控任务 gulp的概述 gulp&#xff1a; 前端自动化打包固件工具&#xf…

uniapp在不需要后端数据的情况下 怎么记录用户进一次记录一次

目录 前言&#xff1a; html部分 js部分 完整代码 前言&#xff1a; 一时兴起&#xff0c;不喜勿喷&#xff0c;今天听到了这个问题想到了一个方法&#xff0c;解决方式如下。 html部分 他用于显示访问次数&#xff08;visitCount变量的值&#xff09;。 <template&…