python股票交易模型_如何用Python建模GGM模型并对股票估值?
内容首发
乐学偶得(http://lexueoude.com) 公众号: 乐学Fintech
用代码理解分析解决金融问题
首先我们快速了解一下什么是GGM模型。
GGM模型又叫做“戈登增长模型”(Gordon Growth Model,GGM)是用于对公司进行估值的工具。该理论假设公司的内在价值就是将所有未来股息支付折现到今天的价值的总和。它也可以称为股息折扣模型。
GGM模型的优点之一是它的计算非常简单,我们可以看看下方的数学公式:
股息(Do):
公司支付的股息。
通过查看公司公开的年度/季度报告,我们可以轻松获得公司(Do)支付的最新股息。
增长(g):股息的预期增长率是恒定的。
计算g的一种方法是采用公司最近支付的两到三次股息,并计算增长并将其用作持续增长的值。
注意:这种方法的问题在于,如果公司将其股息支付年度保持不变,那么我们计算中的增长率将为零。
为了克服这个问题,我们将采用不同的方法,而是使用可持续增长率。
可持续增长率是公司无需增加股权融资即可实现的增长率。
股本成本(ke):股本成本(ke):我们可以使用资本资产定价模型(CAPM)估算所需的股本成本。
GGM模型的假设
当然,如果我们使用模型,一定是假设在理想的环境下进行估值的。但是往往现实世界并不理想,所以我们一定要搞清楚模型的假设,这样,在模型失效或者模型产生较大误差的时候,我们可以清楚的知道从哪里进行排查。
GGM模型使用的假设为:这些年来股息增长率是恒定的。
股利是股东财富的核心。
权益成本必须大于股息增长。否则,我们的模型将给我们负值。
Python建模与免费API分享
为了代码简洁与大家能够轻松复现,我们直接调取了
https://financialmodelingprep.com/ 里的免费API,这个API数据非常详细,可以直接获取公司的财务数据。国内的小伙伴可以使用tushare或者wind接口进行代替。只需要将代码中的request数据源进行修改就可以咯~
数据调取与利用Python解析
我们可以直接通过最简单的request模块调取数据:
dividend =
requests.get(f'https://financialmodelingprep.com/api/v3/financials/income-statement/{这里填入你想调取的公司代码}')
以这个API接口为例,比如需要返回苹果公司的dividend信息,可以得到以下返回值:
GGM模型+CAPM模型结合我们需要获取什么数据?
那么数据如果能够通过这种方式调取API获取,我们需要什么数据呢?
公司最新股息
要通过CAPM模型计算权益成本(ke),我们将需要:公司Beta(B)。可以从financialmodelingprep API中提取
无风险利率(RF)。
市场预期收益率(ERm)。
美股的小伙伴可以计算最近一年的S&P500回报
A股的小伙伴可以计算沪深300的回报
作为我们市场预期回报
要计算可持续增长率,我们需要支付比率和股本回报率(ROE)。
计算可持续增长率
接下来,我们需要计算可持续增长率。计算比率的公式如下:
SGR =股本回报率*(1-股息支付率)
我们可以通过上方跟大家介绍的API获取股本回报率(ROE)和股息支付率这类公司的关键指标。(具体操作为通过Python解析我们上面截图的以字典形式存放的数据,并提取键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作为数据源。该web.DataReader方法将返回1年国库券提供的利率时间序列数据。
我们再使用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模型中所谓的市场溢价)。
我们将使用指数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)
接着我们就可以将以上数据带入下方的公式:
大功告成!我们就获取了所有必需的数据来计算权益成本(Ke)。现在我们只需要应用公式就可以通过CAPM模型获得Ke。
上!
Py!
thon!
ke = RF+(beta*(SP500yearlyreturn - RF))
print(ke)
通过GGM模型进行公司股价估值
GGM = (Dtoday*(1+sustgrwothrate))/(ke-sustgrwothrate)
return GGM
模型的局限性
既然是模型,一定是尽可能的模拟现实,但是既然是模型,就不可能完全模拟现实,一定有相应的局限性,比如这个GGM模型的局限性为:该模型不适用于不支付股息的公司
权益成本必须大于股息增长。否则,我们的模型将返回的为负值(即分母ke-g将为负)
假设每股恒定股息在现实世界中是不现实的
另外,如果大家微调这个模型会发现:模型估值的返回值对模型的输入非常敏感。例如,权益成本的轻微增加/减少将对计算值产生重大影响,这样如果输入的数据不准确或者估计不准确,会导致模型有较大的误差。
全部代码
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('这里输入你想估值的公司代码')
内容首发
乐学偶得 公众号: 乐学Fintech
用代码理解分析解决金融问题
python股票交易模型_如何用Python建模GGM模型并对股票估值?相关推荐
- 用python做股票智能投顾模型_如何用Python建模GGM模型并对股票估值?
内容首发 乐学偶得(http://lexueoude.com) 公众号: 乐学Fintech 用代码理解分析解决金融问题 首先我们快速了解一下什么是GGM模型. GGM模型又叫做"戈登增长模 ...
- python旅游推荐系统_如何用Python搭建一个简单的推荐系统?
推荐系统的相关知识我们已在前文中提到,在这篇文章中,我们会介绍如何用Python来搭建一个简单的推荐系统. 本文使用的数据集是MovieLens数据集,该数据集由明尼苏达大学的Grouplens研究小 ...
- python预测房价走势_如何用 Python 预测房价走势?
原标题:如何用 Python 预测房价走势? 买房应该是大多数都会要面临的一个选择,当前经济和政策背景下,未来房价会涨还是跌?这是很多人都关心的一个话题.今天分享的这篇文章,以波士顿的房地产市场为例, ...
- python怎么读_如何用Python读写文件
前面我们已经介绍了很多Python相关的基础知识,大家是不是对Python已经有了进一步认识了呢?作为人工智能时代的热门编程语言,开始接触并学习Python的孩子越来越多,家长们都不想让自己的孩子落于 ...
- 用python开启相机_如何用Python打开realsenseD435相机并获取相机参数
如何用Python打开realsenseD435相机 import pyrealsense2 as rs import numpy as np import cv2 if __name__ == &q ...
- python读取二进制文件_如何用python读取二进制文件?
我发现用Python读取二进制文件特别困难.你能帮我一把吗?我需要读取这个文件,在Fortran 90中,该文件很容易被int*4 n_particles, n_groups real*4 group ...
- python md5加密_如何用python“优雅”的调用有道翻译?
前言 其实在以前就盯上有道翻译了的,但是由于时间问题一直没有研究(我的骚操作还在后面,记得关注),本文主要讲解如何用python调用有道翻译,讲解这个爬虫与有道翻译的js"斗争"的 ...
- python求平均值_如何用python求平均值
学习了Python相关数据类型,函数的知识后,利用字符串的分割实现了输入任意多个数据,并计算其平均值的小程序.思路是接收输入的字符串,以空格为分隔符,将分割的数据存入列表(lst1)中,将lst1中的 ...
- python小助手_如何用python写个人专属群聊提醒小助手?
前言 大家还记得教会父母玩微信是什么时候吗?父母学会后,我们的生活就发生了「质」的变化,父母也许会吐槽你的微信头像不好,要你换一个头像. 最近 pk哥 又被母后大人吐槽了,原因是亲戚微信群里某个亲戚生 ...
最新文章
- linux ext4增加大小,如何修改 ext4 文件系统的大小
- Apache Artemis —— 非堵塞 Java 嵌入消息服务
- java 时间间隔 工作日,计算Java中两个日期之间的工作日数
- Http协议中的Content-Length属性
- 于敦德:途牛五大战略纵深不惧同质化竞争
- 前端学习(1383):多人管理项目3
- C小项目 —— 学生信息管理系统
- 如何使用可控硅?(详细教程)
- matlab的simin用法,在Maltlab 的simulink中怎么输入讯号
- Matlab数据拟合方法介绍
- 鸿蒙系统屏幕录制,鸿蒙系统游戏性能出色;三星折叠屏发布屏下摄像头
- 【HAVENT原创】Spring Boot + Kafka 消息日志开发
- matlab伴随矩阵怎么表示,怎样用Matlab求矩阵的伴随矩阵
- 一个UE4崩溃问题以及解决方案
- 正确的选择大于努力_选择正确技术的11个注意事项
- IDEA Intellij小技巧和插件
- linux补齐命令,Linux中10个有用的命令行补齐命令
- 计算机专业370,2018复旦计算机专硕初试370+经验贴(更新部分内容)
- iOS 打开AppStore进行软件评分
- windows IIS部署Web网页
热门文章
- 如何关闭线程池?会创建不会关闭?调用关闭方法时线程池里的线程如何反应?
- android 微信支付,body为中文字符,签名错误
- android.os.BinderProxy cannot be cast to
- Error:Connection timed out: connect
- android java判断字符串是否为空和是否是手机号和是否是数字,数字转中文
- Mongoose provide access to previous value of property in pre('save')
- 汇编64讲(搞免杀、破解必看)
- centos中nodejs npm环境完全删除
- activiti5.22 springboot 流程引擎 实战全过程
- linux用vsc写c语言,vscode写c语言(windows)