ac27c95fbcb9de18614366c48e5fc897.png

前言

8c84cb84fcf2ef11a83b879a6d129f6b.png

数据是量化交易的源头,如何高效地管理大量数据是量化交易分析中非常关键的环节。数据库就是最佳的解决方案。

通过API接口获取到股票行情数据之后,我们可以存入到数据库之中,这样下次调用的时候只需要从本地数据库中获取即可。

目前流行的数据库有Oracle、MySQL、MongoDB、Redis、SQLite……关于数据库的选型通常取决于性能、数据完整性以及应用方面的需求。每个数据库都有它的特点和最适合的应用场合。

我的书籍《Python股票量化交易从入门到实践》上推荐的是轻型数据库SQLite,适用于无须多用户访问,数据容量小于2TB,无须海量数据处理的小型应用场景。

如果追求更全面的功能、更强大的性能,特别在并发处理上要求高效的话,MySQL无疑是所有大型数据库中最为流行的一个。

不少星球会员反馈,想学习关于MySQL作为股票量化数据库的操作方法。比如

“如何为每个股票在MySQL中创建表?”

“每天获取的股票数据怎么存入到MySQL数据库中?”

“如何从MySQL中取出我们想要的股票数据呢?”

……

接下来就为大家解锁新的技能!

  • 如何安装MySQL

  • 如何创建个股数据表

  • 如何避免重复创建数据表

  • 如何插入股票数据表

  • 如何更新股票数据表

  • 如何查询股票数据表

  • 如何删除股票数据表


e6ee3e4f339be5d59d655dc2208c0f43.png

如何安装MySQL

fdbba2a6d5994cc18294630e1b8a1a8b.png

首先去官网http://www.mysql.com下载MySQL。点击Downloads—>Community,选择MySQL Community Server。

738b5fa7ca060c723f0c1d2022c53424.png

c3c933e2d60d4b5b1db843f8e106d9d5.png

336df8b7342a93842f21bfc78b761cf0.png

选择对应的安装文件后开始下载。下载完成后,打开安装包,开始安装MySQL。

95c77c5f83b9b260c9edef1078f5c9a0.png

3142529a97151aaff34e7938c61cf6c0.png

选择需要的版本:

2a7f97bd2b5f31d510c7813420db5620.png

需要安装下依赖的Visual C++

4094bc0a492448df78aeccb907ceb193.png

4533d792dd880a843ec5f9518a2e34d9.png

然后按以下的步骤一步步操作即可。

8cd836bee5177f80d3f076411167e187.png

b5e40c108ae04b6adbbb1b9c6c096306.png

1f5456c4628ed03f143aac706852df7a.png

504119fba07496b1fd6c942283871ef3.png

输入账户和密码:

91e719af8b74fd4873c2df0e106a4920.png

88343fb882e40cf88cff5c46b12893d4.png

7932c09e5a18420935a6c147ec1e00b0.png

c19e92c446c79ddd5a67c92227b561a1.png

到此为止,MySQL就成功地安装在你的本地电脑上了。

cfbb11ffdbd7ef34d037c72f936ca5f9.png

一个基础的例程

6301edf9f618814bd5b52da270c7c8a4.png

接下来用一个简单的例程使用下MySQL。

使用Python操作MySQL可以安装pymysql这个库。

pip install pymysql

使用pymysql打开数据库连接代码如下,其中host为localhost,port为3306

self.conn = pymysql.connect(host=host, port=self.port, db=self.db, user=self.user, password=self.password)

如果在打开MySQL时出现报错:

RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods

原因缺少了cryptography库,安装一下即可。

pip3 install cryptography -i https://pypi.douban.com/simple

获得一个可以执行SQL语句的光标对象:

self.cursor = self.conn.cursor()

执行SQL语句,比如sql是"SELECT * FROM stock",即查看stock表中全部内容。

self.cursor.execute(sql)
self.conn.commit()

关闭数据库连接如下:

self.conn.close()

如果我们处理的是Dataframe数据的话,那么保存到数据库时可以直接使用to_sql。需要注意的一点是使用to_sql,只能使用sqlalchemy库。代码如下所示:

from sqlalchemy import create_engine
conn = create_engine("mysql+pymysql://root:yuanxiao@127.0.0.1:3306/quanttrader?charset=utf8")
df=ts.get_hist_data('000001')
df.to_sql(name='stock', con=conn, if_exists='append', index=False, index_label=False)

b3225eae873b2492bb70ef9427606fba.png

如何创建个股数据表

bf06e2149ac8430c8147476e429f84b2.png

存储股票数据需要先为该股创建一个数据表。完整的创建表的语句如下所示:

7376c9407ea4dbcba35540f1e43abfd2.png

为大家解读下语句的含义,遵循的SQL语法格式为:

CREATE TABLE <表名> ([表定义选项]);

其中,[表定义选项]的格式为:<列名1> <类型1> [,…] <列名n> <类型n>

“CREATE TABLE”是创建表的关键字。这里的表名是 “minute_tb”,表定义的选项包括了ID、时间戳、股票代码、最高价、最低价、收盘价、开盘价、成交量、成交额、涨跌幅、描述。

“PRIMARY KEY”关键字是来指定数据表的主键的,我们既可以为表中的一个字段设置主键,也可以为表中多个字段设置联合主键。但是不论使用哪种方法,在一个表中主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在有相同主键值的两行数据。这是唯一性原则。此处我们把“ID”字段设置为了数据表的主键约束,

我们把“ID”字段添加 AUTO_INCREMENT属性来实现主键自增长。当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。需要注意的是:

一个表中只能有一个字段使用 AUTO_INCREMENT 约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分)。

AUTO_INCREMENT约束的字段必须具备 NOT NULL 属性。

AUTO_INCREMENT 约束的字段只能是整数类型(TINYINT、SMALLINT、INT、BIGINT 等)。

AUTO_INCREMENT 约束字段的最大值受该字段的数据类型约束,如果达到上限,AUTO_INCREMENT 就会失效。


e37e726ac875b09330455eb9e842a238.png

如何避免重复创建数据表

f2e53a10ea3f22b41e31c3ade5933990.png

在更新股票数据时,如果数据库中不存在该股的数据表,那么我们需要为这个股票创建一个数据表,但是如果已经存在数据表的话,只需要更新数据就行。

我们可以使用SQL语句“show tables”获取当前数据库中所有表的名称,然后查看其中是否包含该股的数据表即可。

9f634d4877adce087ecf93009173b7f8.png




7aeb9ebd6f4998c5f68a83020352d1d0.png

如何插入股票数据表

2fc08a9183f75b4753803a69c5441622.png

每天收盘后要把当天新增的股票数据插入到数据表中,可以使用“INSERT INTO”语句。

insert into有两种语法,分别如下:

一种语法无需指定要插入数据的列名,只需提供被插入的值即可,比如INSERT INTOtable_name VALUES (value1,value2,value3,...);  

另外一种是需要指定插入数据的列名,并且插入的值需要和列名一一对应:

cursor.execute("INSERT INTO minute_tb (ID, Time, Code, High, Low ,Close, Open, Volume, Amount, PctChg, Description) \
            VALUES (1, '2019-1-1', 600123, 10.12, 10.12, 10.12, 10.12, 111111, 10.12, 2.12, 'TP')")



cce91dd34ca2f3fdd0cae892faaac4b8.png

如何更新股票数据表

2f0ed0422c1f63f7d6dc037ad6d66e58.png

如果要更新数据表中已有的数据,那么可以使用“UPDATE” 语句。需要注意的是,使用“UPDATE”时WHERE 子句规定哪条记录或者哪些记录需要更新,如果省略了 WHERE 子句,所有的记录都将被更新!

如下所示,是让ID为1的那条数据额Code更新为“600888”“

cursor.execute("UPDATE minute_tb set Code = 600888 where ID=1")

a8b3a3d738f0a94ed1f682e6c9e9e32a.png

如何查询股票数据表

12d22846d931f7d7595a37cab0bd888f.png

在分析股票的时候就需要从数据库中查询个股数据表中的数据了,此时可以使用 “SELECT”语句,这里的“*”号是表示从数据表中获取全部的数据。如果要再针对性地获取数据,可以在语句中增加条件判断。

然后再通过fetchone()返回满足条件的一行数据,或者通过fetchall()返回满足条件的全部数据。

cursor.execute("select * from minute_tb")

dd87500d4cb4673cf777e1d8a09db007.png

如何删除股票数据表

3a8e23e256ecea24bce74e4ee456ea4a.png

为了对数据库做有效率的管理,有时候我们会决定我们需要从数据库中删除一个表格。此时使用“DROP TABLE”语句删除股票数据表:

cursor.execute("DROP TABLE minute_tb")

说明

完整代码我们会上传星球《Python量化场景编程技巧与方法》。关于数据库是否要分表?如何分表?可以关注星球《Python量化场景编程技巧与方法》中的介绍。

fed01c36f7cfb2994919c22011f63154.jpeg

《Python量化场景编程技巧和方法》围绕《玩转股票量化交易》中涉及到的一些内容,分享一些偏基础的关于Python编程技巧、Pandas编程技巧、数据库技巧、可视化编程技巧等等。
加入星球《玩转股票量化交易》的会员可以免费加入星球《Python量化场景编程技巧与方法》,微信联系我加入!!
知识星球介绍点击:知识星球《玩转股票量化交易》精华内容概览

94b8185d91cc169ed2f32fdcb9005495.jpeg

元宵大师的量化交易书籍开售!!
京东、当当、天猫有售!!

7a7e4d4d0b17cf41e44f8b3924d97285.jpeg

Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐