tushare获取股票每日重要的基本面指标数据,并存入Elasticsearch

tushare是一个开放的,免费的金融数据平台,包含沪深股票数据,指数数据,基金数据,期货数据,期权数据,债券数据,外汇数据,港股数据,行业经济数据,宏观经济数据以及新闻快讯等特色数据。其中以沪深股票数据最为丰富,包含了有:

基本包含了沪深股票全部常用数据。

tushare 目前提供了四种获取数据的方式,分别为 http, Python SDK, Matlab SDK, R SDK。

这里介绍如何用Python SDK获取股票的每日指标数据。

(1)注册tushare用户,获取 token

注册网页链接为 https://tushare.pro/register?reg=285215

注册完成后可以在个人主页的接口TOKEN下看到自己的token

(2)安装 tushare

个人使用的python开发的IDE为 pycharm

pip install tushare -i https://pypi.tuna.tsinghua.edu.cn/simple

tushare依赖了numpy,pandas等一些库,安装完之后可能需要根据报错提示安装对应的库

(4)安装Elasticsearch

pip3 install elasticsearch -i https://pypi.tuna.tsinghua.edu.cn/simple

(5)调用tushare

这里把调用tushare的函数都封装在了一个文件里面,代码如下

import datetime
import time
import numpy as np
import tushare as ts

ts.set_token(‘b15148f5ca285bd0e85bbc3f659daefff549ade3bba06fae6a037f03‘)
pro = ts.pro_api()

# 股票列表
def get_all_stock():
    stocks = pro.stock_basic(exchange=‘‘, list_status=‘L‘, fields=‘ts_code,symbol,name,fullname,area,industry,list_date‘)
    return stocks

# 每日指标
def get_daily_basic(share_code, start_date, end_date):
    while 1:
        try:
            df = pro.daily_basic(ts_code=share_code, start_date=start_date, end_date=end_date, timeout=60)
            return df
        except:
            print("get_daily_basic 获取失败,参数为:", share_code, start_date, end_date)
            time.sleep(0.5)

stock_basic接口用于获取股票列表,本接口文档网址:https://tushare.pro/document/2?doc_id=25

daily_basic接口用于获取每日指标,网址:https://tushare.pro/document/2?doc_id=32。 这里用一个循环来获取,因为tushare对每分钟调用次数有限制(这也是为啥我要把数据保存到本地),超过次数限制时会报错,所以我这里用一个except获取异常,等待0.5s后重新再试。

(6)保存到elasticsearch

保存到elasticsearch之前当然需要本机已经启动了elasticsearch。

关于elasticsearch的安装配置见我的另一篇博客https://www.cnblogs.com/betterwgo/p/11240821.html

python 调用 tushare,并将数据保存到elasticsearch的代码如下:

# 每日指标
import configparser
import logging

import numpy as np
from elasticsearch import Elasticsearch
from elasticsearch import helpers

import stock_parser as parser

logger = logging.getLogger(__name__)
logger.setLevel(level=logging.INFO)
handler = logging.FileHandler("log_daily_basic.txt")
handler.setLevel(logging.INFO)
formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘)
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info("Start print log")

config = configparser.ConfigParser()
config.read("config.ini")
latest_daily_basic_tscode = config.get("daily", "latest_daily_basic_tscode")

es = Elasticsearch([{‘host‘: ‘127.0.0.1‘, ‘port‘: 9200}])

# ts_code                str    TS股票代码
# trade_date            str    交易日期
# close                    float    当日收盘价
# turnover_rate            float    换手率(%)
# turnover_rate_f        float    换手率(自由流通股)
# volume_ratio            float    量比
# pe                    float    市盈率(总市值/净利润)
# pe_ttm                float    市盈率(TTM)
# pb                    float    市净率(总市值/净资产)
# ps                    float    市销率
# ps_ttm                float    市销率(TTM)
# total_share            float    总股本 (万股)
# float_share            float    流通股本 (万股)
# free_share            float    自由流通股本 (万)
# total_mv                float    总市值 (万元)
# circ_mv                float    流通市值(万元)
body = {
    "mappings": {
        "properties": {
            "ts_code": {
                "type": "keyword"
            },
            "trade_date": {
                "type": "integer"
            },
            "close": {
                "type": "float"
            },
            "turnover_rate": {
                "type": "float"
            },
            "turnover_rate_f": {
                "type": "float"
            },
            "volume_ratio": {
                "type": "float"
            },
            "pe": {
                "type": "float"
            },
            "pe_ttm": {
                "type": "float"
            },
            "pb": {
                "type": "float"
            },
            "ps": {
                "type": "float"
            },
            "ps_ttm": {
                "type": "float"
            },
            "total_share": {
                "type": "float"
            },
            "float_share": {
                "type": "float"
            },
            "free_share": {
                "type": "float"
            },
            "total_mv": {
                "type": "float"
            },
            "circ_mv": {
                "type": "float"
            }
        }
    }
}
index = ‘index_daily_basic‘
es.indices.create(index=index, body=body, ignore=400)

def check_float(item, x_name):
    x = item[x_name]
    if x is None or np.isnan(x):
        x = 0.0
        logger.info("%s %s %s is None or nan" % (item[‘ts_code‘], item[‘trade_date‘], x_name))
    return x

def es_insert_daily_basic(df):
    actions = []
    for i in range(len(df)):
        df_item = df.iloc[i]
        tscode = df_item[‘ts_code‘]
        trade_date = int(df_item[‘trade_date‘])
        x = tscode.split(‘.‘, 1)
        col_name = x[1] + x[0]
        _id = col_name + df_item[‘trade_date‘]

        close = check_float(df_item, ‘close‘)
        turnover_rate = check_float(df_item, ‘turnover_rate‘)
        turnover_rate_f = check_float(df_item, ‘turnover_rate_f‘)
        volume_ratio = check_float(df_item, ‘volume_ratio‘)
        pe = check_float(df_item, ‘pe‘)
        pe_ttm = check_float(df_item, ‘pe_ttm‘)
        pb = check_float(df_item, ‘pb‘)
        ps = check_float(df_item, ‘ps‘)
        ps_ttm = check_float(df_item, ‘ps_ttm‘)
        total_share = check_float(df_item, ‘total_share‘)
        float_share = check_float(df_item, ‘float_share‘)
        free_share = check_float(df_item, ‘free_share‘)
        total_mv = check_float(df_item, ‘total_mv‘)
        circ_mv = check_float(df_item, ‘circ_mv‘)
        action = {
            "_index": index,
            "_type": "_doc",
            "_id": _id,
            "_source": {
                "ts_code": ts_code,
                "trade_date": trade_date,
                "close": close,
                "turnover_rate": turnover_rate,
                "turnover_rate_f": turnover_rate_f,
                "volume_ratio": volume_ratio,
                "pe": pe,
                "pe_ttm": pe_ttm,
                "pb": pb,
                "ps": ps,
                "ps_ttm": ps_ttm,
                "total_share": total_share,
                "float_share": float_share,
                "free_share": free_share,
                "total_mv": total_mv,
                "circ_mv": circ_mv
            }
        }
        # 形成一个长度与查询结果数量相等的列表
        actions.append(action)
        if i % 1000 == 0 or i == (len(df) - 1):
            helpers.bulk(client=es, actions=actions)
            actions.clear()
    actions.clear()

def update_latest_daily_basic_tscode(tscode):
    config.set("daily", "latest_daily_basic_tscode", tscode)
    # write to file
    with open("config.ini", "w+") as f:
        config.write(f)

# 更新单只股票
def update_daily_basic(tscode, start_date, end_date):
    df = parser.get_daily_basic(tscode, start_date, end_date)
    es_insert_daily_basic(df)
    return len(df)

if __name__ == "__main__":
    # 获取全部上市股票代码
    stocks = parser.get_all_stock()
    bIn = True
    for i in range(len(stocks)):
        stock = stocks.iloc[i]
        ts_code = stock[‘ts_code‘]
        if latest_daily_basic_tscode == ts_code:
            bIn = False
        if not bIn:
            count = update_daily_basic(ts_code, ‘20000101‘, ‘‘)
            print(i, ts_code, count)
            update_latest_daily_basic_tscode(ts_code)
        else:
            print(i, ts_code)

这里日志用的logging,没具体研究一股脑全搬上来了,反正我只需要打印个错误日志就行。

然后还用了一个  configparser 来解析 ini 配置文件,config.ini文件中配置如下信息:

[daily]
latest_daily_basic_tscode = 000001.SZ

配置文件的目的是再程序中断后重新启动不用从第一个开始,直接从配置文件中的开始。获取股票列表的接口的第一条是 000001.SZ,所以这里初始配置为它,这里其实可以优化一下。

数据保存到elasticsearch用的是 helps中的bulk函数,做批量索引

看一下保存的结果情况:

tushare官方网址为: https://tushare.pro/



原文地址:https://www.cnblogs.com/betterwgo/p/11602872.html

时间: 2024-11-05 20:38:03

tushare获取股票每日重要的基本面指标数据,并存入Elasticsearch的相关文章

python+tushare获取股票每日停复牌信息

接口:suspend 更新时间:不定期 描述:获取股票每日停复牌信息 注:tushare模块下载和安装教程,请查阅我之前的文章 输入参数 名称      |      类型      |      必选      |      描述 ts_code      |      str      |      N      |      股票代码(三选一) suspend_date      |      str      |      N      |      停牌日期(三选一) resume_d

使用tushare获取股票实时分笔数据延时有多大

使用tushare获取股票实时分笔数据延时有多大 前几天分享了一段获取所有股票实时数据的代码,有用户积极留言,提出一个非常棒的问题:如果数据本生的延时非常严重,通过代码获取数据再快又有什么用呢? 一直以来我也只是直观感觉延时并不是很长,但没有做过详细的统计,今天统计一下通过上一篇文章分享的方法获取的实时数据,究竟延时有多大. 今天实验用的数据是今天(2017-12-12)使用服务器脚本获取的实时数据的一部分,一共筛选了268只股票,数据只是这一天中的一部分数据,由于开盘了以后才修改的脚本,数据大

python调用tushare获取股票日线实时行情数据

接口:daily 数据说明:交易日每天15点-16点之间.本接口是未复权行情,停牌期间不提供数据. 调取说明:基础积分每分钟内最多调取200次,每次4000条数据,相当于超过18年历史,具体请参阅本文最下方积分获取办法. 描述:获取股票行情数据,或通过通用行情接口获取数据,包含了前后复权数据. 注:tushare包下载和初始化教程,请查阅我之前的文章 输入参数 名称      |      类型      |      必选      |      描述 ts_code      |     

python获取全部股票每日基本面指标,用于选股分析、报表展示等

接口:daily_basic 更新时间:交易日每日15点-17点之间 描述:获取全部股票每日重要的基本面指标,可用于选股分析.报表展示等. 积分:用户需要至少300积分才可以调取,具体请参阅本文最下方积分获取办法 注:tushare库下载和初始化教程,请查阅我之前的文章 输入参数 名称      |      类型      |      必选      |      描述 ts_code      |      str      |      Y      |      股票代码(二选一) t

量化交易者必看:如何获取股票和期货行情数据

量化分析的第一步是取得行情数据.下面归纳了几个提供行情数据的数据源,有免费的,也有收费的,希望能给你的量化分析工作提供帮助. 一.万得 官网:http://www.wind.com.cn/ 老牌数据供应商,内容涵盖股票.债券.基金.衍生品.指数.宏观行业.价格较贵,是机构的首选. 二.Tushare 官网:http://tushare.org/ 著名的免费沪深股票数据接口,包含常用的沪深股票和指数行情.板块分类数据.基本面数据等,是最常用的股票行情数据接口. 三.立得财经数据 官网:http:/

介绍一些基本面指标

应该说,作为股民,都知道,分析股市的方法无非是基本面分析和技术面分析. 相对于基本面,懂得一些技术面的人要多得多,但仍有相当一大部分的股民根本就不懂的什么分析方法.通过基本面分析股票,其实也不难,首先你得懂以下几个个指标. 1.       估测股价指标--市盈率 市盈率是估测股价偏高或者偏低最基本.重要的指标之一. 算法:市盈率=每股市价÷每股盈利 一般认为该比例保持在20-30之间时正常的,过小说明股价低,风险小,值得购买:过大则说明股价高.风险大,购买时应谨慎. PEG是衡量股价是否合适的

实测 《Tensorflow实例:利用LSTM预测股票每日最高价(二)》的结果

近期股市行情牛转熊,大盘一直下探!由3200跌到了2700,想必很多人被深套了.这时想起人工智能能否预测股市趋势?RNN能否起作用? 这时便从网上找下教程,发现网上有个例子,便拿来一试!Tensorflow实例:利用LSTM预测股票每日最高价(二) 这个实例大体上没有大问题,只是有些小细节有问题!要想直接复制运行,是会报错的.首先整下代码过程原作者已经写得很清楚了,但对于初学者来讲,有些地方还是不太明白的.我作为一个初学者,先来谈谈我在整个实测中的收获吧! 实例的思路:通过tushare可以获取

获取股票实时交易数据的方法

http://walsece.iteye.com/blog/169514 炒股有一段时间了,发现现在的股票行情软件在很多情况下并不是太好用,我炒股的时候喜欢看盘口的实时交易记录,如果同时关注多支股票的话,我用过的行情软件没有找到同时观看多支股票盘口交易数据的功能,另外在工作的时候使用目前的行情软件也不太方便.所以打算自己写个专门的行情软件,但是数据源是个最棘手的问题,经过搜索和不懈的努力,找到了两种方式: 通过webservice调用http://www.webxml.com.cn/zh_cn/

TuShare获取K线数据

Tushare是一个免费.开源的python财经数据接口包.主要实现对股票等金融数据从数据采集.清洗加工 到 数据存储的过程,能够为金融分析人员提供快速.整洁.和多样的便于分析的数据,为他们在数据获取方面极大地减轻工作量,使他们更加专注于策略和模型的研究与实现上.考虑到Python pandas包在金融量化分析中体现出的优势,Tushare返回的绝大部分的数据格式都是pandas DataFrame类型,非常便于用pandas/NumPy/Matplotlib进行数据分析和可视化.当然,如果您习