今天我們的目的并不是完全掌握Python量化分析,僅僅是作為入門引領(lǐng)呵曹,開啟一扇新的大門款咖。在之后的日子里,我會(huì)不定時(shí)地分享更多關(guān)于時(shí)間序列分析奄喂、量化分析的內(nèi)容铐殃,歡迎關(guān)注、收藏跨新、轉(zhuǎn)發(fā)富腊!
最近股票行情不太好啊……
可能很多朋友都想用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://tushare.pro/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()
可以看到含懊,簡(jiǎn)單的幾行命令身冬,我們就成功獲得了上證指數(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)定趨勢(shì)的參考格了。今天我們就以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)大壓制力,不過觀察歷史趨勢(shì)我們還可以發(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)前的水平之下。那我們?cè)倏匆幌卤犬?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)!圣誕快樂弧哎!