量化交易30天
本系列文章是紀錄一位量化交易新手的學習過程,除了基礎的Python語法不說明,其他金融相關的東西都會一步步地說明,希望讓更多想學習量化交易但是沒有學過相關金融知識的朋友們,透過這系列的文章,能夠對量化交易略知一二,也歡迎量化交易的高手們多多交流。
這篇會假設有一個投資組合,裡面只有兩種資產,來說明報酬與風險的概念,條件如下:
資產A:預期年化報酬9%,標準差10%。
資產B:預期年化報酬18%,標準差30%。
稍微科普一下,
假設我們用A、B組成一個投資組合,A佔投組總資產的x部份,B就是佔(1-x),這邊是假設不保留現金的情況。代入資產A與B的預期年化報酬,投組報酬率就會是:
R = 0.09x + 0.18(1-x) = 0.18 - 0.09x
代表不同的x會產生不同的投組預期報酬率,例如:
可以發現,當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,標準差逐漸上升,因為當兩種資產呈同向變動的時候,波動度會比呈反向變動的大。
上面跑了相關係數跟標準差的關係,現在則是要再加入一個變數,就是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})
上面這張圖乍看資訊很多,可以從幾個方向拆解,就會比較好懂了:
本篇總結
這篇就大概講投資組合的理論如何用量化的方式來呈現,真的是非常學術的一篇阿,可能有點硬,但是有了這些數字之後,下一篇就要來玩玩幾個投資組合拉,會回到投資組合第一篇開頭講的股債配比的議題來研究一下,請繼續收看拉。
P.S.
如果大家對於量化交易有興趣的話,我自己有上過以下這門課,課程內容從串接股市資料API、儲存至資料庫、將自己的策略轉化成程式碼、自動下單,並且可以把整個流程自動化,每天早上執行一次,一整天就不用看盤了,覺得是蠻實戰的,可以參考看看。
筆者 Sean
奈米戶投資人 / Python愛用者
喜歡用Python玩轉金融數據,從個股基本面、技術面、籌碼面相關資料,一直到總體經濟數據,都是平常接觸到的素材;對於投資,除了研究歷史數據,也喜歡瞭解市場上大家在玩些什麼。