一個使用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

初學乍到,歡迎指正。

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