抓住自己最有兴趣的东西,由浅入深,循序渐进地学。
——华罗庚
引 言
数据获取是金融量化分析的第一步,找不到可靠、真实的数据,量化分析就无从谈起。随着信息技术的不断发展,数据获取渠道也越来越多,尤其是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才能免费使用,注册网址: 。安装(进入cmd模式):pip install tushare,或升级:pip install tushare --upgrade。下面以股票行情数据为例,展示下tushare如何获取数据。股票行情数据以股票行情数据为例,简要介绍如何获取数据。
#先引入后面分析、可视化等可能用到的库import tushare as tsimport pandas as pd import matplotlib.pyplot as plt#正常显示画图时出现的中文和负号from pylab import mplmpl.rcParams[\"font.sans-serif\"]=[\"SimHei\"]mpl.rcParams[\"axes.unicode_minus\"]=False#设置tokentoken=\"你的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线图可视化from pyecharts import Klinepa.index=pd.to_datetime(pa.trade_date)pa=pa.sort_index()v1=list(pa.loc[:,[\"open\",\"close\",\"low\",\"high\"]].values)t=pa.indexv0=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
#定义获取多只股票函数:def get_stocks_data(stocklist,start,end): all_data={} for code in stocklist: all_data[code]=pro.daily(ts_code=code, start_date=start, end_date=end) return all_data#保存本地def save_data(all_data): for code,data in all_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)#读取本地文件夹里所有文件import os#文件存储路径file=\"c:/zjy/stock_data/\"g=os.walk(file)filenames=[]for path,d,filelist in g: for filename in filelist: filenames.append(os.path.join(filename))print(filenames)#将读取的数据文件放入一个字典中df={}#从文件名中分离出股票代码code=[name.split(\".\")[0] for name in filenames]for i in range(len(filenames)): filename=file+filenames[i] df[code[i]]=pd.read_csv(filename)#查看第一只股票前五行数据#df[code[0]].head()
指数数据:pro.index_daily(ts_code=)
def get_index_data(indexs): \"\"\"indexs是字典格式\"\"\" index_data={} for name,code in indexs.items(): df=pro.index_daily(ts_code=code) df.index=pd.to_datetime(df.trade_date) index_data[name]=df.sort_index() return index_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())#每个子图的titleplot_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)for pos in np.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进行数据分析和可视化。证券宝链接地址:文档 。安装:进入cmd模式,pip install baostockimport baostock as bs
# 登陆系统#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转化numericresult=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安装。
import fix_yahoo_finance as fyfy.pdr_override()def get_data(tick,start_date="2000-01-01", end_date="2019-01-07"): data = fy.download(tick, start=start_date, end=end_date) return datatickers=[\"AAPL\", \"GOOG\",\"AMZN\",\"FB\"]all_data = {}for ticker in tickers: all_data[ticker]=get_data(ticker)subjects = [\"苹果公司股价走势\",\"谷歌公司股价走势\", \"亚马逊公司股价走势\",\"FaceBook公司股价走势\"] #每个子图的titleplot_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)for pos in np.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={}for ticker in WorldStockIndexList.keys(): world_data[ticker]=get_data(ticker)subjects =list(WorldStockIndexList.values())tickers=list(WorldStockIndexList)#每个子图的titleplot_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)for pos in np.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()
师傅很专业,对这个问题非常熟悉,很快处理好了,收费又合理
上门速度很快速,快速帮我弄好了,非常及时
困扰我好久的问题了,这个师傅很靠谱帮我解决了难题