在上一篇文章中《量化交易系统之python+mysql(一)》,实现了插入一条数据的效果。

现在,开始分析真实数据了,以及在开发过程中,进行优化。

问题描述

在mysql方面,遇到如下问题:

1.一支股票,所具有的历史数据,从上市开始到今天,称为纵向数据;现在,A股中有3500+只股票,称为横向数据;也就是说,一张表需要存储纵向数据个数*横向数据个数(3500+),可能需要分表。不过我这里只取最近两年的历史数据,先存储看看吧~

2.新增一张“交易日”的表,即表示那些日期是开市的,因为周末和节假日是休市的,以后会以此来取数据进行回测。

解决方案

问题2的引入,引发了新的需求:根据面向对象原则,一个类做一件事。显然,需要重构代码了。

此次应该有张图~,时间有限,随意一点:

首先,重新建立表结构:


CREATE TABLE t_kdata (id INT auto_increment  PRIMARY KEY,code CHAR(10) NOT NULL COMMENT '股票代码',trade_day CHAR(10) NOT NULL COMMENT '交易日期',open DECIMAL(10,2) NOT NULL COMMENT '开盘价',close DECIMAL(10,2) NOT NULL COMMENT '收盘价',high DECIMAL(10,2) NOT NULL COMMENT '最高价',low DECIMAL(10,2) NOT NULL COMMENT '最低价',amount DECIMAL(25,2) COMMENT '成交额(千元)',vol DECIMAL(25,2) COMMENT '成交量(手)',ma5vol DECIMAL(25,2)  COMMENT '5日平均成交量',ma10vol DECIMAL(25,2) COMMENT '10日平均成交量',ma20vol DECIMAL(25,2) COMMENT '20日平均成交量',ma30vol DECIMAL(25,2) COMMENT '30日平均成交量',ma5 DECIMAL(10,2) COMMENT '5日平均收盘价',ma10 DECIMAL(10,2) COMMENT '10日平均收盘价',ma20 DECIMAL(10,2) COMMENT '20日平均收盘价',ma30 DECIMAL(10,2) COMMENT '30日平均收盘价',ma60 DECIMAL(10,2) COMMENT '60日平均收盘价',pct_chg DECIMAL(10,2) COMMENT '涨跌幅',UNIQUE KEY `UK_code`(`code`,`trade_day`)
)ENGINE=innodb DEFAULT CHARSET=utf8;CREATE TABLE t_trade_day (id INT auto_increment  PRIMARY KEY,trade_day CHAR(10) NOT NULL UNIQUE COMMENT '交易日期'
)ENGINE=innodb DEFAULT CHARSET=utf8;

注:t_trade_day存储交易日;

t_kdata存储K线数据以及对应的技术指标;

然后,重构代码。将每个表的操作,封装于独立的类,通过一个统一dbmgr作为管理者,对外开放,代码清晰。

dbmgr.py

#coding=utf-8
import pymysql
import src.datamgr.t_trade_day as t_trade_day
import src.datamgr.t_kdata as t_kdataclass CDBMgr:def __init__(self, host, user, password, database):self.host = hostself.user = userself.password = passwordself.database = databaseself.connect = Noneself.trade_day = Noneself.kdata = Noneself.connect_db()#connect databasedef connect_db(self):self.connect = pymysql.connect(self.host, self.user, self.password, self.database, charset = "utf8")self.trade_day = t_trade_day.CT_Tradeday(self.connect)self.kdata = t_kdata.CT_Kdata(self.connect)#增加k线数据def add_kdata(self, code, trade_day, open, close, high, low, vol):if self.connect is None:return -1self.kdata.add_kdata(code,trade_day, open, close, high, low, vol)#根据股票代码,删除表中的数据def del_kdata(self,code):if self.connect is None:return -1self.kdata.del_kdata(code)def modify_kdata(self, code, open, close, high, low, vol):if self.connect is None:return -1self.kdata.modify_kdata(code, open, close, high, low, vol)#判断某个股票代码是否存在def exist_kdata(self, code):if self.connect is None:return -1return self.kdata.exist_kdata(code)def query_kdata(self, code):if self.connect is None:return -1return self.kdata.query_kdata(code)######################################################################### 判断某个交易日期是否存在def exist_trade_day(self, trade_day):if self.connect is None:return -1return self.trade_day.exist_trade_day(trade_day)def add_trade_day(self, trade_day):if self.connect is None:return -1return self.trade_day.add_tradeday(trade_day)

t_kdata.py

#coding=utf-8
import pymysqlclass CT_Kdata:def __init__(self, connect):self.connect = connect#增加k线数据def add_kdata(self, code, trade_day, open, close, high, low, vol):if self.connect is None:return -1ret = self.exist_kdata_day(code, trade_day)if ret > 0:return 0# 得到一个可以执行SQL语句的光标对象cursor = self.connect.cursor()# sql语句sql = "insert into t_kdata (code,trade_day, open, close, high, low, vol) VALUE (%s,%s,%s,%s,%s,%s,%s);"print(sql)try:# 执行SQL语句cursor.execute(sql, (code, trade_day, open, close, high, low, vol))#cursor.execute(sql)# 把修改的数据提交到数据库self.connect.commit()except Exception as e:# 捕捉到错误就回滚self.connect.rollback()print(e)# 关闭光标对象cursor.close()#根据股票代码,删除表中的数据def del_kdata(self, code):if self.connect is None:return -1# 得到一个可以执行SQL语句的光标对象cursor = self.connect.cursor()# sql语句sql = "delete from t_kdata where code=%s;"print(sql)try:# 执行SQL语句cursor.execute(sql, (code,))# 把修改的数据提交到数据库self.connect.commit()except Exception as e:# 捕捉到错误就回滚self.connect.rollback()print(e)# 关闭光标对象cursor.close()def modify_kdata(self, code, trade_day, ma5, ma10, ma20):if self.connect is None:return -1# 得到一个可以执行SQL语句的光标对象cursor = self.connect.cursor()# sql语句sql = "update t_kdata set ma5='"+ma5 +\"' ,ma10='" + ma10 +\"' ,ma20='" + ma20 +\"' where code='" + code +"' and trade_day='" + trade_day + "';"print(sql)try:# 执行SQL语句cursor.execute(sql)# 把修改的数据提交到数据库self.connect.commit()except Exception as e:# 捕捉到错误就回滚self.connect.rollback()print(e)# 关闭光标对象cursor.close()#判断某个股票代码是否存在def exist_kdata(self, code):if self.connect is None:return -1# 得到一个可以执行SQL语句的光标对象cursor = self.connect.cursor()# sql语句sql = "select 1 from t_kdata where code = '"+code+"' limit 1;"print(sql)try:# 执行SQL语句cursor.execute(sql)# 把修改的数据提交到数据库self.connect.commit()result = cursor.fetchone()# 关闭光标对象cursor.close()if result is None:return 0for i in result:print(i)if i == 1:return 1except Exception as e:# 捕捉到错误就回滚self.connect.rollback()print(e)return 0# 判断某个股票代码,在具体日期的k线数据是否存在def exist_kdata_day(self, code, trade_day):if self.connect is None:return -1# 得到一个可以执行SQL语句的光标对象cursor = self.connect.cursor()# sql语句sql = "select 1 from t_kdata where code = '" + code + "'and trade_day='" + trade_day + "' limit 1;"print(sql)try:# 执行SQL语句cursor.execute(sql)# 把修改的数据提交到数据库self.connect.commit()result = cursor.fetchone()# 关闭光标对象cursor.close()if result is None:return 0for i in result:print(i)if i == 1:return 1except Exception as e:# 捕捉到错误就回滚self.connect.rollback()print(e)return 0def query_kdata(self,code):if self.connect is None:return -1# 得到一个可以执行SQL语句的光标对象cursor = self.connect.cursor()# sql语句sql = "select * from t_kdata where code = '%s';"print(sql)try:# 执行SQL语句cursor.execute(sql, (code,))# 把修改的数据提交到数据库self.connect.commit()result = cursor.fetchone()for i in result:print(i)except Exception as e:# 捕捉到错误就回滚self.connect.rollback()print(e)# 关闭光标对象cursor.close()return 0

t_trade_day.py

#coding=utf-8
import pymysqlclass CT_Tradeday:def __init__(self, connect):self.connect = connect#增加交易时间def add_tradeday(self, trade_day):if self.connect is None:return -1# 得到一个可以执行SQL语句的光标对象cursor = self.connect.cursor()# sql语句sql = "insert into t_trade_day (trade_day) VALUE (%s);"print(sql)try:# 执行SQL语句cursor.execute(sql, (trade_day,))# 把修改的数据提交到数据库self.connect.commit()except Exception as e:# 捕捉到错误就回滚self.connect.rollback()print(e)# 关闭光标对象cursor.close()#判断某个股票代码是否存在def exist_trade_day(self, trade_day):if self.connect is None:return -1# 得到一个可以执行SQL语句的光标对象cursor = self.connect.cursor()# sql语句sql = "select 1 from t_trade_day where trade_day = '"+trade_day+"' limit 1;"print(sql)try:# 执行SQL语句cursor.execute(sql)# 把修改的数据提交到数据库self.connect.commit()result = cursor.fetchone()# 关闭光标对象cursor.close()if result is None:return 0for i in result:print(i)if i == 1:return 1except Exception as e:# 捕捉到错误就回滚self.connect.rollback()print(e)return 0#查询所有的交易日期,返回查询出来的结果def query_tradeday(self):if self.connect is None:return None# 得到一个可以执行SQL语句的光标对象cursor = self.connect.cursor()# sql语句sql = "select * from t_trade_day;"print(sql)try:# 执行SQL语句cursor.execute(sql)# 把修改的数据提交到数据库self.connect.commit()result = cursor.fetchall()cursor.close()return resultexcept Exception as e:# 捕捉到错误就回滚self.connect.rollback()print(e)# 关闭光标对象cursor.close()return None

调用方法

调用方法与上一篇描述类似

self.db = dbmgr.CDBMgr('localhost', 'root', '123', 'kdata')
               # 列: code trade_day open high low close 昨收价 涨跌幅 涨跌额 总手 成交额(千元)# 索引:0    1         2    3    4    5    6      7      8      9    10self.db.add_kdata(arrayOne[0],arrayOne[1], arrayOne[2], arrayOne[5], arrayOne[3], arrayOne[4], arrayOne[9])

效果

3500只股票,从2017年12月1日到2019年7月19日之间的K线数据,总条目为128万:

mysql> select count(*) from t_kdata;
+----------+
| count(*) |
+----------+
|  1279769 |
+----------+
1 row in set (0.27 sec)

量化交易系统之python+mysql(二)相关推荐

  1. 5月份 Github 上最热的十个 Python 项目,从Debug工具到AI水军、量化交易系统。

    2019 年第 46 篇,总第 70 篇文章 原文地址:https://medium.mybridge.co/python-open-source-for-the-past-month-v-may-2 ...

  2. 搭建系统|为何我坚持要用Python搭建属于自己的股票量化交易系统

    前言 前几期我们搭建了自定义的量化行情/选股/回测框架: 搭建系统|说好了个性化的选股工具!教你定制自己的选股财务数据表? 搭建系统|升级基于财务数据的选股工具!从清单中剔除ST股和次新股 搭建系统| ...

  3. 量化交易系统 python btc_GitHub - crabboy/abu: 阿布量化交易系统(股票,期权,期货,比特币,机器学习) 基于python的开源量化交易,量化投资架构...

    abu能够帮助用户自动完善策略,主动分析策略产生的交易行为,智能拦截策略生成的容易失败的交易单. 现阶段的量化策略还是人工编写的代码,abu量化交易系统的设计将会向着由计算机自动实现整套流程的方向迈进 ...

  4. Github 上火热的十个 Python 项目,从Debug工具到AI水军、量化交易系统。

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  5. Github 上火热的十个 Python 项目,从Debug工具到AI水军、量化交易系统。( 嗨学编程)

    Github 上火热的十个 Python 项目,从Debug工具到AI水军.量化交易系统. https://blog.csdn.net/fei347795790/article/details/101 ...

  6. 搭建股票量化交易系统QTYX—持续进阶之路[更新至V2.5.2]

    开发者计划发布 看书学习了量化相关的知识之后,如何学会搭建自己的量化交易系统?这一步相信很多人很难跨过去. 其实边学习边实战,在实战中学习才是最有效地方式. 于是我们分享一个即可以用于学习,也可以用于 ...

  7. python pyplot k线图_量化之路-python绘图-使用matplotlib绘制股票K线图(附代码)

    最近不知道在瞎忙什么,学习速度有点慢,更新也比较少,需要反思一下. 在学习完python爬虫和获取股票数据技能后,接下来需要将数据输出称为图形,以便查看趋势,以及分析趋势. 重新梳理下需要学会的技能步 ...

  8. 关于量化交易系统的几个要点

    第一部分:交易系统的构成框架 首先,一个交易系统必须具备精准定义的特性,否则后续的实盘统计系统修正是无法跟进的: 其次,一个交易系统可以包含多个子系统,但子系统之间必须没有丝毫关联性,尤其在进场条件范 ...

  9. 量化投资交易python工具干货大全

    http://www.newsmth.net/nForum/#!article/Python/128763 最近程序化交易很热,量化也是我很感兴趣的一块. 国内量化交易的平台有几家,我个人比较喜欢用的 ...

  10. 第一节、Alex 讲解 python+mysql 交互;

    Python Mysql 交互 A.Alex 的语法展示: import MySQLdb try: conn=MySQL.connect(host='localhost',user='root',pa ...

最新文章

  1. 管理者如何提升下属执行力---视频学习记录
  2. mysql隔离级别 简书_数据库事务和四种隔离级别
  3. 新增16条设计规约!阿里巴巴Java开发手册(详尽版)开放下载!
  4. Cocos2d-js学习--helloword
  5. python学习四(处理数据)
  6. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案(一)
  7. 纹理特征:灰度共生矩阵
  8. 开源app之MyHearts
  9. jQuery瀑布流插件 Masonry
  10. Spring的bean管理(注解注入属性)
  11. vs2003常见问题
  12. 存储服务器 自建,搭建及了解存储服务器
  13. 微信 html avi视频无法播放,是真的,微信可以发送高清.avi 了
  14. 编译安装cacti-spine
  15. java中echat如何动态_ECharts Java 动态加载数据,echartsjava
  16. 获取post请求的几种常见方式
  17. python画圣诞树
  18. 《Java入门》简化的插入排序:本题要求编写程序,将一个给定的整数插到原本有序的整数序列中,使结果序列仍然有序。
  19. Python版警察抓小偷游戏源代码,有多个难度级别
  20. spark java mysql 连接数据库_Spark入门:通过JDBC连接数据库(DataFrame)

热门文章

  1. 2014江西理工大学C语言程序竞赛高级组
  2. 能看清农村房子的卫星地图软件
  3. html想实现文字环绕图片,HTML/CSS实现文字环绕图片布局
  4. 北京驾驶证期满换证(2021-06)
  5. 关于Bootstrap 中使用Tooltips不生效的问题
  6. MTK G-sensor
  7. git创建本地ssh密匙
  8. 大白教你一分钟识别图片中的文字
  9. 计算机平面设计专业可以考什么证,平面设计师资格证怎么考_计算机平面设计职称...
  10. X264 AQ MODE详解