当前位置: 首页 > 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;谈及金融科技&…...

【LeetCode】13. 罗马数字转整数

题目链接&#xff1a;https://leetcode.cn/problems/roman-to-integer/ &#x1f4d5;题目要求&#xff1a; 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 例如&#xff0c; 罗马数字 2 写做 II &#xff0c;即…...

2023/3/8集合之TreeSet HashSet简介 不含代码

TreeSet : 底层是由TreeMap维护的 无序的,不可重的 底层结构 : 红黑树(平衡二叉树) 特点 : 查询效率高,默认升序排序引用场景 : 适合应用在存储多个单个值的数据的集合,去重的,自动升序排序的场景新增方法:新增了一些与比较大小相关的方法 遍历方式 1)foreach 2)iterator 1测试…...

【面试1v1实景模拟】面试中常见的Java关键字详解

笑小枫专属目录老面&#x1f474;&#xff1a;Java中有哪些关键字老面&#x1f474;&#xff1a;简单介绍一下 final 关键字老面&#x1f474;&#xff1a;简单介绍一下 this、super 关键字老面&#x1f474;&#xff1a;简单介绍一下 static 关键字老面&#x1f474;&#xff…...

MySQL8.0.16存储过程比5.7.22性能大幅下降

MySQL8.0.16存储过程比5.7.22性能大幅下降 1、背景 从5.7.22迁移数据库到8.0.16&#xff0c;发现存储过程执行性能大幅下降。原来在5版本上执行只需要3-5秒&#xff0c;到8版本上居然要达到上万秒。 5版本&#xff1a; call Calculation_Week() OK 时间: 3.122s 8版本&#x…...

基于MATLAB的无线信道的传播与衰落(附完整代码与分析)

目录 一. 一般路径损耗模型 1. 1自由环境下路径损耗 1. 2 考虑实际情况 1.3 考虑阴影衰落 二. 代码仿真与理解 &#xff08;1&#xff09;函数文件 &#xff08;2&#xff09;函数文件 &#xff08;3&#xff09;主运行文件 三. 运行结果及理解 3.1 3.2 3.3 一. …...

SDX62如何查看Kernel版本和Operating System Version Patch Level

Kernel版本号方法一&#xff1a;adb shell登录&#xff0c;然后执行uname -a# uname -aLinux sdxlemur 5.4.180-perf #1 PREEMPT Fri Mar 3 04:24:42 UTC 2023 armv7l GNU/Linux方法二&#xff1a;内核源码查看&#xff0c;apps_proc/src/kernel/msm-5.4/Makefile 文件&#xf…...

001+limou+HTML——(1)HTML入门知识

000、本人编写前言 前言&#xff1a;本笔记来源于莫振杰的书《HTML、CSS、Javascript从零到一快速上手》&#xff0c;经过修改制成的自学笔记&#xff0c;本书很适合小白学习入门web的相关知识&#xff0c;你也可以先看看我从中学到了什么&#xff0c;再考虑是否去认真学习这本…...

使用Arduino Uno构建一个巡线机器人

使用Arduino Uno构建一个巡线机器人 原文 MX 巡线机器人&#xff08;**LFR&#xff09;**是一种简单的自主引导机器人&#xff0c;它遵循在地面上绘制的线来检测白色表面上的暗线或黑暗表面上的白线。在本教程中&#xff0c;使用 Arduino Uno 和一些易于访问的组件构建黑线跟…...

【C++】类和对象(收尾)

文章目录成员变量初始化问题初始化列表explicit关键字static成员特性&#xff1a;友元友元函数友元类内部类特性匿名对象成员变量初始化问题 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给了对象中各个成员变量一个合适的初始值。但是这并不能够称为对对象中成…...

Linux延迟操作

一、软中断Linux内核中定义了如下几种软中断&#xff1a;enum {HI_SOFTIRQ0,TIMER_SOFTIRQ,NET_TX_SOFTIRQ,NET_RX_SOFTIRQ,BLOCK_SOFTIRQ,IRQ_POLL_SOFTIRQ,TASKLET_SOFTIRQ,SCHED_SOFTIRQ,HRTIMER_SOFTIRQ,RCU_SOFTIRQ, /* Preferable RCU should always be the last soft…...