(.1)这篇文章写成的时间较早,使用的读取数据的接口有更新,具体内容请查看:https://tushare.pro/register?reg=365021。
(原内容:)
《利用Python进行数据分析(Python For Data Analysis中文版)》P286 中间有一个例子,使用标普500指数(SPX)和几支股票的收盘价,计算一个日收益率与SPX年度相关系数的DataFrame。
因为担心读取这些数据会存在障碍,其实我也没有真正去试,就萌生了用中国股市数据替代后再进行计算的想法。
在网上找了一些资料,发现使用TUShare读取股票数据较为方便,按https://tushare.pro/和/index.html上的步骤,安装了tushare。
下面介绍与这个例子相关的一些内容。
一、读取股票数据
import tushare as ts# 读取上证指数df = ts.get_hist_data('sh000001')print(df)# 另一种读法df = ts.get_k_data('sh')print(df)# 当然可以指定读取的时间段,如读取1月的数据# 注意日期的写法,如写成'-1-1'会得到不正确的结果df = ts.get_k_data('sh000001', '-01-01', '-01-31')print(df)
二、模仿书中的例子,构造close_px
import tushare as tsimport pandas as pdfrom pandas import DataFrame# 股票集 代码:名称ticks = {'sh601857': 'ZGSY', # 中国石油'sh601398': 'GSYH', # 工商银行'sh600519': 'GZMT', # 贵州茅台'sh000001': '上证'}close_px = DataFrame() # 先建立一个空对象for key, value in ticks.items():df = ts.get_k_data(key, '-01-01', '-12-31') # 逐个读出股票数据# 构造一个中间对象,只使用日期和收盘价# 注意在这里需要把字符串表示的日期转换成日期对象df1 = DataFrame({'date':pd.to_datetime(df['date']),value: df['close']})df1.set_index('date', inplace=True) # 把日期列设为索引close_px = close_px.join(df1, how='outer') # 把整理好的数据合并到close_px中print(close_px) # 构造后的成品,中间有一部分缺失数据,可以是因为还没上市吧
三、完整的代码
import tushare as tsimport pandas as pdfrom pandas import DataFrame# 股票集 代码:名称ticks = {'sh601857': 'ZGSY', # 中国石油'sh601398': 'GSYH', # 工商银行'sh600519': 'GZMT', # 贵州茅台'sh000001': '上证'}close_px = DataFrame() # 先建立一个空对象for key, value in ticks.items():df = ts.get_k_data(key, '-01-01', '-12-31') # 逐个读出股票数据# 构造一个中间对象,只使用日期和收盘价# 注意在这里需要把字符串表示的日期转换成日期对象df1 = DataFrame({'date':pd.to_datetime(df['date']),value: df['close']})df1.set_index('date', inplace=True) # 把日期列设为索引close_px = close_px.join(df1, how='outer') # 把整理好的数据合并到close_px中print(close_px) # 构造后的成品,中间有一部分缺失数据,可以是因为还没上市吧# 以下的代码是照书上抄的,当然根据股票名称做了相应的改动rets = close_px.pct_change().dropna()spx_corr = lambda x: x.corrwith(x['上证'])by_year = rets.groupby(lambda x: x.year)print("\n各支股票与上证指数的相关系数")print(by_year.apply(spx_corr))print("\n中国石油 与 贵州茅台 的相关系数:")print(by_year.apply(lambda g: g['ZGSY'].corr(g['GZMT'])))# 输出的内容与书上稍有区别,可能是中石油上市时间较晚的原因吧
运行结果:
==== RESTART: example03.py ====ZGSY GSYHGZMT 上证date -01-02 NaN NaN 4.319 1320.63-01-03 NaN NaN 4.312 1319.87-01-06 NaN NaN 4.343 1334.68-01-07 NaN NaN 4.303 1332.06-01-08 NaN NaN 4.420 1372.07... ... .........-12-26 8.235 2.881 138.340 2190.11-12-27 8.210 2.881 135.410 2166.21-12-28 8.286 2.895 136.269 2170.01-12-29 8.303 2.902 137.688 2173.56-12-30 8.261 2.930 138.468 2199.42[2185 rows x 4 columns]各支股票与上证指数的相关系数ZGSYGSYHGZMT 上证 0.800647 0.789706 0.434432 1.0 0.855625 0.839435 0.639594 1.0 0.843779 0.808002 0.530355 1.0 0.777748 0.608758 0.351867 1.0 0.700398 0.613596 0.415294 1.0中国石油 与 贵州茅台 的相关系数: 0.355767 0.488143 0.385639 0.138757 0.258366dtype: float64
初学乍到,欢迎指正。