iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 22
0
AI & Data

量化交易30天系列 第 22

量化交易30天 Day22 - 投資組合概念(二) 相關係數

  • 分享至 

  • xImage
  •  

量化交易30天
本系列文章是紀錄一位量化交易新手的學習過程,除了基礎的Python語法不說明,其他金融相關的東西都會一步步地說明,希望讓更多想學習量化交易但是沒有學過相關金融知識的朋友們,透過這系列的文章,能夠對量化交易略知一二,也歡迎量化交易的高手們多多交流。

這篇會假設有一個投資組合,裡面只有兩種資產,來說明報酬與風險的概念,條件如下:

資產A:預期年化報酬9%,標準差10%。
資產B:預期年化報酬18%,標準差30%。

稍微科普一下,

  • 預期年化報酬率:代表標的未來預測的年化報酬是幾%,而預測方法則是每個人有不同見解,例如:可以用過去績效來衡量、或是未來展望...等等。
  • 標準差:代表年化報酬的波動程度,標準差越大,報酬的可能範圍越廣,標準差會落在0~100%。

投資組合報酬率

假設我們用A、B組成一個投資組合,A佔投組總資產的x部份,B就是佔(1-x),這邊是假設不保留現金的情況。代入資產A與B的預期年化報酬,投組報酬率就會是:

R = 0.09x + 0.18(1-x) = 0.18 - 0.09x

代表不同的x會產生不同的投組預期報酬率,例如:

  • A佔總資產的25%,x就是0.25,將x帶入公式,R就會是15.75%
  • A佔總資產的50%,x就是0.5,R就是13.5%

可以發現,當A資產佔比越高,預期報酬率越低,因為A本身的預期報酬就比較低,所以應該將A捨去追求最高的預期報酬率嗎?這個問題就牽涉到投資組合標準差與相關係數。

投資組合標準差與相關係數

要計算投資組合的標準差,是用公式慢慢推導可以得到,不過因為有點冗長,這邊直接用python寫成計算式比較快:

import math

def s(x, Sa, Sb, corr):
    return math.sqrt( (x**2) * Sa**2 + ((1-x)**2) * Sb**2 + 2 * x * (1-x) * corr * Sa * Sb )

其中:s是投組標準差,x是A資產佔總資產的比例,Sa是A資產標準差,Sb是B資產標準差,corr是A與B的相關係數。

相關係數(corr)是代表A與B資產收益率的變化關係,corr會在-1到+1這個範圍內,corr小於0的話代表A與B資產的報酬率通常是反向變動,大於0則是同向變動。

相關係數對於投資組合標準差的影響

假設我們用A資產60%,B資產40%的投資組合,帶入上面的數字及公式,

import pandas as pd
import numpy as np

# params
corr_set = [-1, -0.5, 0, 0.5, 1]

# standard deviation set
std_dev = []

# calculate standard deviations
for corr in corr_set:
    std_dev.append(s(0.6, 0.1, 0.3, corr))
df = pd.DataFrame({'corr': corr_set, 'std_dev': std_dev}, columns = ['corr','std_dev'])
df

可以得到下列表格,相關係數由-1到+1,標準差逐漸上升,因為當兩種資產呈同向變動的時候,波動度會比呈反向變動的大。

投組配比 v.s. 相關係數 v.s. 標準差 三者的關係

上面跑了相關係數跟標準差的關係,現在則是要再加入一個變數,就是A佔總資產的比例x,也就是A與B的比例變化。所以呢我就將x從0到1切成100等分,也就是A佔比從0到100%(B從100%到0)。

  • 先算出平均報酬
import matplotlib.pyplot as plt
import pandas as pd

# 預期報酬計算公式
def exp_return(x):
    return(9*x+18*(1-x))

# 計算不同組合下的預期報酬
rets=list(map(exp_return,[x/100 for x in range(101)]))

# 轉成 dataframe
rets_df = pd.DataFrame(index=list(range(0, 101)), data=rets, columns=['expected return'])

# 畫圖
plt.figure(figsize=(15,10))
plt.plot(rets_df)
plt.ylim([8,19])
plt.xlabel("A資產佔比(%)", fontsize=20)
plt.ylabel("投組預期報酬率(%)", fontsize=20)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)

上圖中的斜直線,越往右下代表A佔比越高,所以預期報酬會越接近A資產的預期報酬,反之亦然。

  • 計算不同報酬,不同資產配比下的標準差
# 投組標準差資料集合
std_dev_sets = []

# 計算標準差
for corr in corr_set:
    std_dev = []
    for x in range(0,101):
        std_dev.append(s(x/100, 0.1, 0.3, corr))
    std_dev_sets.append(std_dev)

# 繪圖
plt.figure(figsize=(15,10))
plt.plot(std_dev_sets[0],rets,label='corr = -1')
plt.plot(std_dev_sets[1],rets,label='corr = -0.5')
plt.plot(std_dev_sets[2],rets,label='corr = 0')
plt.plot(std_dev_sets[3],rets,label='corr = 0.5')
plt.plot(std_dev_sets[4],rets,label='corr = 1')
plt.xlabel('投組標準差(%)', fontsize=20)
plt.ylabel('投組預期報酬率(%)', fontsize=20)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.legend(loc='upper left',prop={'size': 15})

上面這張圖乍看資訊很多,可以從幾個方向拆解,就會比較好懂了:

  1. Y軸代表投組的預期報酬率,而根據本篇最上面那條公式,會影響預期報酬率的只有資產配比x,所以Y軸從下到上的這些數字,就代表不同的資產配比算出來的投組預期報酬。
  2. 假設我們取相關係數corr=-0.5這條橘色線來看,當投組預期報酬率往上增加的時候,會有一小段彎曲的部份,這段負斜率的部份代表標準差下降的同時,報酬率卻是上升的,這是單一資產做不到的事情,因為單一資產的話,通常報酬上升的同時風險也會增加。
  3. 相關係數corr小於0的時候,投組才比較有標準差下降,而報酬率上升的這種效果。
  4. 不同相關係數會導致線圖長得不一樣,不過corr=-1跟corr=+1這兩條線算是虛構的,因為在真實世界裡面很少有完全負相關或是完全正相關的資產組

本篇總結
這篇就大概講投資組合的理論如何用量化的方式來呈現,真的是非常學術的一篇阿,可能有點硬,但是有了這些數字之後,下一篇就要來玩玩幾個投資組合拉,會回到投資組合第一篇開頭講的股債配比的議題來研究一下,請繼續收看拉。

P.S.
如果大家對於量化交易有興趣的話,我自己有上過以下這門課,課程內容從串接股市資料API、儲存至資料庫、將自己的策略轉化成程式碼、自動下單,並且可以把整個流程自動化,每天早上執行一次,一整天就不用看盤了,覺得是蠻實戰的,可以參考看看。

筆者 Sean
奈米戶投資人 / Python愛用者
喜歡用Python玩轉金融數據,從個股基本面、技術面、籌碼面相關資料,一直到總體經濟數據,都是平常接觸到的素材;對於投資,除了研究歷史數據,也喜歡瞭解市場上大家在玩些什麼。


上一篇
量化交易30天 Day21 - 投資組合概念(一) 報酬與風險
下一篇
量化交易30天 Day23 - 投資組合概念(三) 股債配比分析
系列文
量化交易30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言