【實戰應用】資金管理
以凱利公式探討勝率、賠率與下注比例關係
本文重點概要
- 文章難度:★★☆☆☆
- 閱讀建議:本文以 PYTHON實作凱利公式,若讀者對凱利公式的推導有興趣,可以進一步觀看李永樂老師介紹的凱利公式影片。
前言
勝率、賠率與下注比例是投資人既熟悉又陌生的詞彙,我們往往憑著自身的盤感,在心中相乘勝率與賠率後,決定投資標的的下注比例,然而主觀盤感往往造成大部份投資人難以向旁人講清楚自己下注比例的依據。
在投資中無可避免的是勝率與賠率有極高的主觀判斷,但我們可以在確定勝率與賠率後,利用凱利公式決定下注比例,在本金永不歸零的條件下,極大化長期收益。接下來本文以凱利公式來決定下注比例,在每月初重新投資 0050 ETF,同時比較 buy & hold本金相同的投組。
編輯環境及模組需求
本文使用 Windows OS 並以 Jupyter Notebook 作為編輯器
import matplotlib.pyplot as plt
import numpy as npimport tejapi
tejapi.ApiConfig.api_key = "your key"
資料庫使用
- 上市(櫃)調整股價(月)-除權息調整:資料庫代碼為 ‘TWN/AAPRCM1’。
資料處理
我們從 TEJ資料庫撈取 0050ETF月報酬率。
data_return = tejapi.get('TWN/AAPRCM1',
coid = '0050',
mdate= {'gte': '2010-01-01','lte':'2015-12-31'},
opts={'columns':['coid','mdate','roi']},
chinese_column_name=True,paginate=True)
凱利公式
我們簡單以前12個月月報酬率為依據,若月報酬率大於0,則視為成功,反之失敗,如此我們可以獲得每月初投資 0050 ETF時的勝率與賠率。
- 勝率P:成功的總次數/(成功的總次數+失敗的總次數)
- 賠率b:成功時的盈利/失敗時的虧損
- 下注比例f:投入資金占本金的比例
data_return['勝率'] = np.where(data_return['報酬率%_月'] >= 0 ,1,0)
data_return['勝率'] = data_return.rolling(12)['勝率'].sum() / 12data_return['獲利'] = np.where(data_return['報酬率%_月'] >= 0 ,data_return['報酬率%_月'],np.nan)
data_return['虧損'] = np.where(data_return['報酬率%_月'] < 0 ,data_return['報酬率%_月'],np.nan)data_return['賠率'] = data_return.rolling(12, min_periods=1)['獲利'].mean() \
/ data_return.rolling(12, min_periods=1)['虧損'].mean().abs()
再透過凱利公式換算出下注比例,本金乘上下注比例,便是當期的下注額。凱利公式中的分子若為負數,則表示此次投資不值得下注,我們便將該期下注比例設為0。
data_return['下注比例'] = \
np.where(data_return['勝率'] * data_return['賠率'] - (1 - data_return['勝率']) < 0,0,
(data_return['勝率'] * data_return['賠率'] - (1 - data_return['勝率'])) / data_return['賠率']
)
# 前一個月的下注比例,避免前視偏誤
data_return['下注比例'] = data_return['下注比例'].shift()
我們根據勝率與賠率有系統地調整下注比例。
for i in range(0,len(data_return)):
if i == 0:
data_return['buy & hold本金'] = 1000000 # 起始本金
else:
data_return.loc[i,'buy & hold本金'] = 1000000 * data_return.loc[i-1,'累積報酬率%_月']for i in range(0,len(data_return)):
if i == 0:
data_return['凱利本金'] = 1000000 # 起始本金
else:
if data_return.loc[i,'下注比例'] > 0:
data_return.loc[i,'凱利本金'] = data_return.loc[i-1,'凱利本金'] * (1 - data_return.loc[i,'下注比例']) \
+ data_return.loc[i-1,'凱利本金'] * data_return.loc[i,'下注比例'] * (1 + data_return.loc[i,'報酬率%_月'])
# - data_return.loc[i-1,'凱利本金'] * data_return.loc[i,'下注比例'] * 0.002 # 手續費
else:
data_return.loc[i,'凱利本金'] = data_return.loc[i-1,'凱利本金']
結論
我們觀察2011年至2015年的本金累積趨勢圖,比較 Buy & Hold與凱利公式下的投組,發現後者的累積本金額並未贏過前者,可能原因是凱利公式適用於所有已知機率或者概率可以被估計的投資中,股市中充滿不確定性的賠率與勝率難以使凱利公式發揮作用。然而凱利公式的思維卻仍值得我們學習,透過下注比例控制風險,即使高勝率與高賠率也不要 All in,避免造成永久性損失。
未來讀者可試著研究如何提高策略的勝率與賠率,使下注比例更加精準,放大部位的同時,也有風險控管的思維,幫助我們長期在市場中存活。最後歡迎讀者前往我們的官方網站,裡面有提供更多財務、交易等財金資料,來幫助讀者製作更好的選股策略!
本文僅供參考之用,並不構成要約、招攬或邀請、誘使、任何不論種類或形式之申述或訂立任何建議及推薦,讀者務請運用個人獨立思考能力,自行作出投資決定,如因相關建議招致損失,概與作者無涉。
完整程式碼
延伸閱讀
相關連結
- TEJ API 資料庫首頁
- TEJ E-Shop 完整資料庫購買
給我們鼓勵
之後會持續分享更多財金資料庫的應用
如果你的覺得今天的文章不錯,可以幫我們在下面的 掌聲 icon 點 1下
如果覺得超讚,可以按住 掌聲 icon 不放直到 50 下
有任何想法歡迎點選 留言 icon和我們討論