最近股票行情不太好啊…… 可能很多朋友都想用Python分析一下股票數(shù)據(jù),來看看自己的股票是否值得持有,或者判斷某支股票是否值得建倉。那么問題來了,數(shù)據(jù)在哪里呢? 我曾經(jīng)寫了一個(gè)腳本,用于抓取每日的行情數(shù)據(jù)并存儲(chǔ)到數(shù)據(jù)庫中,并且用crontab設(shè)置了讓它每天收盤后執(zhí)行。但是現(xiàn)在,我發(fā)現(xiàn)了一個(gè)更加方便的手段,可以快速獲取股票的行情數(shù)據(jù)! 這種方法就是使用Tushare提供的免費(fèi)數(shù)據(jù)接口。Tushare API提供了對(duì)Python、R、HTTP、Matlab的支持,這對(duì)于我們個(gè)人開發(fā)者來說再好不過了! 在Tushare的官方網(wǎng)站上有詳細(xì)的安裝和調(diào)用教程,感興趣的可以先安裝下。https:///document/1。 假如你已經(jīng)安裝完成,那么接下來,就要開始我們的魔法了! 一、獲取上證指數(shù)歷史行情數(shù)據(jù) import tushare as ts
import pandas as pd
# 設(shè)置token,只需要在第一次調(diào)用或者token失效時(shí)設(shè)置
# 設(shè)置完成后,之后就不再需要這一個(gè)命令了
# ts.set_token('*******')
pro = ts.pro_api()
df_daily = pro.index_daily(ts_code='000001.SH')
df_daily.head()
可以看到,簡單的幾行命令,我們就成功獲得了上證指數(shù)每日的行情數(shù)據(jù),而且還是超級(jí)方便的pandas DataFrame格式呢!從數(shù)據(jù)中,我們看到Tushare提供了收盤價(jià)、開盤價(jià)、最高價(jià)、最低價(jià)、昨日收盤價(jià)、漲幅、百分比漲幅、成交量和成交額這些字段。 二、處理日期 我們注意到日期的格式不太符合我們的要求,還好pandas對(duì)于時(shí)間序列處理提供了良好的支持。我們可以先把日期對(duì)象轉(zhuǎn)換為datetime對(duì)象,以方便后續(xù)的使用。同時(shí)我們將時(shí)間設(shè)置為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)
可以看到,我們已經(jīng)成功完成了格式轉(zhuǎn)換。 三、繪制歷史收盤價(jià)曲線 import seaborn as sns
# 設(shè)置為seaborn的樣式,更美觀
sns.set()
# 繪制收盤價(jià)曲線
df.plot(y='close');
四、繪制均線 我們知道,股票行情受各種因素影響,波動(dòng)較大,因此我們經(jīng)常會(huì)用均線來作為一個(gè)穩(wěn)定趨勢的參考。今天我們就以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年以來的數(shù)據(jù),看到這幅圖,不禁開始心疼A股韭菜。曾經(jīng)以為的慢牛,沒想到只是一個(gè)反彈…… 同時(shí)我們也注意到了今年以來60日線對(duì)于上證指數(shù)的強(qiáng)大壓制力,不過觀察歷史趨勢我們還可以發(fā)現(xiàn)一點(diǎn),那就是一旦實(shí)現(xiàn)對(duì)60日線的有效突破,那就至少會(huì)有一段行情(雖然有時(shí)可能僅有一個(gè)小波段……) 五、查看估值水平 Tushare還提供了接口用于獲取每天的各項(xiàng)指標(biāo),其中就包含了我們接下來要查看的PE水平。 df_basic = pro.index_dailybasic(ts_code='000001.SH')
df_basic.head()
可以看到,這里有總市值、流通市值、總股本、流通股本、換手率、基于流通股本的換手率、PE(市盈率)、動(dòng)態(tài)PE、PB(市凈率)這些字段。 那我們就來用動(dòng)態(tài)市盈率數(shù)據(jù)來看下當(dāng)前A股上證的估值水平。 plt.figure(figsize=(12, 6))
sns.distplot(df_basic.pe_ttm, bins=100)
plt.axvline(x=df_basic.pe_ttm[0], color='red');
看起來,雖然當(dāng)前的動(dòng)態(tài)市盈率處于絕對(duì)的低位,但是仍有很多天的動(dòng)態(tài)市盈率在當(dāng)前的水平之下。那我們再看一下比當(dāng)前估值水平更低的情況都出現(xiàn)在哪些時(shí)期。 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股上證的估值水平比現(xiàn)在還要低。那么如果真的要跌到這個(gè)水平的話,上證指數(shù)還要下跌多少?我們來算一下。 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%……別怕,這個(gè)并不是真的要再跌20%,只是說在14、15年期間,上證磨底一直將PE磨到了8.9的水平,然后爆發(fā)了一波直接上漲到了23。所以說磨得越久,能量積蓄就越足。 韭菜們,有點(diǎn)耐心哈!另外祝大家多多發(fā)財(cái)!圣誕快樂! |
|