介绍:考虑到长远的未来,如果我们想要加快回测运行速度,就要分布式地在不同的机器上进行策略回测。那么将股票数据保存到数据库上则是必然的选择,因为这样每台服务器都能够直接连接到同一个数据库拉到数据,管理起来方便许多。
今天我们就先讲讲如何使用MongoDB保存股票数据。

准备

python依赖环境

开始之前,你要确保Pythonpip已经成功安装在电脑上或者服务器上,我是服务器上用JupyterLab完成的,具体请看JupyterLab,极其强大的下一代notebook!

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

pip install tushare
pip install pymongo

或者在JupyterLab


# Python2
! pip install tushare
! pip install pymongo

# Python3
! pip install tushare
! pip install pymongo

安装mongodb

  • 服务器用户可安装宝塔再一键
  • 本地用户官网下载安装宝安装

我用的是阿里云的云Mongodb数据库

Tushare 股票数据接口

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

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

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

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

编写代码

首先,学会连接MongoDB数据库并创建集合(表),也就3行代码的事情(我链接的是远程阿里云数据库,所以用的第二个,如果你是本地,请用第一个,推荐一个免费的Mongodb:免费获取 MongoDB 云数据库):

这样就能连接远程(或者本地)MongoDBstock数据库,如果该库不存在,当你往集合中插入数据的时候,就会自动新建数据库。

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

其次,拿到股票数据:

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

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

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

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

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

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

获得请求数据后,将其使用.T进行转置,以变成【字段-值】的形式,并转成json.

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

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

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

完整代码

注意事项

  • 依赖:pymongotushare
  • 修改:你的下载目录路径
'''*************************************************
Copyright (Python), 2020-,Literature Tech. Co., Ltd.
source:    None
Author:    Written by Literature
Version:   1.0
Date:      2020.07.19
Description:  
Others:   None
Function List:  main
History:  The first edition 2020.07.19
*************************************************'''
import pymongo
import time
import json
import tushare as ts

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

# 云数据库
client = pymongo.MongoClient(host='链接地址', port=27017)

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

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

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

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

    pro = ts.pro_api(token="填写你的Token")
    # w注意修改你的路径,可默认
    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.5)
get_stock_daily("20180101", "20200627")

代码运行效果

云数据库状态

已建立表,程序设定0.5的休眠时间,可能数据调用慢

运行完了查看,已有数据


【腾讯云】星星海SA2云服务器618钜惠,1核2G 首年95元【点击查看】。


文章: 《Python 获取股票数据并存入MongoDB教程》
联系方式:
文章链接:https://wxiou.cn/index.php/archives/107/
除特别注明外,文章均为Literature原创,转载时请注明本文出处及文章链接
Last modification:July 24th, 2020 at 06:58 pm
如果觉得我的文章对你有用,请随意赞赏