Python分析上證指數歷史數據,發現估值還不夠低……

今天我們的目的並不是完全掌握Python量化分析,僅僅是作為入門引領,開啟一扇新的大門。在之後的日子裡,我會不定時地分享更多關於時間序列分析、量化分析的內容,歡迎關注、收藏、轉發!

最近股票行情不太好啊……

可能很多朋友都想用Python分析一下股票數據,來看看自己的股票是否值得持有,或者判斷某支股票是否值得建倉。那麼問題來了,數據在哪裡呢?

我曾經寫了一個腳本,用於抓取每日的行情數據並存儲到資料庫中,並且用crontab設置了讓它每天收盤後執行。但是現在,我發現了一個更加方便的手段,可以快速獲取股票的行情數據!

這種方法就是使用Tushare提供的免費數據介面。Tushare API提供了對Python、R、HTTP、Matlab的支持,這對於我們個人開發者來說再好不過了!

在Tushare的官方網站上有詳細的安裝和調用教程,感興趣的可以先安裝下。tushare.pro/document/1

假如你已經安裝完成,那麼接下來,就要開始我們的魔法了!

一、獲取上證指數歷史行情數據

import tushare as ts
import pandas as pd

# 設置token,只需要在第一次調用或者token失效時設置
# 設置完成後,之後就不再需要這一個命令了
# ts.set_token(*******)

pro = ts.pro_api()
df_daily = pro.index_daily(ts_code="000001.SH")
df_daily.head()

可以看到,簡單的幾行命令,我們就成功獲得了上證指數每日的行情數據,而且還是超級方便的pandas DataFrame格式呢!從數據中,我們看到Tushare提供了收盤價、開盤價、最高價、最低價、昨日收盤價、漲幅、百分比漲幅、成交量和成交額這些欄位。

二、處理日期

我們注意到日期的格式不太符合我們的要求,還好pandas對於時間序列處理提供了良好的支持。我們可以先把日期對象轉換為datetime對象,以方便後續的使用。同時我們將時間設置為index。

df_daily.index = pd.to_datetime(df_daily[trade_date])
df_daily.index[:5]

輸出為:

DatetimeIndex([2018-12-25, 2018-12-24, 2018-12-21, 2018-12-20,
2018-12-19],
dtype=datetime64[ns], name=trade_date, freq=None)

可以看到,我們已經成功完成了格式轉換。

三、繪製歷史收盤價曲線

import seaborn as sns

# 設置為seaborn的樣式,更美觀
sns.set()

# 繪製收盤價曲線
df.plot(y="close");

四、繪製均線

我們知道,股票行情受各種因素影響,波動較大,因此我們經常會用均線來作為一個穩定趨勢的參考。今天我們就以60日均線為例看下如何使用Python繪製均線。

import matplotlib.pyplot as plt

df_daily = df_daily.sort_index(ascending=True)
plt.figure(figsize=(12, 6))
df_daily.close[20150101:].plot()
df_daily.close.rolling(60).mean()[20150101:].plot();

考慮到展示效果的問題,我們僅截取了2015年以來的數據,看到這幅圖,不禁開始心疼A股韭菜。曾經以為的慢牛,沒想到只是一個反彈……

同時我們也注意到了今年以來60日線對於上證指數的強大壓制力,不過觀察歷史趨勢我們還可以發現一點,那就是一旦實現對60日線的有效突破,那就至少會有一段行情(雖然有時可能僅有一個小波段……)

五、查看估值水平

Tushare還提供了介面用於獲取每天的各項指標,其中就包含了我們接下來要查看的PE水平。

df_basic = pro.index_dailybasic(ts_code=000001.SH)
df_basic.head()

可以看到,這裡有總市值、流通市值、總股本、流通股本、換手率、基於流通股本的換手率、PE(市盈率)、動態PE、PB(市凈率)這些欄位。

那我們就來用動態市盈率數據來看下當前A股上證的估值水平。

plt.figure(figsize=(12, 6))
sns.distplot(df_basic.pe_ttm, bins=100)
plt.axvline(x=df_basic.pe_ttm[0], color=red);

看起來,雖然當前的動態市盈率處於絕對的低位,但是仍有很多天的動態市盈率在當前的水平之下。那我們再看一下比當前估值水平更低的情況都出現在哪些時期。

df_basic.index = pd.to_datetime(df_basic["trade_date"])
plt.figure(figsize=(12, 6))
plt.plot(df_basic.pe_ttm)
plt.axhline(y=df_basic.pe_ttm[0], color="red");

看起來主要14、15年的階段底部期間,A股上證的估值水平比現在還要低。那麼如果真的要跌到這個水平的話,上證指數還要下跌多少?我們來算一下。

now = df_basic.pe_ttm[0]
min = df_basic.pe_ttm.min()
ratio = (now - min) / now
print("ratio: {0:.2f}%".format(ratio * 100))

輸出為:

ratio: 19.96%

還有20%……別怕,這個並不是真的要再跌20%,只是說在14、15年期間,上證磨底一直將PE磨到了8.9的水平,然後爆發了一波直接上漲到了23。所以說磨得越久,能量積蓄就越足。

韭菜們,有點耐心哈!另外祝大家多多發財!聖誕快樂!


推薦閱讀:

TAG:Python | 量化 | 股票 |