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

(2021.1)这篇文章写成的时间较早,使用的读取数据的接口有更新,具体内容请查看:https://tushare.pro/register?reg=365021

 

 

(原内容:)

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

初学乍到,欢迎指正。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值