用python做股票智能投顾模型_如何用Python建模GGM模型并对股票估值?
內(nèi)容首發(fā)
樂學(xué)偶得(http://lexueoude.com) 公眾號: 樂學(xué)Fintech
用代碼理解分析解決金融問題
首先我們快速了解一下什么是GGM模型。
GGM模型又叫做“戈登增長模型”(Gordon Growth Model,GGM)是用于對公司進(jìn)行估值的工具。該理論假設(shè)公司的內(nèi)在價(jià)值就是將所有未來股息支付折現(xiàn)到今天的價(jià)值的總和。它也可以稱為股息折扣模型。
GGM模型的優(yōu)點(diǎn)之一是它的計(jì)算非常簡單,我們可以看看下方的數(shù)學(xué)公式:
股息(Do):
公司支付的股息。
通過查看公司公開的年度/季度報(bào)告,我們可以輕松獲得公司(Do)支付的最新股息。
增長(g):股息的預(yù)期增長率是恒定的。
計(jì)算g的一種方法是采用公司最近支付的兩到三次股息,并計(jì)算增長并將其用作持續(xù)增長的值。
注意:這種方法的問題在于,如果公司將其股息支付年度保持不變,那么我們計(jì)算中的增長率將為零。
為了克服這個問題,我們將采用不同的方法,而是使用可持續(xù)增長率。
可持續(xù)增長率是公司無需增加股權(quán)融資即可實(shí)現(xiàn)的增長率。
股本成本(ke):股本成本(ke):我們可以使用資本資產(chǎn)定價(jià)模型(CAPM)估算所需的股本成本。
GGM模型的假設(shè)
當(dāng)然,如果我們使用模型,一定是假設(shè)在理想的環(huán)境下進(jìn)行估值的。但是往往現(xiàn)實(shí)世界并不理想,所以我們一定要搞清楚模型的假設(shè),這樣,在模型失效或者模型產(chǎn)生較大誤差的時(shí)候,我們可以清楚的知道從哪里進(jìn)行排查。
GGM模型使用的假設(shè)為:這些年來股息增長率是恒定的。
股利是股東財(cái)富的核心。
權(quán)益成本必須大于股息增長。否則,我們的模型將給我們負(fù)值。
Python建模與免費(fèi)API分享
為了代碼簡潔與大家能夠輕松復(fù)現(xiàn),我們直接調(diào)取了
https://financialmodelingprep.com/ 里的免費(fèi)API,這個API數(shù)據(jù)非常詳細(xì),可以直接獲取公司的財(cái)務(wù)數(shù)據(jù)。國內(nèi)的小伙伴可以使用tushare或者wind接口進(jìn)行代替。只需要將代碼中的request數(shù)據(jù)源進(jìn)行修改就可以咯~
數(shù)據(jù)調(diào)取與利用Python解析
我們可以直接通過最簡單的request模塊調(diào)取數(shù)據(jù):
dividend =
requests.get(f'https://financialmodelingprep.com/api/v3/financials/income-statement/{這里填入你想調(diào)取的公司代碼}')
以這個API接口為例,比如需要返回蘋果公司的dividend信息,可以得到以下返回值:
GGM模型+CAPM模型結(jié)合我們需要獲取什么數(shù)據(jù)?
那么數(shù)據(jù)如果能夠通過這種方式調(diào)取API獲取,我們需要什么數(shù)據(jù)呢?
公司最新股息
要通過CAPM模型計(jì)算權(quán)益成本(ke),我們將需要:公司Beta(B)。可以從financialmodelingprep API中提取
無風(fēng)險(xiǎn)利率(RF)。
市場預(yù)期收益率(ERm)。
美股的小伙伴可以計(jì)算最近一年的S&P500回報(bào)
A股的小伙伴可以計(jì)算滬深300的回報(bào)
作為我們市場預(yù)期回報(bào)
要計(jì)算可持續(xù)增長率,我們需要支付比率和股本回報(bào)率(ROE)。
計(jì)算可持續(xù)增長率
接下來,我們需要計(jì)算可持續(xù)增長率。計(jì)算比率的公式如下:
SGR =股本回報(bào)率*(1-股息支付率)
我們可以通過上方跟大家介紹的API獲取股本回報(bào)率(ROE)和股息支付率這類公司的關(guān)鍵指標(biāo)。(具體操作為通過Python解析我們上面截圖的以字典形式存放的數(shù)據(jù),并提取鍵ROE和payout_ratio的值:
metrics = requests.get(f'https://financialmodelingprep.com/api/v3/company-key-metrics/{這里填入你想調(diào)取的公司代碼}')
metrics = metrics.json()
ROE = float(metrics['metrics'][0]['ROE'])
payout_ratio = float(metrics['metrics'][0]['Payout Ratio'])
sustgrwothrate = ROE*(1-payout_ratio)
計(jì)算權(quán)益成本(Ke)
為了通過CAPM 計(jì)算權(quán)益成本(ke),我們需要的第一個要素是無風(fēng)險(xiǎn)利率。由于一年期國庫券被視為無風(fēng)險(xiǎn)證券,因此我們將使用一年期國庫券。我們可以使用Pandas DataReader和FRED作為數(shù)據(jù)源。該web.DataReader方法將返回1年國庫券提供的利率時(shí)間序列數(shù)據(jù)。
我們再使用iloc [-1]方法檢索DataFrame的最新元素。
import pandas as pd
import pandas_datareader.data as web
import datetime
start = datetime.datetime(2019, 2, 1)
end = datetime.datetime(2020, 2, 27)
Treasury = web.DataReader(['TB1YR'], 'fred', start, end)
RF = float(Treasury.iloc[-1])
RF = RF/100
print(RF)
獲取目標(biāo)公司beta
同樣通過調(diào)取API獲取
beta = requests.get(f'https://financialmodelingprep.com/api/v3/company/profile/{quote}')
beta = beta.json()
beta = float(beta['profile']['beta'])
print(beta)
計(jì)算預(yù)期的市場回報(bào)率
最后,計(jì)算權(quán)益成本的最后一個要素是預(yù)期的市場回報(bào)率(即CAPM模型中所謂的市場溢價(jià))。
我們將使用指數(shù)S&P 500計(jì)算去年的市場收益,A股的小伙伴可以使用滬深300進(jìn)行替代即可。這就是我們將用作預(yù)期市場回報(bào)的指標(biāo)。
start = datetime.datetime(2019, 1, 1)
end = datetime.datetime(2020, 7, 7)
SP500 = web.DataReader(['sp500'], 'fred', start, end)
SP500.dropna(inplace = True)
SP500yearlyreturn = (SP500['sp500'].iloc[-1]/ SP500['sp500'].iloc[0])-1
print(SP500yearlyreturn)
接著我們就可以將以上數(shù)據(jù)帶入下方的公式:
大功告成!我們就獲取了所有必需的數(shù)據(jù)來計(jì)算權(quán)益成本(Ke)。現(xiàn)在我們只需要應(yīng)用公式就可以通過CAPM模型獲得Ke。
上!
Py!
thon!
ke = RF+(beta*(SP500yearlyreturn - RF))
print(ke)
通過GGM模型進(jìn)行公司股價(jià)估值
GGM = (Dtoday*(1+sustgrwothrate))/(ke-sustgrwothrate)
return GGM
模型的局限性
既然是模型,一定是盡可能的模擬現(xiàn)實(shí),但是既然是模型,就不可能完全模擬現(xiàn)實(shí),一定有相應(yīng)的局限性,比如這個GGM模型的局限性為:該模型不適用于不支付股息的公司
權(quán)益成本必須大于股息增長。否則,我們的模型將返回的為負(fù)值(即分母ke-g將為負(fù))
假設(shè)每股恒定股息在現(xiàn)實(shí)世界中是不現(xiàn)實(shí)的
另外,如果大家微調(diào)這個模型會發(fā)現(xiàn):模型估值的返回值對模型的輸入非常敏感。例如,權(quán)益成本的輕微增加/減少將對計(jì)算值產(chǎn)生重大影響,這樣如果輸入的數(shù)據(jù)不準(zhǔn)確或者估計(jì)不準(zhǔn)確,會導(dǎo)致模型有較大的誤差。
全部代碼
import requests
def valuecompany(quote):
dividend = requests.get(f'https://financialmodelingprep.com/api/v3/financials/income-statement/{quote}')
dividend = dividend.json()
dividend = dividend['financials']
Dtoday = float(dividend[0]['Dividend per Share'])
metrics = requests.get(f'https://financialmodelingprep.com/api/v3/company-key-metrics/{quote}')
metrics = metrics.json()
ROE = float(metrics['metrics'][0]['ROE'])
payout_ratio = float(metrics['metrics'][0]['Payout Ratio'])
sustgrwothrate = ROE*(1-payout_ratio)
print(sustgrwothrate)
import pandas as pd
pd.core.common.is_list_like = pd.api.types.is_list_like
import pandas_datareader.data as web
import datetime
start = datetime.datetime(2019, 1, 1)
end = datetime.datetime(2020, 7, 7)
Treasury = web.DataReader(['TB1YR'], 'fred', start, end)
RF = float(Treasury.iloc[-1])
RF = RF/100
beta = requests.get(f'https://financialmodelingprep.com/api/v3/company/profile/{quote}')
beta = beta.json()
beta = float(beta['profile']['beta'])
start = datetime.datetime(2019, 1, 1)
end = datetime.datetime(2020, 7, 7)
SP500 = web.DataReader(['sp500'], 'fred', start, end)
SP500.dropna(inplace = True)
SP500yearlyreturn = (SP500['sp500'].iloc[-1]/ SP500['sp500'].iloc[0])-1
ke = RF+(beta*(SP500yearlyreturn - RF))
GGM = (Dtoday*(1+sustgrwothrate))/(ke-sustgrwothrate)
print(GGM)
return GGM
valuecompany('這里輸入你想估值的公司代碼')
內(nèi)容首發(fā)
樂學(xué)偶得 公眾號: 樂學(xué)Fintech
用代碼理解分析解決金融問題
總結(jié)
以上是生活随笔為你收集整理的用python做股票智能投顾模型_如何用Python建模GGM模型并对股票估值?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JCJC错别字检测新功能:检测日期格式
- 下一篇: 银行账目管理系统