iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 27
0
AI & Data

python 入門到分析股市系列 第 27

[Day27]投資組合的風險評估 - 算術平均數

  • 分享至 

  • xImage
  •  

前言

我們在投資股票的時候,總不會把雞蛋放在同一個籃子裡,會投資多張股票,而投資組合如何分配和會有哪些風險和報酬就是今天要討論的內容。

專有名詞

收益率(Daily Return):代表股票在一天交易中的價值變化百分比
累計超額收益率(Cumulative Return):累計超額收益率為每隻股票在形成期內月超額收益率的簡單加總。
夏普指數(Sharpe ratio):(平均年化報酬率-無風險利率)/年化標準差


收益率的標準差(Standard deviation):
假設連續五天的收益率分別是(17%,22%,15,-5%,5%)
平均報酬率(使用算術平均數) = (17+22+15+(-5)+5) / 5 = 10.8
收益率和平均之間的差(Deviation)和平方差(Deviation Squared)

收益率 Deviation Deviation Squared
17 6.2 38.44
22 11.2 125.44
15 4.2 17.64
-5 -15.8 249.64
5 -5.8 33.64
收益率的變異數 = (38.44+125.44+17.64+249.64+33.64) / (5-1) = 116.2
收益率的標準差 = 收益率的變異數開根號 = 10.78

剛剛算的收益率的標準差是使用算術平均數,但股票市場比較類似對數收益率(明天會介紹),有以上的基本知識後再來討論投資的風險和評估。

預先載入套件

介紹底下的圖表之前先預先載入需要的套件

# basic
import numpy as np
import pandas as pd

# get data
import pandas_datareader as pdr

# visual
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns

#time
import datetime as datetime

讀取股票

我們讀取以下股票
2330:台積電
2492:華新科
3045:台灣大
2412:中華電

start = datetime.datetime(2015,1,5)
df_2330 = pdr.DataReader('2330.TW', 'yahoo', start=start)
df_2492 = pdr.DataReader('2492.TW', 'yahoo', start=start)
df_3045 = pdr.DataReader('3045.TW', 'yahoo', start=start)
df_2412 = pdr.DataReader('2412.TW', 'yahoo', start=start)

收盤價和第一天的收盤價的比較

for stock in [df_2330, df_2492, df_3045, df_2412]:
    stock['normalized_price']=stock['Adj Close']/stock['Adj Close'].iloc[0]

資產分配

我們將我們的投資金額用以下的比例分配
2330:台積電 30%
2492:華新科 20%
3045:台灣大 25%
2412:中華電 25%
之後將分配到的比例乘上每一日的收益率

for stock, weight in zip([df_2330, df_2492, df_3045, df_2412],[0.3, 0.2, 0.25, 0.25]):
    stock['weighted daily return']=stock['normalized_price']*weight

並將剛剛算出來的normalized_price統合到一張表

df_total=pd.concat([df_2330['weighted daily return'], df_2492['weighted daily return'], df_3045['weighted daily return'], df_2412['weighted daily return']],axis=1)
df_total.columns=['2330', '2492', '3045', '2412']

投資

將四個股票的收益率乘上你要投資的總金額,現在假設是10萬,並且多增加一個Total Pos欄位將四個股票目前的金額做加總作為總收益

df_total_money = df_total* 100000
df_total_money['Total Pos']=df_total_money.sum(axis=1)
df_total_money.head()

然後將剛剛總收益繪製圖表

fig = plt.figure(figsize=(10, 6))
plt.plot(df_total_money['Total Pos'], '-' , label="總收益")
plt.plot(df_total_money['2330'], '-' , label="台積電")
plt.plot(df_total_money['2492'], '-' , label="華新科")
plt.plot(df_total_money['3045'], '-' , label="台灣大")
plt.plot(df_total_money['2412'], '-' , label="中華電")
plt.title('收益曲線',loc='right')

plt.xlabel('日期')
plt.ylabel('金額')
plt.grid(True, axis='y')
plt.legend()

https://ithelp.ithome.com.tw/upload/images/20181105/20111390wgJhB4nLa2.png
可以看到總收益受到華新科的變動而增加

統計計算

  • 日收益率
df_total_money['daily return']=df_total_money['Total Pos'].pct_change()
  • 累積收益率
    計算最後一天和第一天的變化的百分比
print("累積收益率",df_total_money['Total Pos'].iloc[-1]/df_total_money['Total Pos'].iloc[0]-1)
# 輸出結果
累積收益率 2.074405312864754
  • 平均日收益率
print("平均收益率:",df_total_money['daily return'].mean())
# 輸出結果
平均收益率: 0.0014348141399964849
  • 標準差DAY20有介紹
print("收益率標準差:",df_total_money['daily return'].std())
# 輸出結果
收益率標準差: 0.021708565259989755
  • 使用密度圖來顯示日收益率
plt.rcParams['axes.unicode_minus']=False
fig = plt.figure(figsize=(10, 6))
sns.distplot(df_total_money['daily return'].dropna(),bins=100, label="總收益率")
plt.legend()

https://ithelp.ithome.com.tw/upload/images/20181105/20111390oFNIWMgfFU.png

夏普指數(Sharpe ratio)

SR=df_total_money['daily return'].mean()/df_total_money['daily return'].std()
# 輸出結果
0.06770475726506646

代表投資者每增加1%的風險可以換來6%的收益

一年總共有252天的交易日

ASR=np.sqrt(252)*SR
# 輸出結果
1.0747797017961567

參考網站

綠角財經筆記:標準差怎麼算

之前的章節


上一篇
[Day26] 財報爬蟲和分析
下一篇
[Day28]投資組合的風險評估 - 對數收益率
系列文
python 入門到分析股市30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言