[量化投资-学习笔记001]Python+TDengine从零开始搭建量化分析平台-数据存储

news2025/1/15 3:21:45

目录

    • 0. 简介
    • 1. 获取交易数据
    • 2. 数据库搭建
      • 2.1. 数据库安装
      • 2.2. 创建数据库
      • 2.3. 创建超级表
      • 2.4. 创建子表
    • 3.数据导入
    • 4. Grafana 安装
      • 4.1. 安装Grafana
      • 4.2. 安装TDengine插件
    • 附件
      • 数据导入脚本
      • 历史交易数据-1分钟K线

0. 简介

  • Python:最常用的量化分析语言,不多说。

  • TDengine:时序数据库,存储历史交易数据。
    虽然历史数据的存储用CSV文件、MySQL、PG等都可以,采用 TDengine 作为数据库,主要是考虑交易数据本质上是时序数据,TDengine 作为时序数据块,对时序数据的存储提供了较高的压缩率(比较谁家的磁盘都不赋予,有空间存点有意思的东西不更好),此外 TDengine 还提供了很多的分析函数,虽然在金融领域不如 DolphinDB,但是 DolphinDB 的语法有点让人望而却步,还是 SQL 用起来简单一些。

  • Grafana:绘图工具。Python 的 matplotlib 虽然功能强大,但是用法确实让人望而却步(后期还是要用的)。Grafana 主要用于监控领域,可以绘制非常丰富的图表,正好 TDengine 提供了 Granfana 插件,可以无缝结合。

1. 获取交易数据

这部分就不多说了,网上很多免费的历史数据,大部分是分钟级的。如果想要更多的数据或实时数据,最方便的渠道就是付费。
如果只是自己学习用,就无所谓了。我在本文最后有个网盘的链接,放了一些测试用的交易数据(数据质量不太好,仅供学习用)。

后期补充获取通过接口获取实时交易的方式。

2. 数据库搭建

2.1. 数据库安装

从官网下载最新的安装包,下载地址:
https://docs.taosdata.com/releases/tdengine/

安装很简单,解压缩,运行安装脚本即可。想了解详细安装步骤的可以参考我之前的文档:TDengine3.0 基础操作

注意:自己的主机名千万不能是localhost, 这是 TDengine 安装部署中最大的坑,千万别跳。

安装完成后启动服务:

systemctl start taosd
systemctl start taosadapter

因为我下面的程序使用的是 Restful 方式(不想下载TD的连接器了),因此需要启动 taosadapter 服务。

2.2. 创建数据库

自己学习用,不需要做什么优化,直接默认参数即可。执行 taos 进入操作界面。

create database trade_data_a  wal_retention_period 0;

加上 WAL_RETENTION_PERIOD 0 主要是为了能及时清理 WAL,也可以不加。

2.3. 创建超级表

相比MySQL、PG,TDengine 多了个超级表概念,可以方便的进行数据的聚合。相关介绍见官方文档:https://docs.taosdata.com/concept/

create stable tdata (tdate timestamp,open float,close float,high float,low float,cjl int,cje double,cjjj float) tags(fcode binary(6),fname nchar(20));

taos> describe tdata;
             field              |          type          |   length    |    note    |
=====================================================================================
 tdate                          | TIMESTAMP              |           8 |            |
 open                           | FLOAT                  |           4 |            |
 close                          | FLOAT                  |           4 |            |
 high                           | FLOAT                  |           4 |            |
 low                            | FLOAT                  |           4 |            |
 cjl                            | INT                    |           4 |            |
 cje                            | DOUBLE                 |           8 |            |
 cjjj                           | FLOAT                  |           4 |            |
 fcode                          | VARCHAR                |           6 | TAG        |
 fname                          | NCHAR                  |          20 | TAG        |
Query OK, 10 row(s) in set (0.004054s)

表结构说明:

列名说明
tdate交易时间
open开盘价
close收盘价
high最高价
low最低价
cjl持仓量
cje成交额
cjjj成交均价

标签说明:

标签名说明
fcode股票代码
fname股票名称

2.4. 创建子表

子表也是 TDengine 独有的概念,子表属于超级表,和超级表具有相同的表结构,通过标签来进行区分。
我设计是每只股票一个子表,表名称用 t_+股票代码 保证唯一性。标签有两个,分别是股票代码和股票名称。

由于子表数据比较多,使用脚本进行批量创建。

for ff in $(cat filelist)
do
    fcode=$(echo $ff|awk -F '_' '{print $1}')
    fname=$(echo $ff|awk -F '_' '{print $2}')
    tbname=$(echo "t_${code}")
    echo "create table trade_data_a.${tbname} using trade_data_a.tdata tags('${fcode}','${fname}')" >> create_tb.sql
done

taos -f create_tb.sql

说明:

  1. 示例数据都是每支股票单独一个CSV文件,文件名称为:股票代码_股票名称.csv
  2. taos -f filename 可以将sql 直接导入到数据库执行。

创建的子表如下:

taos> select distinct tbname,fcode,fname from tdata;
             tbname             |  fcode   |             fname              |
=============================================================================
 t_000001                       | 000001   | 平安银行                       |
 t_000004                       | 000004   | ST国华                         |
 t_000009                       | 000009   | 中国宝安                       |
 t_000014                       | 000014   | 沙河股份                       |
 t_000017                       | 000017   | 深中华A                        |
 t_000019                       | 000019   | 深粮控股                       |
 t_00001                        | 00001    | 长和                           |
 t_000020                       | 000020   | 深华发A                       |
 t_000021                       | 000021   | 深科技                         |
 t_000023                       | 000023   | 深天地A                       |
 t_000026                       | 000026   | 飞亚达                         |
 t_000027                       | 000027   | 深圳能源                       |
 t_000029                       | 000029   | 深深房A                       |
 t_000032                       | 000032   | 深桑达A                       |
 t_000034                       | 000034   | 神州数码                       |
 t_000037                       | 000037   | 深南电A                        |
 t_000039                       | 000039   | 中集集团                       |
 t_00003                        | 00003    | 香港中华煤气                   |
 t_000045                       | 000045   | 深纺织A                       |
 t_000048                       | 000048   | 京基智农                       |

3.数据导入

测试数据是按照每只股票一个CSV文件分布的,例如平安银行数据如下:

code,tdate,open,close,high,low,cjl,cje,cjjj
000001,2023-02-01 09:30:00,15.03,15.03,15.03,15.03,3601.0,5412300.0,15.03
000001,2023-02-01 09:31:00,15.03,14.97,15.08,14.95,19919.0,2.98901E7,15.01
000001,2023-02-01 09:32:00,14.97,15.03,15.05,14.97,7600.0,1.14196E7,15.014
000001,2023-02-01 09:33:00,15.03,15.02,15.03,15.0,3767.0,5654120.0,15.013
000001,2023-02-01 09:34:00,15.01,15.01,15.02,15.0,5175.0,7767050.0,15.013

为了高效的写入数据,采用 TDengine 推荐的多进程+拼 SQL 方式写入(其实如果采用stmt方式,速度更快。不过需要安装taos客户端和taospy连接器)。

  1. 批量读取 CSV 文件
    使用 Pandas 的 read_csv 函数将CSV文件导入 DataFrame 中。
    def csv_read(filename): 
     print("Reading {} ......".format(filename))
     data = pd.read_csv(filename,index_col=False,dtype={'code':str,'tdate':str,'open':float,'close':float,'high':float,'low':float,'cjl':int,'cje':float,'cjjj':float})
     split_data(data)
     print("Import {} done!".format(filename))
    
  2. 将 CSV 导入数组,批量拼 SQL
    为了高效写入,将多条数据拼接到一个SQL中,我设置了每2000条记录拼成1条SQL(TDengine 要求单条 SQL 不能超过1MB)。
    def export_sql(dbname,tbname,idata):
    exsql = 'insert into '
    for index,row in idata.iterrows():
        exsql = exsql + dbname +'.t_' + idata.loc[index,"code"] + ' values ('
        ts = int(time.mktime(time.strptime(idata.loc[index,"tdate"], "%Y-%m-%d %H:%M:%S"))*1000)
        exsql = exsql + str(ts) + ','
        exsql = exsql + str(idata.loc[index,"open"]) + ','
        exsql = exsql + str(idata.loc[index,"close"]) + ','
        exsql = exsql + str(idata.loc[index,"high"]) + ','
        exsql = exsql + str(idata.loc[index,"low"]) + ','
        exsql = exsql + str(idata.loc[index,"cjl"]) + ','
        exsql = exsql + str(idata.loc[index,"cje"]) + ','
        exsql = exsql + str(idata.loc[index,"cjjj"]) + ') '
    exsql = exsql + ';'
    return exsql
    
  3. 通过 Restful 方式写入数据库
    使用 Restful 方式写入数据,好处是不需要安装客户端和连接器,坏处就是写入效率没有那么高,数据库那边还需要启动taosadapter服务。
    def request_post(url, sql, user, pwd):
    try:
        sql = sql.encode("utf-8")
        headers = {
            'Connection': 'keep-alive',
            'Accept-Encoding': 'gzip, deflate, br'
        }
        result = requests.post(url, data=sql, auth=HTTPBasicAuth(user,pwd),headers=headers)
        text=result.content.decode()
        return text
    except Exception as e:
        print(e)
    

完整代码在本文最后。

脚本使用方法:

#进入数据目录
cd 202311
#生成文件列表
ls > file_list
#执行python脚本
python3 Imprort_csv.py

错误日志会写入当前文件夹的 import_error.log 日志文件中。

我导入了 8 个月的交易数据,占用空间 3GB 左右,看一下压缩率:

taos> show table distributed tdata\G;
*************************** 1.row ***************************
_block_dist: Total_Blocks=[202195] Total_Size=[3038805.57 KB] Average_size=[15.03 KB] Compression_Ratio=[22.58 %]
*************************** 2.row ***************************
_block_dist: Total_Rows=[344493995] Inmem_Rows=[15183] MinRows=[241] MaxRows=[2648] Average_Rows=[1703]
*************************** 3.row ***************************
_block_dist: Total_Tables=[9037] Total_Files=[52] Total_Vgroups=[2]

因为都是float类型,压缩率不是很高,大概压了1/5。TDengine 3.2 支持了float/double 的有损压缩,压缩率应该会更高,我现在用的是 3.1。

4. Grafana 安装

4.1. 安装Grafana

Grafana 安装直接参考官网即可。下载地址:https://grafana.com/grafana/download?edition=enterprise

sudo apt-get install -y adduser libfontconfig1 musl
wget https://dl.grafana.com/enterprise/release/grafana-enterprise_10.1.5_amd64.deb
sudo dpkg -i grafana-enterprise_10.1.5_amd64.deb

4.2. 安装TDengine插件

  1. 设置变量,因为我没有修改用户名、密码,且在数据库同一服务器上部署,设置变量如下:
export TDENGINE_TOKEN="Basic cm9vdDp0YW9zZGF0YQ=="
export TDENGINE_URL="http://localhost:6041"
  1. 下载安装脚本并安装。
bash -c "$(curl -fsSL https://raw.githubusercontent.com/taosdata/grafanaplugin/master/install.sh)"
  1. 重启 Grafana 服务
sudo systemctl restart grafana-server.service
  1. 配置数据源
    以上脚本默认已经安装了数据源,如果需要添加新的数据源,可以参考官方文档

  2. 配置展示界面
    简单画两张图,验证一下系统联通性。

每日振幅:最高价-最低价

select _wstart,max(high)-min(low) from trade_data_a.tdata where fcode='000001' and tdate>=$from and tdate<$to interval(1d)

在这里插入图片描述
在这里插入图片描述

附件

数据导入脚本

链接:https://pan.baidu.com/s/1zqCCZjoXdgCPgrEaw67XOw
提取码:lnyu

历史交易数据-1分钟K线

链接:https://pan.baidu.com/s/1SUKhde7avpwQiJjH1olOyg
提取码:p4zv

数据来自网络,不保证准确性。

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

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

相关文章

【超参数研究02】使用随机搜索优化超参数

一、说明 在神经网络训练中&#xff0c;超参数也是需要优化的&#xff0c;然而在超参数较多&#xff08;大于3个&#xff09;后&#xff0c;如果用穷举的&#xff0c;或是通过经验约摸实现就显得费时费力&#xff0c;无论如何&#xff0c;这是需要研究、规范、整合的要点&#…

【自用】知识点梳理 自动控制第Z章 离散s

目录标题 离散XXXQ1 离散化的表达式和传递函数怎么匹配上&#xff1f; 离散系统的分析与校正Q ZOH有什么作用K ZOH的Z变换✨K Z变换表格模拟化矫正ZOH的等效Q 为什么离散化之后幅值会变化&#xff1f;Q 模拟化校正中ZOH环节为什么需要等效成惯性环节&#xff1f; 离散化的方法Q…

Android dumpsys介绍

文章目录 一、需求二、环境三、相关概念3.1 dumpsys3.2 Binder3.3 管道 四、dumpsys指令的使用4.1 dumpsys使用4.2 dumpsys指令语法 五、详细设计5.1 dumpsys流程图5.2 dumpsys查看电池信息5.2.1 dumpsys battery指令5.2.2 service->dump打印函数 5.3 dumpsys源码分析5.3.1 …

[support2022@cock.li].faust、[tsai.shen@mailfence.com].faust勒索病毒数据怎么处理|数据解密恢复

引言&#xff1a; 威胁网络安全的恶意软件不断涌现&#xff0c;而[support2022cock.li].faust勒索病毒则是其中的一员。这个网络黑暗角落的新星&#xff0c;以其数据绑架的方式&#xff0c;一度成为数据安全的威胁焦点。本文将探究[support2022cock.li].faust勒索病毒的运作方…

Cypress的安装与启动

目录 一&#xff1a;Cypress介绍 二&#xff1a;安装与使用 1、下载node.js 2、安装Cypress 3、启动Cypress 3、解决异常 三&#xff1a;总结 一&#xff1a;Cypress介绍 Cypress 是为现代网络而构建的下一代前端测试工具&#xff0c;用于解决开发者和 QA 工程师在测试现…

【Hydro】水文模型比较框架MARRMoT - 包含47个概念水文模型的Matlab代码

目录 说明源代码运行实例workflow_example_1.mworkflow_example_2.mworkflow_example_3.mworkflow_example_4.m 测试1、 结构体兼容性问题2、append的兼容性问题3、修改后的MARRMoT_model.m 说明 MARRMoT是一个新的水文模型比较框架&#xff0c;允许不同概念水文模型结构之间的…

BandZip 免费纯净快速的文件压缩/解压缩软件

BandZip 功能齐全、性能优异的免费文件压缩和解压缩工具。版本 7.x 及以上有广告&#xff0c;安装 7.x 以下版本即可。 功能以及特性 支持多种常见的压缩格式&#xff0c;包括 ZIP、RAR、7Z、TAR 等&#xff1b;高效的压缩算法&#xff0c;能够将文件压缩到较小的体积&#…

【网络安全 --- 任意文件下载漏洞(1)】任意文件下载漏洞

一&#xff0c;环境&#xff0c;工具准备 1-1 VMVare 16 虚拟机及下载安装&#xff08;资源&#xff09; 请参考以下博客安装&#xff08;特详细&#xff09;&#xff1a;【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;-CSDN博客【网络安…

vue2vue3--render函数(h)

目录 h函数 方法1. 在Options API中的使用 方法2. 在Composition API中的使用 Vue 2中的渲染函数 ​基础​ vue2 vue3 vue3--声明渲染函数 节点、树以及虚拟 DOM ​虚拟 DOM​ createElement 参数 深入数据对象 约束 vue2 vue3 使用 JavaScript 代替模板功能…

使用cpolar内网穿透实现远程Stackedit Markdown编辑器

文章目录 1. docker部署Stackedit2. 本地访问3. Linux 安装cpolar4. 配置Stackedit公网访问地址5. 公网远程访问Stackedit6. 固定Stackedit公网地址 StackEdit是一个受欢迎的Markdown编辑器&#xff0c;在GitHub上拥有20.7k Star&#xff01;&#xff0c;它支持将Markdown笔记保…

库克嘴上说着共赢,实际却是降低中国制造占比,外媒:真是老狐狸

近期库克再度访华&#xff0c;在成都的苹果线下零售店与消费者密切互动&#xff0c;参观立讯精密并表示与中国制造合作共赢&#xff0c;然而日本媒体拆解iPhone15却撕下了苹果的遮羞布&#xff0c;库克真的是老狐狸。 一直以来&#xff0c;苹果CEO库克都积极向中国消费者释放善…

《java核心卷Ⅰ》知识点总结(可作面试题)

&#x1f6eb; JDK和JRE傻傻分不清?&#x1f6eb; HelloWorld的输出都经历了啥&#xff1f;&#x1f6eb; Java的三个版本都是啥&#xff1f;&#x1f6eb; 关于main方法你都知道啥&#xff1f;main方法被声明为private会怎样&#xff1f;&#x1f6eb; 强制and自动类型转换都…

使用whatweb和python批量获取指纹信息

该程序去除了whatweb输出的一些乱码 import sys import os from pathlib import Path if __name__ "__main__":type sys.stdout.encoding file1Path("out.txt")if file1.is_file():os.remove("out.txt")os.system("whatweb -i url.txt -…

Flutter页面滑动回调处理解决方法

文章目录 TabBarViewTabBarView简介TabBarView详细介绍 TabBarView滑动时如何处理事务例子 PageControllerPageController介绍PageController 的详细介绍 TabBarView TabBarView简介 TabBarView 是 Flutter 中的一个用于显示选项卡视图的小部件。它通常与 TabBar 一起使用&am…

Vue 实战项目(智慧商城项目): 完整的订单购物管理功能 内涵资源代码 基于Vant组件库 Vuex态管理 基于企业级项目开发规范

鹏鹏老师的实战开发项目 智慧商城项目 接口文档&#xff1a;安全问题&#xff08;需要私信即可&#xff09; 演示地址&#xff1a;跳转项目地址 01. 项目功能演示 1.明确功能模块 启动准备好的代码&#xff0c;演示移动端面经内容&#xff0c;明确功能模块 在这里插入图…

腾讯云SSH连接不上的一个解决办法

最近在购买完腾讯云服务器后Xshell登录时老是报出Connection failed问题&#xff0c;最后发现问题所在。 解决方法 本人购买的是校园套餐中的轻量应用服务器2核2G&#xff0c;购买完以后打开控制台 在轻量级云服务器中找到自己购买的云服务器后&#xff0c;重置密码&#xff0…

【JavaEE初阶】 CAS详解

文章目录 &#x1f332;什么是 CAS&#x1f6a9;CAS伪代码 &#x1f38b;CAS 是怎么实现的&#x1f333;CAS的应用&#x1f6a9;实现原子类&#x1f6a9;实现自旋锁 &#x1f384;CAS 的 ABA 问题&#x1f6a9;什么是 ABA 问题&#x1f6a9;ABA 问题引来的 BUG&#x1f6a9;解决…

Spring Boot实战 | 如何整合高性能数据库连接池HikariCP

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…

MySql第三篇---索引的创建与设计原则

文章目录 MySql第三篇---索引的创建与设计原则索引的声明与使用索引的分类创建索引在已经存在的表上创建索引删除索引 索引的设计原则哪些情况适合创建索引&#xff1f;限制索引的数目哪些情况不适合创建索引&#xff1f; 小结 MySql第三篇—索引的创建与设计原则 索引的声明与…

如何安装Ubuntu20.04(详细图文教程

目录 一.简介 二、需要资源 三、window设置 1、分区 2、启动盘制作 四、ubuntu安装 一.简介 Linux是一种自由和开放源代码的操作系统内核&#xff0c;被广泛应用于各种计算机系统中。它以稳定性、安全性和灵活性而闻名&#xff0c;并成为服务器、嵌入式设备和个人计算机…