从Tushare获取历史行情数据,分为两种,一种是后复权(daily_hfq)数据,一种是不复权(daily)数据,获取到的数据存储在MongoDB数据库中,每个集合(collection)中,数据字段包含如下:

抓取指数历史行情

流程图如下


首先准备好数据库的连接,可查看python对MongoDB数据库的操作,这里在database文件中创建了对MongoDB数据的连接及指定存储的数据库

datebase.py文件

from pymongo import MongoClient

#指定数据库的连接,quant_01是数据库名
DB_CONN = MongoClient('mongodb://127.0.0.1:27017')['quant_01']


在daily_crawler.py文件中完成初始化、数据的获取、储存等操作。

import tushare as ts
from database import DB_CONN
from datetime import datetime
from pymongo import UpdateOne class DailyCrawler:
def __init__(self):
#创建daily数据集(集合)
self.daily = DB_CONN['daily']
#创建daily_hfq数据集(集合)
self.daily_hfq = DB_CONN['daily_hfq']

获取指数历史行情数据(index= true)

def crawl_index(self,begin_date = None,end_date=None):
"""
抓取指数的日k数据
指数行情的主要作用:
1、用来生成交易日历
2、回测时作为收益的对比基准
:param begin_date:开始日期
:param end_date:结束日期
"""
#指定抓取的指数列表,可以增加和改变列表中的值
index_codes = ['000001','000300','399001','399006','399006']
#当前日期
now = datetime.now().strftime('%Y-%m-%d')
#如果没有指定开始日期,则默认当前日期
if begin_date is None:
begin_date = now
#如果没有指定结束日期,则默认当前日期
if end_date is None:
end_date = now
#按指数的代码循环,抓取所有指数信息
for code in index_codes:
#抓取一个指数在一个时间区间的数据
df_daily = ts.get_k_data(code,index=True,start=begin_date,end=end_date)
#保存数据
self.save_data(code,df_daily,self.daily,{'index':True})

获取股票历史数据(index=False)

流程图如下:

获取所有股票行情数据

调用tushare中get_stock_basics()获取所有股票的基本信息,然后将基本信息的索引列表转化为股票代码列表,就得到了所有股票代码

再调用get_k_data()获取不复权、后复权历史价格数据

def crawl(self,begin_date=None,end_date=None):
'''
抓取股票的日k数据,主要包括不复权和后复权两种
:param begin_date:开始日期
:param end_date:结束日期
'''
#通过tushare的基本信息API,获取股票的基本信息
stock_df = ts.get_stock_basics()
#将基本信息的索引列表转换为股票代码列表
codes = list(stock_df.index) #当前日期
now = datetime.now().strftime("%Y-%M-%D") #如果没有指定开始/结束日期,则默认为当前日期
if begin_date is None:
begin_date = now
if end_date is None:
end_date = now for code in codes:
#不复权价格
df_daily = ts.get_k_data(code,start=begin_date,end=end_date,autype=None)
self.save_data(code,df_daily,self.daily,{'index':False})
#后复权价格
df_daily_hfq = ts.get_k_data(code,start=begin_date,end=end_date,autype='hfq')
self.save_data(code,df_daily_hfq,self.daily_hfq,{'index':False})

这里曾经很好奇,为何\(\color{purple}{stock\_df.index}\)就可以获得股票代码呢?

在get_stock_basics()实现源码中,作者将\(\color{purple}{code}\)设为了index,因此该语句才能有效的获取股票代码

保存数据

流程图:

随着数据量的增加,写入速度会变慢,因此需要创建索引,这里对code、date、index三个字段加上索引

创建索引的命令式如下:

db.daily.createIndex({'code':1,'date':1,'index':1})

可通过db.daily.getIndexes()查看索引

保存数据代码:

def save_data(self,code,df_daily,collection,extra_fields =None):
'''
将从网上抓取的数据保存在本地MongoDB中
:param code:股票代码
:param df_daily:包含日线数据的DataFrame
:param collection:储存的数据集
:param extra_fields:除k线数据中保存的字段,需要额外保存的字段
'''
#数据更新的请求列表
update_requests = [] #将DataFrame中的行情数据,生成更新数据的请求
for df_index in df_daily.index:
#将DataFrame中的一行数据转换成dict类型:
doc = dict(df_daily.loc[df_index])
#设置股票代码
doc['code'] = code #如果指定了其他字段,则更行dict
if extra_fields is not None:
doc.update(extra_fields) #生成一条数据库的更新请求
#注意:
#需要在code、date、index三个字段上增加索引,否则随着数据量的增加,写入速度会变慢
#创建索引的命令式:
#db.daily.createIndex({'code':1,'date':1,'index':1})
update_requests.append(
UpdateOne(
{'code':doc['code'],'date':doc['date'],'index':doc['index']},
{'$set':doc},
upsert = True
)
)
#如果写入的请求列表不为空,则都保存在数据库中
if len(update_requests)>0:
#批量写入到数据库中,批量写入可以降低网络IO,提高速度
update_result = collection.bulk_write(update_requests,ordered=False)
print('保存日线数据,代码:%s ,插入:%4d 条,更新:%4d 条'%(code,update_result.upserted_count,update_result.modified_count),flush=True)

程序入口

if __name__ == "__main__":
dc = DailyCrawler()
dc.crawl_index('2015-01-01', '2015-01-06')
dc.crawl('2015-01-01', '2015-01-06')

运行效果:

查看有多少条数据:

从Tushare获取历史行情数据的更多相关文章

  1. Pandas应用案例-股票分析:使用tushare包获取股票的历史行情数据进行数据分析

    目标: 使用tushare包获取股票的历史行情数据 输出该股票所有收盘比开盘上涨3%以上的日期 输出该股票所有开盘比前日收盘跌幅超过2%以上的日期 假如为我们从2010年1月1日开始,每月第一个交易日 ...

  2. TuShare获取K线数据

    Tushare是一个免费.开源的python财经数据接口包.主要实现对股票等金融数据从数据采集.清洗加工 到 数据存储的过程,能够为金融分析人员提供快速.整洁.和多样的便于分析的数据,为他们在数据获取 ...

  3. Python3获取股票行情数据(中国个股/中国指数/全球指数)

    #!/usr/local/bin/python3 #coding=utf-8 #source http://www.cnblogs.com/txw1958/ import os, io, sys, r ...

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

    接口:daily 数据说明:交易日每天15点-16点之间.本接口是未复权行情,停牌期间不提供数据. 调取说明:基础积分每分钟内最多调取200次,每次4000条数据,相当于超过18年历史,具体请参阅本文 ...

  5. 使用tushare获取股票历史数据和实时分笔数据

    使用tushare获取股票历史数据和实时分笔数据   财经数据接口包tushare的使用(一) Tushare是一款开源免费的金融数据接口包,可以用于获取股票的历史数据.年度季度报表数据.实时分笔数据 ...

  6. 使用TuShare下载历史逐笔成交数据并生成1分钟线

    使用如下代码从TuShare下载沪深300每只股票的历史成交记录并按股票.日期保存到本地.主要是为了以后查询方便快速. #-*- coding: utf-8 -*- import numpy as n ...

  7. 数字货币比特币以太坊买卖五档行情数据API接口

    数字货币比特币以太坊买卖五档行情数据API接口       数字货币一般包含比特币BTC.以太坊ETH.瑞波币XRP.泰达币USDT.比特币现金BCH.比特币SV.莱特币LTC.柚子币EOS.OKB. ...

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

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

  9. python调用tushare获取沪深A股票资金流向数据

    接口:moneyflow 描述:获取沪深A股票资金流向数据,分析大单小单成交情况,用于判别资金动向 限量:单次最大提取4000行记录,总量不限制 积分:用户需要至少1500积分才可以调取,基础积分有流 ...

  10. 如何获取东方财富文华新浪财经实时行情数据API接口

    BIGI行情期货外汇股指A股期权实时行情数据文华新浪财经API接口新浪财经并非实时行情数据源,所以获取的行情数据源也并非实时的.以下介绍的方法和新浪财经获取行情数据源的方法是一致的.需要实时行情数据源 ...

随机推荐

  1. 使用JAVA8 filter对List多条件筛选

    记录项目开发的过程中遇到的一些问题及解决方法,由于公司操作数据库都是统一使用工具生成的存在一些多表查询模糊查询,这些操作只能在集合方面下手了,比如发送邮件记录方面查询,对用户的名字及邮件模糊检索 年龄 ...

  2. autMan奥特曼机器人-代理池配置教程

    一.优势: 全可视化 稳如老牛(从2.8.6开始) 隧道代理和接口获取,使用灵活 代理池运行状态指令可查:代理池 二.启用代理池并设置服务端口 代理池的启用与关闭,均为重启autMan生效 设置隧道代 ...

  3. .net 8 C# 集成 AWS Cognito SMS/Email 注册与登录

    本文主要分为三个部分: 1.描述 cognito 涉及的专业术语 以及 交互流程 2..net 集成的代码 3.感想 * 阅读提示 :鼠标悬停在 章节标题 上可见 文章目录 1. Cognito 概念 ...

  4. 解决Mac M芯片 Wireshark 运行rvictl -s 后,出现Starting device failed

    前言 mac os big sur 之后,苹果系统的安全性能提升,导致 rvictl -s 创建虚拟网卡失败. $ rvictl -s 000348120-001621w21184C01E boots ...

  5. go 结构体多字段多因素排序

    前言 有时候我们需要处理一份数据,需要多个字段作为条件,联合进行排序. 代码 package main import ( "fmt" "sort" ) // 数 ...

  6. php处理跨域

    1.允许所有域名访问 header('Access-Control-Allow-Origin: *'); 2.允许单个域名访问 header('Access-Control-Allow-Origin: ...

  7. Java24你发任你发,我用Java8

    大家好,我是晓凡. 各位 Java 开发者们!是不是还在为 Java 23 的新特性忙得焦头烂额? 别急,Java 24 已经悄咪咪地发布了! 这可是自 Java 21 以来的第三个非长期支持版本,而 ...

  8. pandas -- 处理非数值型数据 -- 数据分析三剑客(核心)

    博客地址:https://www.cnblogs.com/zylyehuo/ 开发环境 anaconda 集成环境:集成好了数据分析和机器学习中所需要的全部环境 安装目录不可以有中文和特殊符号 jup ...

  9. python-argparse用法简介

    1. argparse介绍 argparse是Python标准库中用于解析命令行参数的模块.它提供了一种简洁而灵活的方式来处理命令行参数,包括选项(可选参数)和位置参数(必需参数) 2. argpar ...

  10. php通过Curl给接口上传文件。

    在 PHP 中使用 cURL 上传文件至接口,你可以通过 CURLOPT_POSTFIELDS 选项来设置文件的内容.以下是一个示例: function uploadFile($url, $fileP ...