【手把手教你】Python获取数据

抓住自己最有兴趣的东西,由浅入深,循序渐进地学。

                                                              ——华罗庚

引 言

数据获取是金融量化分析的第一步,找不到可靠、真实的数据,量化分析就无从谈起。随着信息技术的不断发展,数据获取渠道也越来越多,尤其是Python网络爬虫,近几年愈来愈火,网络培训视频和教程满天飞。然而,很多人毕竟精力有限,没有时间专门去学习网络爬虫技术。当然,不会网络爬虫不要紧,我们还可以借助Python的开源数据包(其本质也是网络爬虫),如:tushare、baostock、pandas_datareader和yahool等财经数据API,这样可以节省不少精力。本文将以股票行情数据为例,逐一、简要介绍如何使用这几个开源库获取数据并进行可视化。在介绍使用Python的API获取数据之前,本文首先给出了根据股票涨跌驱动因素,广泛获取求证信息来源,如下面图1、2、3所示,很多网站提供了非结构化的数据(信息),如股票论坛,信息含量非常大,后期考虑使用网络爬虫爬取股票论坛评论数据,建立舆情指标,探讨群体性交易情绪与股价走势的关系。本篇属于Python金融量化入门学习的分享之一,希望能起到抛砖引玉的作用。

图1 股票涨跌驱动因素

图2 公司基本面信息源

图3 知名股票论坛

01 Tushare 社区

公众号上不少文章使用了tushare库获取财经和股票交易数据,当时用的是旧版本(tushare)。Tushare社区目前主要维护新版本:tushare pro,数据更稳定质量更高,可获取沪深股票行情、财务、市场参考等数据,以及指数(含国外股指)、基金、期货、期权、宏观经济、行业经济等财经数据,为金融量化爱好者节省了大量宝贵时间。此外,近期还增加了新闻联播的文本数据,为文本分析和数据挖掘提供了很好的素材。不过,新版本需要注册获取token才能免费使用,注册网址: https://tushare.pro/register?reg=218422 。安装(进入cmd模式):pip install tushare,或升级:pip install tushare --upgrade。下面以股票行情数据为例,展示下tushare如何获取数据。股票行情数据以股票行情数据为例,简要介绍如何获取数据。

#先引入后面分析、可视化等可能用到的库

importtushareasts

importpandasaspd

importmatplotlib.pyplotasplt

#正常显示画图时出现的中文和负号

frompylabimportmpl

mpl.rcParams['font.sans-serif']=['SimHei']

mpl.rcParams['axes.unicode_minus']=False

#设置token

token='你的token'

#ts.set_token(token)

pro = ts.pro_api(token)

个股行情数据:

pro.stock_basic()

参数:is_hs:是否沪深港通标的,N否、H沪股通、S深股通;list_status:上市状态,L上市、D退市、P暂停上市;exchange:交易所 SSE上交所,SZSE深交所,HKEX港交所。 

pro.daily(ts_code= 或 trade_date=)

日行情:daily;周行情:weekly;月行情:monthly

#获取当前上市的股票代码、简称、注册地、行业、上市时间等数据

basic=pro.stock_basic(list_status='L')

#查看前五行数据

#basic.head(5)

#获取平安银行日行情数据

pa=pro.daily(ts_code='000001.SZ', start_date='20180101',

end_date='20190106')

#pa.head()

#K线图可视化

frompyechartsimportKline

pa.index=pd.to_datetime(pa.trade_date)

pa=pa.sort_index()

v1=list(pa.loc[:,['open','close','low','high']].values)

t=pa.index

v0=list(t.strftime('%Y%m%d'))

kline = Kline("平安银行K线图",title_text_size=15)

kline.add("", v0, v1,is_datazoom_show=True,

mark_line=["average"],

mark_point=["max","min"],

mark_point_symbolsize=60,

mark_line_valuedim=['highest','lowest'] )

#kline.render("上证指数图.html")

kline

#定义获取多只股票函数:

defget_stocks_data(stocklist,start,end):

all_data={}

forcodeinstocklist:

all_data[code]=pro.daily(ts_code=code,

start_date=start, end_date=end)

returnall_data

#保存本地

defsave_data(all_data):

forcode,datainall_data.items():

data.to_csv('c:/zjy/stock_data/'+code+'.csv',

header=True, index=False)

stocklist=list(basic.ts_code)[:15]

start=''

end=''

all_data=get_stocks_data(stocklist,start,end)

all_data['000002.SZ'].tail()

#将数据保存到本地

save_data(all_data)

#读取本地文件夹里所有文件

importos

#文件存储路径

file='c:/zjy/stock_data/'

g=os.walk(file)

filenames=[]

forpath,d,filelisting:

forfilenameinfilelist:

filenames.append(os.path.join(filename))

print(filenames)

#将读取的数据文件放入一个字典中

df={}

#从文件名中分离出股票代码

code=[name.split('.')[0]fornameinfilenames]

foriinrange(len(filenames)):

filename=file+filenames[i]

df[code[i]]=pd.read_csv(filename)

#查看第一只股票前五行数据

#df[code[0]].head()

指数数据:pro.index_daily(ts_code=)

defget_index_data(indexs):

'''indexs是字典格式'''

index_data={}

forname,codeinindexs.items():

df=pro.index_daily(ts_code=code)

df.index=pd.to_datetime(df.trade_date)

index_data[name]=df.sort_index()

returnindex_data

#获取常见股票指数行情

indexs={'上证综指':'000001.SH','深证成指':'399001.SZ',

'沪深300':'000300.SH','创业板指':'399006.SZ',

'上证50':'000016.SH','中证500':'000905.SH',

'中小板指':'399005.SZ','上证180':'000010.SH'}

index_data=get_index_data(indexs)

#index_data['上证综指'].head()

#对股价走势进行可视化分析

subjects =list(index_data.keys())

#每个子图的title

plot_pos = [421,422,423,424,425,426,427,428]# 每个子图的位置

new_colors = ['#1f77b4','#ff7f0e','#2ca02c','#d62728',

'#9467bd','#8c564b','#e377c2',

'#7f7f7f','#bcbd22','#17becf']

fig = plt.figure(figsize=(16,18))

fig.suptitle('A股股指走势',fontsize=18)

forposinnp.arange(len(plot_pos)):

ax = fig.add_subplot(plot_pos[pos])

y_data =index_data[subjects[pos]]['close']

b = ax.plot(y_data,color=new_colors[pos])

ax.set_title(subjects[pos])

# 将右上边的两条边颜色设置为空,相当于抹掉这两条边

ax = plt.gca()

ax.spines['right'].set_color('none')

ax.spines['top'].set_color('none')

plt.show()

02 Baostock 证券宝

baostock也是免费、开源的证券数据平台。提供了大量准确、完整的证券历史行情数据、上市公司财务数据等。 通过python API获取证券数据信息,可以满足量化交易投资者、数量金融爱好者、计量经济从业者数据需求。返回的数据格式: pandas DataFrame类型,以便于用pandas/NumPy/Matplotlib进行数据分析和可视化。

证券宝链接地址:http://baostock.com/baostock/index.php/Python_API文档  。安装:进入cmd模式,pip install baostock

importbaostockasbs

#### 登陆系统 ####

lg = bs.login()

#### 获取历史K线数据 ####

# query_history_k_data()

fields="date,code,open,high,low,close"

rs = bs.query_history_k_data("sh.000001", fields,

start_date='2000-01-01', end_date='2018-09-07',

frequency="d", adjustflag="2")

#frequency="d"取日k线,adjustflag="3"默认不复权,

#1:后复权;2:前复权

data_list = []

while(rs.error_code =='0') & rs.next():

# 获取一条记录,将记录合并在一起

data_list.append(rs.get_row_data())

result = pd.DataFrame(data_list, columns=rs.fields)

result.index=pd.to_datetime(result.date)

#### 结果集输出到csv文件 ####

#result.to_csv("c:/zjy/history_k_data.csv", 

#        encoding="gbk", index=False)

result.head()

#### 登出系统 ####

#bs.logout()

result.info()

#将某些object转化numeric

result=result.apply(pd.to_numeric, errors='ignore')

result.info()

result.close.plot(figsize=(16,8))

ax = plt.gca()

ax.spines['right'].set_color('none')

ax.spines['top'].set_color('none')

plt.show()

03 雅虎财经API

原来的雅虎财经Python开源库2018年后已不在维护,还好有大神推出了雅虎财经的修复版本,使用pip install fix_yahoo_finance安装。

importfix_yahoo_financeasfy

fy.pdr_override()

defget_data(tick,start_date="2000-01-01", end_date="2019-01-07"):

data = fy.download(tick, start=start_date, end=end_date)

returndata

tickers=['AAPL','GOOG','AMZN','FB']

all_data = {}

fortickerintickers:

all_data[ticker]=get_data(ticker)

subjects = ['苹果公司股价走势','谷歌公司股价走势',

'亚马逊公司股价走势','FaceBook公司股价走势']

#每个子图的title

plot_pos = [221,222,223,224]# 每个子图的位置

new_colors = ['#1f77b4','#ff7f0e','#2ca02c','#d62728',

'#9467bd','#8c564b','#e377c2',

'#7f7f7f','#bcbd22','#17becf']

fig = plt.figure(figsize=(16,9))

fig.suptitle('美股&指数走势',fontsize=18)

forposinnp.arange(len(plot_pos)):

ax = fig.add_subplot(plot_pos[pos])

y_data = all_data[tickers[pos]]['Adj Close']

b = ax.plot(y_data,color=new_colors[pos])

ax.set_title(subjects[pos])

ax = plt.gca()

ax.spines['right'].set_color('none')

ax.spines['top'].set_color('none')

plt.show()   

WorldStockIndexList = {

'000001.SS':'中国上证指数',

'^DJI':'道琼斯工业平均指数',

'^IXIC':'纳斯达克综合指数',

'^N225':'日本日经225指数',

'^HSI':'香港恒生指数',

'^FCHI':'法国CAC40指数',

'^FTSE':'英国富时100指数',

'^GDAXI':'德国法兰克福DAX指数'}

world_data={}

fortickerinWorldStockIndexList.keys():

world_data[ticker]=get_data(ticker)

subjects =list(WorldStockIndexList.values())

tickers=list(WorldStockIndexList)

#每个子图的title

plot_pos = [421,422,423,424,425,426,427,428]

# 每个子图的位置

new_colors = ['#1f77b4','#ff7f0e','#2ca02c','#d62728',

'#9467bd','#8c564b','#e377c2',

'#7f7f7f','#bcbd22','#17becf']

fig = plt.figure(figsize=(16,18))

fig.suptitle('全球股指走势',fontsize=18)

forposinnp.arange(len(plot_pos)):

ax = fig.add_subplot(plot_pos[pos])

y_data =world_data[tickers[pos]]['Adj Close']

b = ax.plot(y_data,color=new_colors[pos])

ax.set_title(subjects[pos])

ax = plt.gca()

ax.spines['right'].set_color('none')

ax.spines['top'].set_color('none')

plt.show()

关于Python金融量化

专注于分享Python在金融领域的实际应用,包括金融数据分析与挖掘(含文本分析)、金融建模与量化投资等。公众号本身具有AI自动回复功能,具有查询天气、星座运势、专业名词、中英翻译、讲笑话、小故事等功能,关于公众号文章源码及其他资料,可回复“指南”查看详情。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • # -*- coding: utf-8 -*- from __future__ import division f...
    小豆角lch阅读 1,406评论 0 1
  • 一、概述 深度学习的一个重要手段是训练数据和训练过程的可视化,因此,我们关于深度学习的系列介绍文章就从Matplo...
    aoqingy阅读 6,012评论 0 24
  • 前言 有时候为了直观,我们需要将数据可视化,Python编程中最为常用的一个库是matplotlib。那么什么是m...
    TensorFlow开发者阅读 5,267评论 2 47
  • 这套书是小石榴一岁的时候就买了,怕他乱撕,一岁半这样才拿出来看,每一页都是一副风景画,内容丰富,色彩斑斓,...
    小石榴ai妈妈阅读 667评论 0 0
  • 认识你 会假装说嘿,在意什么 我们要珍惜的是现在 却不知道我会一次次翻看你的过往 并不是嫉妒 只是有些深情你未曾给...
    念南卿阅读 200评论 0 3