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