第十課-Python金融學基礎——夏普比率(Sharpe-ratio)和資產組合價值(portfolio-value)

第十課-Python金融學基礎——夏普比率(Sharpe-ratio)和資產組合價值(portfolio-value)

4 人贊了文章

前面的課程主要是在研究Pandas的時序分析實現,以及利用statsmodel對時序數據進行ARIMA以及有權重的ARIMA模型的建模,並嘗試預測未來的走向。從這節課開始,我們正式進入Python金融學基礎,會介紹一些金融學的概念和實現方法。

本節課主要以蘋果、亞馬遜、IBM、思科以及沃爾瑪的股票市場價格為原始數據,分析這幾隻股票的資產組合的計算方式和夏普比率的計算,其中會涉及到日收益率、累積收益率的計算等等。

本文主要流程:

一、基本概念

1.1 資產組合

我們的資產往往不是單一的,我們會同時購買好幾支股票或者基金,這樣總資產的收益其實是每個資產的按照比例的權重加和結果,並且如果購買的資產之間具有對沖,我們還能夠利用這點來降低風險,減少總資產損失的不確定性。比如王婆一個兒子賣傘和一個兒子賣鞋的故事就是這樣,只要天放晴,賣鞋兒子生意好,但是傘賣不出去;同理,天下雨的時候賣傘的兒子生意好,鞋子賣不出去。其實天氣就是波動,或說在這裡就是風險,但是王婆家兩個兒子賣的東西其實有對沖的作用,也就是不管是天晴天陰,家裡都會有生意,因此就降低了風險可能帶來的損失。這就是一個資產組合。

1.2 夏普比率

夏普指數是一個用於計算根據風險調整過的回報率的測量指標,說白了,就是說我們只要做投資,就肯定會有風險,但在相同的回報率下,風險有可能不一樣,正常人在這個時候肯定都會選擇風險小的,那麼我們需要一個指標來評判在相同單位風險上,哪個收益大?或者說在收益相同的情況下,哪些風險不必要冒?所以夏普比率相當於是用風險把收益率給平均化了,放到太陽底下去看看每份相同的風險下收益率的大小是多少。

計算公式如下:

Sharpe Ratio=(Mean of portfolio return - Risk-free return) / standard deviation of portfolio return

這個公式Mean of portfolio return就是投資組合的收益率的平均值,risk-free return就是當地沒有風險的回報率,也就是放在銀行當中的回報率,比如美國的銀行利率就接近於0,standard deviation of portfolio return就是投資組合的收益率的標準偏差。

以上是原始的夏普比率的計算方法,實際上對於固定時間內的夏普比率還得乘上一個k值。

對於不同採樣頻率的k值情況:

- Daily=sqrt(252)(最小粒度是按天計)

- Weekly=sqrt(52)(最小粒度是按星期計)

- Monthly=sqrt(12)(最小粒度是按月計)

年利率和日利率的轉換:

二、讀取數據

import pandas as pdimport numpy as npimport matplotlib.pyplot as plt#%matplotlib inlineaapl=pd.read_csv(AAPL_CLOSE,index_col=Date,parse_dates=True)cisco=pd.read_csv(CISCO_CLOSE,index_col=Date,parse_dates=True)ibm=pd.read_csv(IBM_CLOSE,index_col=Date,parse_dates=True)amzn=pd.read_csv(AMZN_CLOSE,index_col=Date,parse_dates=True)

2.1 歸一化收盤價格

也就是求每天的收盤價格相對於初始第一天的價格的百分率。

for stock in [aapl, cisco, ibm, amzn]: stock[normalized_price]=stock[Adj. Close]/stock[Adj. Close].iloc[0]aapl.head()

2.2 資產分配

現在假定我們四種股票都買了,並且是按照一定的權重去買,現在我們需要計算一下每天的收益率總和。

- 30% in Apple

- 20% in Google/Alphabet

- 40% in Amazon

- 10% in IBM

做法是把每隻股票的收益率乘以對應的權重,把所有經過權重相乘後的收益率之和加起來就是總的收益率。

for stock, weight in zip([aapl, cisco, ibm, amzn],[0.3, 0.2, 0.1, 0.4]): stock[weighted daily return]=stock[normalized_price]*weightaapl.head()

大概可以了,然後我們把對應的經過權重計算的歸一日回報率全部都整合到一張表當中。

total_stock=pd.concat([aapl[weighted daily return], cisco[weighted daily return], ibm[weighted daily return], amzn[weighted daily return]],axis=1)total_stock.columns=[aapl, cisco, ibm, amzn]total_stock.head()

2.2 投資

然後假設我們投資10000元,那麼就在上面回報率的基礎上乘以10000。

total_invest=total_stock*10000total_invest.head()

total_invest[Total Pos]=total_invest.sum(axis=1)total_invest.head()

然後我們繪製下每天的總收益.

plt.style.use(ggplot)total_invest[Total Pos].plot(label=Total Pos)plt.legend(loc=best)plt.title(Total Portfolio Value)

我們繪製一下除了總資產以外的其他單只股票的收益情況

total_invest.drop(Total Pos,axis=1).plot(figsize=(8,4))

三、資產的統計學值

3.1 日回報率

total_invest[daily return]=total_invest[Total Pos].pct_change(1)total_invest[daily return].head()

3.2 累積回報率

計算方法是最後一天與一開始第一天的變化百分比,相當於是增加了多少百分比。

cumulative_return=total_invest[Total Pos].iloc[-1]/total_invest[Total Pos].iloc[0]-1print cumulative_return

3.3 平均日回報率

也就是對日回報率做平均計算

total_invest[daily return].mean()

3.4 日回報率的標準差

total_invest[daily return].std()

total_invest[daily return].plot(kind=kde)

四、夏普比率

接下來我們計算一下總資產的夏普比率,也就是拿總資產日回報率的均值除以日回報率的標準差。之後由於我們這裡的粒度是以天算的,所以要乘以sqrt(252),252代表252天

SR=total_invest[daily return].mean()/total_invest[daily return].std()SR

import numpy as npASR=np.sqrt(252)*SRASR

最後我們繪製一下各個股票的收盤價分布情況

for stock in [aapl, cisco, ibm, amzn]: stock[Adj. Close].pct_change(1).plot(kind=kde)


推薦閱讀:

10年後1萬元相當於現在多少錢?
惡魔時間表怕不怕?近期消息面利空分析
名人傳記--約翰?聶夫
金融名詞解釋大全

TAG:金融學 | 金融 | Python |