Tushare 是一个免费、开源的python财经数据接口包。主要实现对股票等金融数据从数据采集、清洗加工 到 数据存储的过程,能够为金融分析人员提供快速、整洁、和多样的便于分析的数据,为他们在数据获取方面极大地减轻工作量,使他们更加专注于策略和模型的研究与实现上。
使用 Tushare ,可以查询股票的历史数据、当日数据、实时数据,包括交易数据、股票分类数据,基本面数据等。
现在主要是读取历史详细分笔数据到数据库中,记录其历史成交情况或成交分布,可估计大户散户分布、当前存在多少大户、买卖的详情、交易者买卖规律等。
主要涉及的调用函数:
import tushare as ts
#历史分笔
ts.get_tick_data('600848',date='2014-01-09')
#当日历史分
ts.get_today_ticks('601333')
#实时分笔
ts.get_realtime_quotes('000581')
#历史分笔 和 当日历史分 返回结果
time:时间
price:成交价格
pchange:涨跌幅
change:价格变动
volume:成交手
amount:成交金额(元)
type:买卖类型【买盘、卖盘、中性盘】
先创建数据库,保持到 sql server 中:
CREATE TABLE [dbo].[Fenbi](
[index] [INT] IDENTITY(1,1) NOT NULL,
[code] [varchar](10) NULL,
[date] [date] NULL,
[time] [time] NULL,
[price] [float] NULL,
[change] [float] NULL,
[volume] [int] NULL,
[amount] [bigint] NULL,
[type] [varchar](10) NULL
) ON [PRIMARY]
GO
#-*- coding: utf-8 -*-
# python 3.5.0
__author__ = 'HZC'
import pymssql
import sqlalchemy
import numpy as np
import pandas as pd
import tushare as ts
import datetime as dt
class STOCK:
def __init__(self):
self.engine = sqlalchemy.create_engine("mssql+pymssql://kk:kk@HZC/DemoDB")
def getDateToStr(self,date):
return dt.datetime.strftime(date,'%Y-%m-%d')
def getStrToDate(self,str):
return dt.datetime.strptime(str,'%Y-%m-%d')
#返回日期之间的所有日期列表
def getRangeDateList(self,startdate,enddate):
list = []
py_start = self.getStrToDate(startdate)
py_end = self.getStrToDate(enddate)
py_now = pd.datetime.now()
#日期大于等于今天的排除
if (py_now-py_end).days <= 0:
py_end = py_now + dt.timedelta(days = -1)
day_diff = (py_end-py_start).days + 1
for d in range(day_diff):
day_curr = py_start + dt.timedelta(days=d)
#周末排除
if day_curr.weekday()<5:
list.append(self.getDateToStr(day_curr))
return list
#一只股票当天的分笔数据
def getTodayTicksByCode(self,code):
try:
df = ts.get_today_ticks(code)
except Exception as err:
print("读取当天分笔失败:%s" % err)
return df
#一只股票某天的分笔数据
def getHistoryTicksByCodeAndDate(self,code,datestr):
try:
df = ts.get_tick_data(code,date=datestr,pause=1)
except Exception as err:
print("读取历史分笔失败:%s" % err)
return df
#当天分笔数据处理
def getOneHistoryTicks(self,codelist):
dtn = self.getDateToStr(pd.datetime.now())
if len(codelist)!=0:
for c in range(len(codelist)):
df = self.getTodayTicksByCode(codelist[c])
if df.empty:
pass
else:
print("code: %s , date: %s" % (codelist[c], dtn))
df['change'] = df['change'].replace('--', '')
df['code'] = codelist[c]
df['date'] = dtn
df = df[['code','date','time','price','change','volume','amount','type']]
df.to_sql("Fenbi", self.engine, index=False, if_exists='append')
#遍历所有历史股票和日期数据处理
def getAllHistoryTicks(self,codelist,startdate,enddate):
datelist = self.getRangeDateList(startdate,enddate)
if len(codelist)!=0 and len(datelist)!=0:
for c in range(len(codelist)):
for d in range(len(datelist)):
try:
df = self.getHistoryTicksByCodeAndDate(codelist[c], datelist[d])
if df.empty:
pass
else:
print ("code: %s , date: %s" % (codelist[c], datelist[d]))
df['change'] = df['change'].replace('--', '')
df['code'] = codelist[c]
df['date'] = datelist[d]
df.to_sql("Fenbi", self.engine, index=False, if_exists='append')
#print(df[['code','date','time','price','change','volume','amount','type']])
except Exception as err:
print("读取失败:%s" % err)
else:
print("请输入有效查询信息!")
if __name__ == "__main__":
st = STOCK()
codelist = ['600543']
st.getAllHistoryTicks(codelist,'2017-12-01','2017-12-28')#历史所有分笔
#st.getOneHistoryTicks(codelist) #当天所有分笔
读取一段时间后可能出现网络连接失败,读取不了!!~这是可以手动终止,重新设置日期,等会再次执行。
也许是有限制了吧。部分结果如下:
参考:Tushare 财经数据接口包