Python 获取股票数据并存入MongoDB实战教程

量化投资系列文章:

Backtrader 教程 — Python 量化投资实战教程(1)

Python 量化投资实战教程(2) —MACD策略

Python 量化投资实战教程(3) —A股回测MACD策略

Python 量化投资实战教程(4) —KDJ 策略

Python 量化投资实战教程(5) — A股回测KDJ 策略

Python 量化投资实战教程(6) — 交易平均收益率

在前几篇量化投资文章中,使用的是保存为csv的本地股票数据。

但考虑到长远的未来,如果我们想要加快回测运行速度,就要分布式地在不同的机器上进行策略回测。

那么将股票数据保存到数据库上则是必然的选择,因为这样每台服务器都能够直接连接到同一个数据库拉到数据,管理起来方便许多。

今天我们就先讲讲如何使用MongoDB保存股票数据。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端运行命令安装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南。

在终端输入以下命令安装我们所需要的依赖模块:

pip install tushare
pip install pymongo

看到 Successfully installed xxx 则说明安装成功。

安装MongoDB

MongoDB 请前往以下链接下载:

https://www.mongodb.com/try/download/community

第一步选择On-Premises, 第二部选择自己的操作系统,第三部点击Download下载安装包。

下载完成安装包后一路默认即可,不过推荐修改data_path, 毕竟数据库有可能变得比较大,装在C盘不合适。

安装完成后,打开CMD输入以下命令启动MongoDB服务:

C:\Program Files\MongoDB\Server\4.2\bin\mongod.exe --dbpath F:\mongodb\data

前者是你的mongod.exe所在文件夹,后者是你的数据库文件路径。请注意根据自己的安装配置更改。

Tushare 股票数据接口

为了下载股票数据,我用到了tushare,一个大佬做的相对稳定的股票数据服务。

tushare采用积分制,你的积分越高,能调的接口约高级。不过其实我们的策略所需要的接口用普通账号的积分就够了。

你需要到https://tushare.pro/上注册一个tushare账户,然后进入账号页面拿到token:

这是我们需要用到的接口:

2.编写代码

首先,学会连接MongoDB数据库并创建集合(表),也就4行代码的事情:

import pymongo

# 建立连接
client = pymongo.MongoClient(host='localhost', port=27017)

# 连接stock数据库,注意只有往数据库中插入了数据,数据库才会自动创建
stock_db = client.stock

# 创建一个daily集合,类似于MySQL中"表"的概念
daily = stock_db["daily"]

这样就能连接本地MongoDB的stock数据库,如果该库不存在,当你往集合中插入数据的时候,就会自动新建数据库。

有一点需要非常注意:MongoDB默认不设密码,因此你如果要上线MongoDB,请注意手动设置密码。

其次,拿到股票数据:

def get_stock_daily(start_date, end_date):
    """
    获得A股所有股票日数据

    Args:
        start_date (str): 起始日
        end_date (str): 结束日
    """

    pro = ts.pro_api(token="你的账号token")
    codes = open('./codes.csv', 'r', encoding='utf-8').readlines()

    # 遍历所有股票ID
    for code in codes:
        code = code.strip('\n')

        # 请求tushare数据,并转化为json格式
        df = pro.daily(ts_code=code, start_date=start_date, end_date=end_date)

因为并不一定需要用到所有股票数据,所以我维护了一个股票列表:codes.csv.

当然,这个股票列表最好也写到MongoDB里以方便维护(我这里省麻烦就没写入了)。

如果你需要用到所有股票,请调tushare的stock_basic接口:

data = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')

这个接口能返回当前所有正常上市的股票列表。

最后,将这些股票数据写入到MongoDB中:

def get_stock_daily(start_date, end_date):
    """
    获得A股所有股票日数据

    Args:
        start_date (str): 起始日
        end_date (str): 结束日
    """

    pro = ts.pro_api(token="你的账号token")
    codes = open('./codes.csv', 'r', encoding='utf-8').readlines()

    # 遍历所有股票ID
    for code in codes:
        code = code.strip('\n')

        # 请求tushare数据,并转化为json格式
        df = pro.daily(ts_code=code, start_date=start_date, end_date=end_date)
        data = json.loads(df.T.to_json()).values()

        # 对股票每一天数据进行保存,注意唯一性
        # 这里也可以批量创建,速度更快,但批量创建容易丢失数据
        # 这里为了保证数据的绝对稳定性,选择一条条创建
        for row in data:
            daily.update({"_id": f"{row['ts_code']}-{row['trade_date']}"}, row, upsert=True)

        time.sleep(0.1)

获得请求数据后,将其转置一下,以变成【字段-值】的形式,并转成json.

转成json后就可以保存到数据库中,这里我们选择了一条条数据地插入,而不是批量插入。

因为批量插入在遇到重复值的时候,可能会导致那一批数据全部丢失,对于股票回测而言,丢失数据是致命的。

最后,为了防止请求接口频率过高,设置了一个time.sleep延时。

全部核心代码如上所示,可运行的完整代码可以在【Python实用宝典】后台回复:MongoDB 下载。

3.可视化查看数据

MongoDB可视化查看数据,我推荐NoSQLBooster. 一个免费的MongoDB查看器。

https://nosqlbooster.com/downloads

选择对应系统下载,一路默认安装就能开始使用。

基本上你需要的功能它都有了(这界面其实很像Mysql Workbench)

啊对了,最后别忘记加我们新的交流群,加我好友,备注上面红字语句答案即可进群(防范营销号,大家见谅):

我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注Python实用宝典。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注