小散量化炒股记|搭建本地化的股票量化数据库这么几步就够了

8,552 阅读6分钟

欢迎大家订阅《Python数据分析实战:构建股票量化交易系统》小册子,学完小册上的知识点后,一定要学以致用的方式来辅助我们分析股票! ​

前言

​ 相信大家都听说了量化交易这个东西了吧!

量化交易是一种新兴的系统化金融投资方法,它综合多个学科的知识,用先进的数学模型代替人的主观思维制定交易策略,利用计算机强大的运算力从庞大的股票、债券、 期货等历史数据中回测交易策略的盈亏“概率”,通过管理盈亏的“概率”帮助投资者做出准确的决策。

那么,什么才是普通股民所适合的量化交易打开方式呢?

本文就用一个接地气的数据管理场景来和大家分享一下,普通股民如何去使用量化交易!

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

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

数据表的划分和股票池

在存入数据库之前需要考虑如何划分数据表以及如何建立对应的股票池。

当然,根据交易者不同的操作风格可以有不一样的划分方法。比如把A股市场所有指数和上市个股都归纳到一个表中;也可以把自己熟悉的几个板块个股归纳到一个表中……

接下来我们就以板块来划分数据表,把水泥和半导体板块划分为同一个表中,然后介绍在实际应用中如何把个股行情数据更新到数据库中。

我们使用Tushare Pro版本的stock_basic()接口获取已上市的所有股票基础信息数据,包括股票代码、名称、上市日期、退市日期、所属板块等。

从上市的所有股票的代码中用Pandas条件表达式选取出“水泥”和“半导体”板块股票,比如:

df_basic[(df_basic["industry"] == u"水泥")]

选出的结果如下图所示:

将股票名称name和股票代码ts_code作为键值对转换为字典格式数据,然后使用dump把Python股票池存储为JSON文件即可。比如:

with open("stock_pool.json", "w", encoding='utf-8') as f:
    json.dump(stock_index, f, ensure_ascii=False, indent=4)

创建的JSON文件内容,如下图所示:

创建数据库更新数据

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

这里推荐一款轻型的关系型数据库SQLite。我们仅仅是用于本地的数据管理,无须多用户访问,数据容量小于2TB,无须海量数据处理,关键是移植方便、使用简单、处理迅速。这里推荐选择SQLite在实现本地数据管理。

当然,如果大家本身就擅长MySQL、MongoDB的话,或者有更高级玩法的话,完全可以选择MySQL、MongoDB这类的数据库。

首次创建数据库的时候要补全个股的历史行情走势,然后每过一个交易日就更新一天。

刚才我们存储的JSON文件提供了股票池的代码,使用open()把json文件打开,然后使用load()将文件中JSON编码字符串转换成Python数据类型,比如:

with open("stock_pool.json", 'r') as load_f:
    stock_index = json.load(load_f)

接下去可以用for循环遍历获取股票池对应的股票数据,也可以多任务提速股票数据的获取。

比如是第一次创建数据表,以000401为例,我们指定Tushare Pro版本的daily()接口起始时间和终止时间参数为分别'20190101'和'20200101',得到的数据内容如下图所示:

如果要更新下一个交易日的数据的话,只需调整起始时间即可。

创建数据库的代码:

conn = sqlite3.connect('stock-boards.db')

把数据更新到数据库表中可以直接调用DataFrame.to_sql()接口:

df_stock.to_sql('cement_semicon', conn, index=False, if_exists='append')

读取整张表数据可以调用pd.read_sql_query:

df_table = pd.read_sql_query("select * from 'cement_semicon';", conn)

比如我们存取了水泥板块全部股票的行情数据到数据库表中,读取出来的数据格式如下所示:

有了数据库,我们可以快速查询和统计一些数据。

比如查询‘20190125’这天交易日涨幅超过2%的股票:

df_target = pd.read_sql_query("select * from 'cement_semicon' where pct_chg > 2 and trade_date == '20191225'", conn)

统计得到符合要求的股票只有2只,如下图所示:

注意事项

在量化交易的实战中,数据的准确度是非常重要的,也就是说存储到数据库中的股票行情数据要保证足够的准确。

如何保证数据足够准确呢?

一个建议是选取两个数据源进行相互验证。如果是使用免费API接口,可以分别用两个接口获取数据,存在本地的CSV文件中,然后分别导入文件中的行情数据进行对比。出现偏差时要人为去判别,当数据通过检验之后再转存数据库中。

更高质量数据的话,可以使用收费的获取数据途径,例如万得(Wind)、同花顺等公司提供的金融数据终端,聚宽团队提供的JQData数据服务,预测者网站提供的金融数据下载服务等。

当然,也可以用爬虫方式从财经网站获取,比如东方财富网:

学习完书籍之后,想再次升级学习的内容可以加入知识星球《玩转股票量化交易》(点击可查看目录)。

总结

通过这个简单而又实用的股票量化场景,希望能够给广大朋友对于量化交易有一个直观的感受。

然后,我们应该升级自己的炒股方式了,把自己以前炒股的那套方法,抽象成策略模型,用量化的方法去全市场回测评估,然后让程序帮助我们监测行情的走势。

这个才是普通股民所适合的量化交易打开方式!

———————————————————————————————————————————————— 大家如果想对涉及到的知识点进行更全面、更体系的从0-1方式的介绍,这里推荐给大家我的书籍《Python股票量化交易从入门到实践》!天猫、京东、当当全面开售!

同时也欢迎大家关注我的微信公众号【元宵大师带你用Python量化交易】了解更多Python量化交易相关内容