一个使用python和TUShare进行股票分析的例子

《利用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

初学乍到,欢迎指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章