当前位置: 首页 > news >正文

【量化交易笔记】3.实现数据库保存数据

上一节,我们通过下载相关的 pandas 数据保存为 本地csv文件,这一节将上节的数据以数据库方式保存。

数据库保存

采集数据部分前一节已做说明,这里就直接用采用前面的内容。这里着重说明的事数据库连接。对与 python 相连接的数据库有很多,作为开放操作性及性能首选 mysql 。(MYSQL的安装这里不做说明),在使用之前,需要安装一个pymysql库,如果没有安装过,用以下命令进行安装,另外一个库sqlalchemy ,一般是默认安装好的。

库安装
pip install pymysql

定义一个数据库连接函数,返回连接对象,以下并非原创,感觉挺好用的,就引用来的。

数据库的连接
def conn():# 引擎参数信息host = 'localhost'user = 'root'passwd = 'root'port = '3306'db = 'quant'# 创建数据库引擎对象mysql_engine = sqlalchemy.create_engine('mysql+pymysql://{0}:{1}@{2}:{3}'.format(user, passwd, host, port),poolclass=sqlalchemy.pool.NullPool)# 如果不存在数据库db_quant则创建mysql_engine.execute("CREATE DATABASE IF NOT EXISTS {0} ".format(db))# 创建连接数据库db_quant的引擎对象db_engine = sqlalchemy.create_engine('mysql+pymysql://{0}:{1}@{2}:{3}/{4}?charset=utf8'.format(user, passwd, host, port, db),pool_size=80, max_overflow=80, pool_timeout=50)# 返回引擎对象return db_engine

上述代码,已很清晰的表述,返回的是数据库连接对象。
而数据表的有两种形式,一种将所有数据股票数据放在一张表里,好处是读写操作方便,缺点表的记录太大了,读取和写入效率非常低。因此将采取另一种方式,每一支股票一张表,那样的话,数据表大概有4000多,读取效率会很快,数据表名即股票名,例如“600001_sh”。通过to_sql()函数写入数据库。

# 写入数据库
table_name = '{}_{}'.format(code[3:], code[:2])
out_df.to_sql(name=table_name, con=engine, if_exists='replace', index=True, index_label='id')
首次执行

完整代码如下

# 第一次执行
import baostock as bs
import pandas as pd
import gc
import timebs.login()stock_df = bs.query_all_stock().get_data()
# 筛选股票数据,上证和深证股票代码在sh.600000与sz.39900之间
stock_df = stock_df[(stock_df['code'] >= 'sh.600000') & (stock_df['code'] < 'sz.399000')]
bs.logout()
stocks=stock_df['code'].to_list()lg = bs.login()
i=0
#数据库连接
engine = conn()
for code in stocks:    rs = bs.query_history_k_data_plus(code,"date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,isST",start_date='2020-01-01', end_date='2023-3-1', #实际应用开始时间选2000-1-1 或更早frequency="d", adjustflag="1")df=rs.get_data()# 剔除停盘数据if df.shape[0]:df = df[(df['volume'] != '0') & (df['volume'] != '')]# 如果数据为空,则不创建if not df.shape[0]:continue# 删除重复数据df.drop_duplicates(['date'], inplace=True)# 日线数据少于250,则不创建if df.shape[0] < 250:continue# 将数值数据转为float型,便于后续处理convert_list = ['open', 'high', 'low', 'close', 'preclose', 'volume', 'amount', 'turn', 'pctChg']df[convert_list] = df[convert_list].astype(float)#df.to_csv("./data/daily/{0}.csv".format(code), index=False)# 写入数据库table_name = '{}_{}'.format(code[3:], code[:2])df.to_sql(name=table_name, con=engine, if_exists='replace', index=True, index_label='id')i=i+1if i%100==0 :gc.collect()print('已完成',i)time.sleep(2)   
bs.logout()

与上节的代码的区别,增加了数据库连接,将写csv文件修改为写入数据库。

执行完毕,打开数据库查看如下图。
stockdb

日常执行
# 日常执行
import baostock as bs
import pandas as pd
import gc
import time
import datetimetodate=datetime.date.today().strftime('%Y-%m-%d')bs.login()
stock_df =  bs.query_sz50_stocks().get_data() # bs.query_all_stock().get_data()# 筛选股票数据,上证和深证股票代码在sh.600000与sz.39900之间
stock_df = stock_df[(stock_df['code'] >= 'sh.600000') & (stock_df['code'] < 'sz.399000')]
bs.logout()
stock=stock_df['code'].to_list()lg = bs.login()
i=0#数据库连接
engine = conn()for code in stocks:    rs = bs.query_history_k_data_plus(code,"date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,isST",start_date=todate, end_date=todate, #选择当天frequency="d", adjustflag="1")df=rs.get_data()# 剔除停盘数据if df.shape[0]:df = df[(df['volume'] != '0') & (df['volume'] != '')]# 如果数据为空,则不创建if not df.shape[0]:continue# 将数值数据转为float型,便于后续处理convert_list = ['open', 'high', 'low', 'close', 'preclose', 'volume', 'amount', 'turn', 'pctChg']df[convert_list] = df[convert_list].astype(float)#df.to_csv("./data/daily/{0}.csv".format(code), mode='a', index=False, header=False) # 写入数据库table_name = '{}_{}'.format(code[3:], code[:2])df.to_sql(name=table_name, con=engine, if_exists='append', index=True, index_label='id')i=i+1    if i%500==0 :gc.collect()print('已完成',i)time.sleep(2)   
bs.logout()

同样,将首次执行中将日期修改当天日期,写入数据方式,由原来的“repalce”修改为了“append”,以完成追加。

总结

至此,我们用两种方式将数据本地化,有了数据我们就可以进行相关的操作。从下一讲开始介绍数据的相关处理。

相关文章:

【量化交易笔记】3.实现数据库保存数据

上一节&#xff0c;我们通过下载相关的 pandas 数据保存为 本地csv文件&#xff0c;这一节将上节的数据以数据库方式保存。 数据库保存 采集数据部分前一节已做说明&#xff0c;这里就直接用采用前面的内容。这里着重说明的事数据库连接。对与 python 相连接的数据库有很多&a…...

[数据结构]:15-堆排序(顺序表指针实现形式)(C语言实现)

目录 前言 已完成内容 堆排序实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 04-SortCommon.cpp 05-SortFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为C语言代码…...

蓝桥 卷“兔”来袭编程竞赛专场-02破解曾公亮密码 题解

赛题介绍 挑战介绍 曾公亮编撰的《武经总要》中记载了一套严谨的军事通信密码&#xff0c;这也是目前发现我国古代战争中最早使用的军用密码表。将战场上可能常用到的情况&#xff0c;用 40 个短语归纳表示&#xff0c;且每个短语前编有固定的数字代码&#xff0c;这 40 个短…...

CSS定位

&#x1f353;个人主页&#xff1a;bit.. &#x1f352;系列专栏&#xff1a;Linux(Ubuntu)入门必看 C语言刷题 数据结构与算法 HTML和CSS3 目录 1.1为什么需要定位&#xff1f; 1.2定位组成 1.3静态定位static&#xff08;了解&#xff09; 1.4相对定位 relative …...

python sympy库

sympy库是python的符号运算库&#xff0c;是电脑辅助简单数学函数计算的好工具。本文简单记录了一下有关sympy的方法。建议使用jupyter notebook&#xff0c;这样输出的函数很好看。 文章目录sympy基础安装自变量&#xff08;Symbols&#xff09;函数表达式&#xff08;Expr&am…...

达梦数据库统计信息的导出导入

一、统计信息对象统计信息描述了对象数据的分布特征。统计信息是优化器的代价计算的依据&#xff0c;可以帮助优化器较精确地估算成本&#xff0c;对执行计划的选择起着至关重要的作用。统计信息的收集频率是一把双刃剑&#xff0c;频率太低导致统计信息滞后&#xff0c;频率太…...

信息系统基本知识(六)

大纲 信息系统与信息化信息系统开发方法常规信息系统集成技术软件工程新一代信息技术信息系统安全技术信息化发展与应用信息系统服务管理信息系统服务规划企业首席信息管及其责任 1.7 信息化发展与应用 我国在“十三五”规划纲要中&#xff0c;将培育人工智能、移动智能终端…...

<C++>智能指针

1. 智能指针 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<memory> using namespace std;int div() {int a, b;cin >> a >> b;if (b 0)throw invalid_argument("除0错误");return a / b; }void func() {int* p1 new in…...

1.分析vmlinux可执行文件是如何生成的? 2.整理内核编译流程:uImage/zImage/Image/vmlinx之间关系

一、分析vmlinux可执行文件是如何生成的&#xff1f; 1、分析内核的底层 makefile 如下&#xff1a; vmlinux: scripts/link-vmlinux.sh vmlinux_prereq $(vmlinux-deps) FORCE$(call if_changed,link-vmlinux)vmlinux_prereq: $(vmlinux-deps) FORCE发现vmlinux的生成主要依…...

数据结构4——线性表3:线性表的链式结构

基本概念 ​ 链式存储结构用一组物理位置任意的存储单元来存放线性表的数据元素。 ​ 这组存储单元既可以是连续的又可以是不连续的甚至是零散分布在任意位置上的。所以链表中元素的逻辑次序和物理次序不一定相同。而正是因为这一点&#xff0c;所以我们要利用别的方法将这些…...

weblogic 忘记密码重置密码

解决&#xff1a;weblogic 忘记密码 weblogic安装后&#xff0c;很久不用&#xff0c;忘记访问控制台的用户名或者密码&#xff0c;可通过以下步骤来重置用户名密码。 版本&#xff1a;WebLogic Server 11g 说明&#xff1a;%DOMAIN_HOME%&#xff1a;指WebLogic Server 域(…...

安卓开发之动态设置网络访问地址

之前开发程序联测测接口的时候&#xff0c;因为要和不同的后台人员调接口&#xff0c;所以经常要先把程序里的ip地址改成后台人员给我的。每次都要先修改ip地址&#xff0c;之后编译运行一下&#xff0c;才能测试。但要是换了个后台人员&#xff0c;或者同时和2个后台人员测接口…...

深度学习模型训练工作汇报(3.8)

进行数据的初始整理的准备 主要是进行伪序列字典的设置&#xff0c;以及训练数据集的准备。 期间需要的一些问题包括在读取文件信息的时候&#xff0c;需要跳过文件的第一行或者前两行&#xff0c;如果使用循环判断的话&#xff0c;会多进行n次的运算&#xff0c;这是不划算的…...

【ns-3】添加nr(5G-LENA)模块

文章目录前言1. 下载5G-LENA源代码2. 配置并重新构建ns-3项目参考文献前言 本篇以ns-3.37为例介绍如何在ns-3中添加nr&#xff08;5G-LENA&#xff09;模块 [1]。5G-LENA是一个由Mobile Networks group CTTC&#xff08;Centre Tecnolgic de Telecomunicacions de Catalunya&a…...

(枚举)(模拟)(前缀和)(数组模拟哈希)(可二分)1236. 递增三元组

目录 题目链接 一些话 流程 套路 ac代码 题目链接 1236. 递增三元组 - AcWing题库 一些话 int f[N]; memset(f,0,sizeof f)影响不到f[N] 所以尽量不要对f[N]赋值&#xff0c;不要用f[N]操作 流程 //由三重暴力i,j,k因为三重暴力底下是分别用i和j&#xff0c;j和k作比较…...

mysql五种索引类型(实操版本)

为什么使用索引 最近学习了Mysql的索引&#xff0c;索引对于Mysql的高效运行是非常重要的&#xff0c;正确的使用索引可以大大的提高MySql的检索速度。通过索引可以大大的提升查询的速度。不过也会带来一些问题。比如会降低更新表的速度&#xff08;因为不但要把保存数据还要保…...

微服务进阶之 SpringCloud Alibaba

文章目录微服务进阶&#x1f353;SpringCloud 有何劣势&#xff1f;&#x1f353;SpringCloud Alibaba 提供了什么&#xff1f;提示&#xff1a;以下是本篇文章正文内容&#xff0c;SpringCloud 系列学习将会持续更新 微服务进阶 &#x1f353;SpringCloud 有何劣势&#xff1…...

前端性能优化笔记2 第二章 度量

相关 Performance API 都在 window.performance 对象下 performance.now() 方法 精度精确到微妙获取的是把页面打开时间点作为基点的相对时间&#xff0c;不依赖操作系统的时间。 部分浏览器不支持 performance.now() 方法&#xff0c;可以用 Date.now() 模拟 performance.n…...

关于new和delete的一些思考,为什么不能在析构函数中调用delete释放对象的内存空间,new和delete的原理

最近在写代码的时候&#xff0c;觉得每次new出来的对象都需要去delete好麻烦&#xff0c;于是直接把delete写到了析构函数中&#xff0c;在析构函数里面写了句delete this&#xff0c;结果调用析构函数的时候死循环了&#xff0c;不是很理解原因&#xff0c;于是去研究了一下。…...

一场以数字技术深度影响和改造传统实业的新风口,正在开启

当数字经济的浪潮开始上演&#xff0c;一场以数字技术深度影响和改造传统实业的新风口&#xff0c;正在开启。对于诸多在互联网时代看似业已走入死胡同的物种来讲&#xff0c;可以说是打开了新的天窗。对于金融科技来讲&#xff0c;同样如此。以往&#xff0c;谈及金融科技&…...

C#处理复杂JSON数据:Newtonsoft.Json多级嵌套反序列化实战(附避坑指南)

C#处理复杂JSON数据&#xff1a;Newtonsoft.Json多级嵌套反序列化实战&#xff08;附避坑指南&#xff09; 在当今数据驱动的开发环境中&#xff0c;JSON已成为事实上的数据交换标准。特别是对于C#开发者而言&#xff0c;处理来自API响应、配置文件或NoSQL数据库的复杂JSON结构…...

Pixel Couplet Gen应用场景:微信小程序开发者如何复用像素皇城UI组件

Pixel Couplet Gen应用场景&#xff1a;微信小程序开发者如何复用像素皇城UI组件 1. 项目背景与价值 Pixel Couplet Gen是一款融合传统春节文化与现代像素艺术风格的创新应用。作为微信小程序开发者&#xff0c;您可以直接复用其UI组件库&#xff0c;快速构建具有以下特点的应…...

RePKG终极指南:Wallpaper Engine资源提取与转换的完整解决方案

RePKG终极指南&#xff1a;Wallpaper Engine资源提取与转换的完整解决方案 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 你是否曾经遇到过这样的问题&#xff1f;在Wallpaper Eng…...

无人值守智能图书借阅系统 Java 后端开发实战

在无人值守智能图书借阅系统的Java后端开发实战中&#xff0c;需围绕系统架构设计、核心功能实现、关键技术选型及部署优化等核心环节展开&#xff0c;以下为具体开发方案&#xff1a;一、系统架构设计分层架构体系&#xff1a;采用经典的四层架构设计&#xff0c;包括表现层、…...

QT6.5串口编程第一步:用CMakeLists.txt引入SerialPort模块的避坑指南

QT6.5串口编程避坑指南&#xff1a;CMakeLists.txt配置全解析 当你满怀期待地在QT6.5项目中引入串口通信功能&#xff0c;却在编译时遭遇"找不到QtSerialPort"的红色错误提示&#xff0c;这种挫败感我深有体会。作为一位经历过无数次类似"战斗"的开发者&am…...

uniapp 如何实现google登录-安卓端

uniapp 如何实现google登录-安卓端 本文只讲解uniapp安卓端如何获取到idToken来实现登录&#xff0c;ios使用uniapp官方方法可以获取 海外app貌似最常用的就是邮箱登录&#xff0c;在app上表现出来最常用的就是谷歌一键登录&#xff0c;或者邮箱加网页验证&#xff1b;google登…...

如何为华硕笔记本安装轻量级性能控制工具:G-Helper完整指南

如何为华硕笔记本安装轻量级性能控制工具&#xff1a;G-Helper完整指南 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Stri…...

Isaac Sim 4.1.0 国内网络环境下的三种下载与安装提速方案(含离线包处理)

Isaac Sim 4.1.0 国内网络环境下的高效安装指南 对于国内开发者而言&#xff0c;安装NVIDIA Isaac Sim往往面临下载速度缓慢、连接不稳定等问题。本文将提供三种经过验证的解决方案&#xff0c;帮助您快速完成安装。 1. 直链下载加速方案 通过分析Omniverse Launcher的日志文件…...

保姆级教程:从GEO下载Hi-C数据到HiC-Pro完整分析(避坑指南+实战脚本)

从零开始掌握Hi-C数据分析&#xff1a;HiC-Pro全流程实战与避坑指南 Hi-C技术已经成为三维基因组研究的重要工具&#xff0c;但对于刚接触生物信息学的研究人员来说&#xff0c;从原始数据到最终分析结果的过程往往充满挑战。本文将带你完整走通Hi-C数据分析全流程&#xff0c;…...

STM32CubeMX实战指南:从零搭建HAL库项目与LED控制

1. STM32CubeMX与HAL库开发入门 第一次接触STM32开发的朋友可能会被各种专业术语吓到——寄存器、固件库、HAL库、时钟树配置... 作为一个从51单片机转战STM32的"过来人"&#xff0c;我完全理解这种困惑。三年前我刚开始用STM32F103时&#xff0c;光是搭建开发环境就…...