楼主: wl142857
3794 4

[源码分享] 【量化杂谈之基础篇6】将数据存储到数据库 [推广有奖]

  • 0关注
  • 34粉丝

硕士生

70%

还不是VIP/贵宾

-

威望
0
论坛币
201 个
通用积分
0
学术水平
11 点
热心指数
12 点
信用等级
8 点
经验
7091 点
帖子
86
精华
0
在线时间
281 小时
注册时间
2009-2-22
最后登录
2020-6-24

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

量化杂谈之基础篇系列文章:

基础篇1:https://bbs.pinggu.org/thread-4145710-1-1.html

基础篇2:https://bbs.pinggu.org/thread-4154818-1-1.html

基础篇3:https://bbs.pinggu.org/thread-4164534-1-1.html

基础篇4:https://bbs.pinggu.org/thread-4172585-1-1.html

基础篇5:https://bbs.pinggu.org/thread-4191475-1-1.html


本讲中,我们来谈一谈回测中数据的存储和管理。实现这一功能离不开数据库的帮助,在这里采用Mysql数据库向大家演示如何在数据库中创建表、并且如何把从数据源获取的数据存储到数据库的表中。


在Mysql数据库中创建数据表

首先需要在Mysql中先创建一个数据库test,并在该数据库中建一张表his_daily_adj_bars来存储各种交易品种的历史日数据,这些日数据经过了除权的处理,因此可以在回测中直接使用。


在该表中,id是一个自增的主键,code是交易品种的代码作为外键;bar_date是bar的日期,格式是yyyy-mm-dd;created_date是数据新增的日期,而last_updated_date则是最后修改数据的日期,其格式是yyyy-mm-dd hh:mm:ss。在Mysql中的建表语句如下所示。

  1. CREATE TABLE IF NOT EXISTS his_daily_adj_bars(
  2.   `id` int NOT NULL AUTO_INCREMENT,
  3.   `code` varchar(20) NOT NULL,
  4.   `bar_date` time NOT NULL,
  5.   `open_price` decimal(19,4) NULL,
  6.   `high_price` decimal(19,4) NULL,
  7.   `low_price` decimal(19,4) NULL,
  8.   `close_price` decimal(19,4) NULL,
  9.   `volume` bigint NULL,
  10.   `amount` bigint NULL,
  11.   `created_date` datetime NOT NULL,
  12.   `last_updated_date` datetime NOT NULL,
  13.   PRIMARY KEY (`id`),
  14.   KEY `index_code` (`code`)
  15. )ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
复制代码

获取数据并将数据存储到Mysql数据库

将获取的数据插入到Mysql数据库中需要以下几个步骤:

  • 从数据源获取数据

  • 连接数据库

  • 做insert操作



获取的数据来源于tushare包,我们可以采用下面的方法来获取某只交易品种在一段时间的bars。在获取bars数据之后,需对数据进行处理使其与数据库的表结构一致。


  1. def obtain_data(self, code, start_time, end_time):
  2.     bars =  ts.get_h_data(code,start_time,end_time).sort_index()
  3.     bars_list = zip(bars.index,bars['open'],bars['high'],bars['close'],bars['low'],bars['volume'],bars['amount'])
  4.     now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  5.     data = [(code,d[0],d[1],d[2],d[3],d[4],d[5],d[6],now,now) for d in bars_list]
  6.         return data
复制代码

连接数据库的方法是使用connect('ip','username','password','db_name'),如果数据库连接失败会打印出一条消息提示。

  1. def __init__(self):
  2.     try:
  3.         self.db = mysql.connect("localhost","root","123456","test")
  4.         self.cursor = self.db.cursor()
  5.     except mysql.Error,e:
  6.         print self.get_cur_time() + "连接数据库错误,%d: %s" % (e.args[0], e.args[1])
复制代码

将获取的数据插入到数据库最重要的是构造执行insert操作的sql语句字符串。该字符串中主要含三个参数,一个是插入表的字段名组成的cols_str,一个是插入的表名,另一个则是由多个%s组成format_str。为了获取表的字段,我们需要自定义一个获取一张数据表所有字段的方法。在进行插入操作的时候,还需做数据库的事务管理,如果插入发生错误那么将进行回滚操作。

  1. def insert_data(self, table, data):
  2.     try:
  3.         field_name = self.get_table_fields(table)
  4.         col_str = ','.join(field_name[1:])
  5.         format_str = ('%s, ' * (len(field_name)-1))[:-2]
  6.         sql_str = "insert into %s (%s) values (%s)"% (table, col_str, format_str)
  7.             try:
  8.                 self.cursor.executemany(sql_str, data)
  9.                 self.db.commit()
  10.             except mysql.Error,e:
  11.                 self.db.rollback()      ## 回滚
  12.                 print self.get_cur_time() + "插入数据库错误,%d: %s" % (e.args[0], e.args[1)
  13.     except mysql.Error,e:
  14.         print self.get_cur_time() + "数据库错误,%d: %s" % (e.args[0], e.args[1])
复制代码


完成了以上几步后,即可选取测试数据进行测试。

  1. if __name__ == '__main__':
  2.     test = ImportMysql()
  3.     data = test.obtain_data('002337','2012-01-01','2012-02-01')
  4.     test.insert_data('his_daily_adj_bars',data)
复制代码

在Mysql中进行query,可以发现相应的行情数据已经储存在了数据库当中。最后需要补充的是,pandas也提供了to_sql的方法实现将pandas数据结构的数据导入数据库的功能,大家可以查阅文档学习。


关于本次讲解全部代码,可以关注我的微信公众号,以后会有更多关于量化的原创文章哦!。
我的微信公众号:会掘金的小鹿(NuggetsRoad)
是时候关注一波了!


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:数据存储 数据库 基础篇 increment localhost 数据库

已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
bjantoine + 5 + 1 + 1 + 1 精彩帖子
fantuanxiaot + 50 + 30 精彩帖子

总评分: 经验 + 50  论坛币 + 35  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

沙发
floydgyf 在职认证  发表于 2016-2-24 13:34:13 |只看作者 |坛友微信交流群
谢谢分享

使用道具

藤椅
bjantoine 发表于 2016-2-25 23:57:18 |只看作者 |坛友微信交流群
谢谢!您所做的很有意义!

使用道具

板凳
sukiyou2000 发表于 2016-2-26 10:58:02 |只看作者 |坛友微信交流群
支持一下!

使用道具

报纸
gxlynn 发表于 2018-2-11 17:33:32 |只看作者 |坛友微信交流群
支持一下!

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-26 18:31