《利用Python进行数据分析(Python For Data Analysis中文版)》P286 中间有一个例子,使用标普500指数(SPX)和几支股票的收盘价,计算一个日收益率与SPX年度相关系数的DataFrame。
因为担心读取这些数据会存在障碍,其实我也没有真正去试,就萌生了用中国股市数据替代后再进行计算的想法。
在网上找了一些资料,发现使用TUShare读取股票数据较为方便,按https://tushare.pro/和http://tushare.org/index.html上的步骤,安装了tushare。
下面介绍与这个例子相关的一些内容。
一、读取股票数据
import tushare as ts
# 读取上证指数
df = ts.get_hist_data('sh000001')
print(df)
# 另一种读法
df = ts.get_k_data('sh')
print(df)
# 当然可以指定读取的时间段,如读取2019年1月的数据
# 注意日期的写法,如写成'2019-1-1'会得到不正确的结果
df = ts.get_k_data('sh000001', '2019-01-01', '2019-01-31')
print(df)
二、模仿书中的例子,构造close_px
import tushare as ts
import pandas as pd
from 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, '2003-01-01', '2011-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) # 构造后的成品,中间有一部分缺失数据,可以是因为2003年还没上市吧
三、完整的代码
import tushare as ts
import pandas as pd
from 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, '2003-01-01', '2011-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) # 构造后的成品,中间有一部分缺失数据,可以是因为2003年还没上市吧
# 以下的代码是照书上抄的,当然根据股票名称做了相应的改动
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 GSYH GZMT 上证
date
2003-01-02 NaN NaN 4.319 1320.63
2003-01-03 NaN NaN 4.312 1319.87
2003-01-06 NaN NaN 4.343 1334.68
2003-01-07 NaN NaN 4.303 1332.06
2003-01-08 NaN NaN 4.420 1372.07
... ... ... ... ...
2011-12-26 8.235 2.881 138.340 2190.11
2011-12-27 8.210 2.881 135.410 2166.21
2011-12-28 8.286 2.895 136.269 2170.01
2011-12-29 8.303 2.902 137.688 2173.56
2011-12-30 8.261 2.930 138.468 2199.42
[2185 rows x 4 columns]
各支股票与上证指数的相关系数
ZGSY GSYH GZMT 上证
2007 0.800647 0.789706 0.434432 1.0
2008 0.855625 0.839435 0.639594 1.0
2009 0.843779 0.808002 0.530355 1.0
2010 0.777748 0.608758 0.351867 1.0
2011 0.700398 0.613596 0.415294 1.0
中国石油 与 贵州茅台 的相关系数:
2007 0.355767
2008 0.488143
2009 0.385639
2010 0.138757
2011 0.258366
dtype: float64
初学乍到,欢迎指正。