1、金融常规概念及python实现
在量化投资学习中,我们会经常提到一些词汇,例如利率、时间价值等。为了避免大家后期学习在基础知识上翻车,本关卡将介绍金融基础概念,包括:利率、收益率、复利等。同时我们使用Python代码更加深刻的理解这些概念。
当然,本训练的目的主要是让大家掌握量化金融的基础知识和技术,更深刻的金融逻辑知识,无法深入讲解,希望读者能够理解。
1.1收益率与复利
阅读材料一
我们谈起投资,第一个想到的就是收益率。
收益率是投资收益与投资成本之间的比值,它反应了投资收益与投资成本之间的比率关系。
例如,年初你投入10000元放X宝,一年后你获得了200元的收益,那么你的投资收益率就是200/10000=2%。
当然,你也可以投资理财、股票、债券等,无论是什么投资品种,什么投资方式,最终衡量投资成功或失败的最重要标准,就是收益率。
那这里就引出一个问题,影响收益率的因素有哪些?
我们可以做一个简单的对比,假设你投入10000元,年收益率5%,投资10年,最终累计收益率多少?
#导入相关库,为了避免重复,这里一次性导入本内容所需要的所有库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import akshare as ak
import warnings
import time
warnings.filterwarnings('ignore')
plt.rcParams['font.sans-serif'] = ['Source Han Sans CN']#和鲸平台可用的中文字体
plt.rcParams['axes.unicode_minus'] = False
# 设置全局字体
#写一个简单的python代码,计算最终资产!
def final_value(investment, rate, years):
return investment * (1 + rate) ** years
investment = 10000
rate = 0.05
years = 10
print('最终资产:',final_value(investment, rate,years))
最终资产: 16288.94626777442
最终收益率为16288.94/10000-1=62.89%
根据上述代码我们可以定义一个公式:最终资产=本金*(1+收益率)^投资年数
从公式可以看出来,收益率及投资年数是影响最终资产的核心要素!
同等年限,收益率越高,最终资产越高!
同等收益率(正),年限越长,最终资产越高!
这就引出我们今天的第一个知识点,收益率及复利!
阅读材料二
我们知道收益率之后,就涉及到另外一个点,就是复利!复利是指在计算利息时,某一计息周期的利息是由本金加上先前周期所积累利息总额来计算的计息方式,也即通常所说的“利生利”,“利滚利”。
关于复利的强大,有中学数学基础的人多少都知道。而在投资上,我们最期待的事情就是收益率能够复利下去。
例如股神巴菲特,几十年的投资生涯中,年化收益率一直保持在20%左右,那么100元投资,50年之后,会变成多少?我们用之前的函数来计算下。
print('复利20%,50年后最终资产:',final_value(100,0.2,50))
print('存银行复利1.5%,50年后最终资产:',final_value(100,0.015,50))
复利20%,50年后最终资产: 910043.8150002133 存银行复利1.5%,50年后最终资产: 210.5242420607465
#我们可视化一下两者的区别
investment =np.repeat(100,repeats=50)
rate = np.repeat(0.2,repeats=50)
years = np.arange(1,51)
#存银行利率1.5%
rate_ = np.repeat(0.015,repeats=50)
data_20_50=pd.DataFrame(index=range(1,51),columns=['总资产'],data=investment*(1+rate)**years)
data_015_50=pd.DataFrame(index=range(1,51),columns=['存银行总资产'],data=investment*(1+rate_)**years)
plt.plot(data_20_50.index,data_20_50['总资产'],label='20%收益50年后总资产')
plt.plot(data_015_50.index,data_015_50['存银行总资产'],label='1.5%收益50年后总资产')
plt.legend()
plt.show()
1.2年化波动率与夏普比率
阅读材料三:
年化波动率是一种衡量风险的指标,其计算公式为:年化波动率=收益率标准差*(n^0.5)。其中,日波动率是指资产价格在一天内的波动幅度,可以通过计算资产价格的标准差来得到。标准差是指一组数据的离散程度,越大表示数据的波动越大。年化波动率公式的应用非常广泛,可以用于衡量股票、债券、商品等各种资产的风险。
夏普比率是一种衡量投资组合的风险调整收益的指标。
它用于评估投资组合每单位风险所获得的超额回报。
夏普比率的计算公式如下:夏普比率 =(投资组合的年化收益率-无风险利率)/投资组合的年化波动率
#我们模拟创建一个收益率时间序列,看看它的年化波动率及夏普比率
volatility_array=np.random.normal(size=100)/100
volatility_array#模拟的收益率序列
#计算收益率年华波动率
def calculate_volatility(return_series):
# 计算收益率的标准差
volatility = np.std(return_series)
# 调整为年化波动率
_volatility = volatility * np.sqrt(252) # 假设每年有252个交易日
return print('年化波动率为:',round(_volatility,2))
calculate_volatility(volatility_array)
# 年化波动率为: 0.16
#计算夏普比率
def calculate_sharpe(annualized_return, annualized_volatility, risk_free_rate):
sharpe_ratio = (annualized_return - risk_free_rate) / annualized_volatility
return sharpe_ratio
# 设投资组合的年化收益率为20.35%,年化波动率为0.1545,无风险利率为5%
annualized_return = 0.2035
annualized_volatility =0.1545
risk_free_rate = 0.05
sharpe_ratio = calculate_sharpe(annualized_return, annualized_volatility, risk_free_rate)
print("Sharpe比率为: {:.2f}".format(sharpe_ratio))
#Sharpe比率为: 0.99
1.3最大回撤
最大回撤是衡量投资组合或资产在某一段时间內从峰值到谷底的最大跌幅。最大回撤可以帮助投资者评估投资组合或资产的风险和历史最大损失。
#计算最大回撤
def calculate_max_drawdown(prices):
max_drawdown = 0
peak = prices[0]
for price in prices:
if price > peak:
peak = price
drawdown = (peak - price) / peak
if drawdown > max_drawdown:
max_drawdown = drawdown
return max_drawdown
# 计算最大回撤
#之前的收益率序列要改一下,转换为累计收益
volatility_array_cum=np.cumprod(1+volatility_array)
max_drawdown = calculate_max_drawdown(volatility_array_cum)
print("Max Drawdown: {:.2%}".format(max_drawdown))
#可视化累计收益走势,起始为1
plt.plot(np.arange(0,100),volatility_array_cum)
Max Drawdown: 9.63%
1.4本节小结:
本节我们主要了解了几个知识,收益率及复利,年化波动及夏普比率、最大回撤等。这些知识对于有基础的同学来说不算什么,但是对于没有基础的同学来说,还是需要了解一些。
本节内容不要求金融专通,只需要理解其概念即可。
1.5本节思考题:
未来5年,每年初都有一笔1W的资金到账,每次都投资到银行,年收益率为5%,那么5年后,银行账户余额是多少?
2、量化投资中重要的财务知识及python代码实现。
2.1财务报表之构成
财务报表的构成主要包括以下部分:
资产负债表:主要反映公司在某一特定时期的资产负债及所有者权益状况的报表。
利润表:主要反映公司在一定会计期间的经营业绩报表,即利润或亏损的情况。
现金流量表:主要反映公司在一定会计期间企业经营活动、投资活动、筹资活动对其等价物产生影响的报表。
所有者权益变动表:反映一定会计期间构成所有者权益各个组成部分当期的增减变动情况。
此外,财务报表附注也是财务报表的重要组成部分,包括对会计报表各要素的补充说明以及对那些会计报表中无法描述的其他财务信息的补充说明。
我们这里不详细讲解财务报表的构成以及内容,最主要是能力有限,无法用一个关卡就让各位深度了解财务报表。
所以我们接下来只需要了解一些关键的财务指标及意义即可。
这样,我们就可以在量化投资中使用这些指标来分析投资标的或者构建量化策略了。
2.2财务报表之指标比率
阅读材料四
盈利能力指标
净资产收益率ROE:它是企业净利润与净资产的比率,反映所有者权益所获报酬的水平。这个比率通常也被称为净资产收益率,英文缩写ROE。公式为ROE = 净利润 / 净资产。ROE指标值越高,说明投资带来的收益越高,该指标体现了自有资本获得净收益的能力。同时,ROE也可以用来评估公司的盈利能力、偿债能力和运营效率等方面的情况。
销售毛利率: 销售毛利率是毛利润与销售收入的百分比,通常称为毛利率。其计算公式为:销售毛利率=(销售收入-产品成本)/销售收入×100%。销售毛利率是重要的经营指标,能反映公司产品的竞争力和获利潜力。一般情况下,毛利率高于同行,说明公司存在成本上的优势,有竞争力。
资产回报率:资产回报率是用来衡量公司运用所有资产创造净利润的指标。其计算公式为:ROA = 净利润 / 总资产。
偿债能力
流动比率:流动比率是流动资产对流动负债的比率,计算公式为:流动比率=流动资产/流动负债X100%。一般说来,比率越高,说明企业资产的变现能力越强,短期偿债能力亦越强;反之则弱。
资产负债率: 资产负债率又称举债经营比率,是评价公司负债水平的综合指标。同时也是一项衡量公司利用债权人资金进行经营活动能力的指标,也反映债权人发放贷款的安全程度。
营运能力
存货周转率:存货周转率又名库存周转率,存货周转次数=营业收入/存货平均余额,用于反映存货的周转速度,即存货的流动性及存货资金占用量是否合理,促使企业在保证生产经营连续性的同时,提高资金的使用效率,增强企业的短期偿债能力。
固定资产周转率:固定资产周转率,也称固定资产利用率,计算公式为固定资产周转率 = 营业收入 / 平均固定资产净值。固定资产周转率表示在一个会计年度内,固定资产周转的次数,或表示每1元固定资产支持的销售收入。
应收账款周转率:应收账款周转率是企业在一定时期内赊销净收入与平均应收账款余额之比。它是衡量企业应收账款周转速度及管理效率的指标。应收账款周转率=当期销售净收入/(期初应收账款余额+期末应收账款余额)/2
成长能力
营业总收入增长率:营业收入增长率是指企业本年营业收入增加额对上年营业收入总额的比率,营业收入增长率=(营业收入增长额/上年营业收入总额)×100%,常用来衡量企业成长能力。
净利润增长率: 净利润增长率是指企业当期净利润比上期净利润的增长幅度,指标值越大代表企业盈利能力越强。净利润增长率=(净利润增长额÷上年净利润)×100%
现金流情况
净现金流量:净现金流量是现金流量表中的一个指标,是指一定时期内,现金及现金等价物的流入减去流出的余额,反映了企业本期内净增加或净减少的现金及现金等价数额。
净利润现金比率:净利润现金比率是指企业本期经营活动产生的现金净流量与净利润之间的比率关系。其公式是净利润现金比率=经营现金流量净额 /净利润。
2.3财务报表数据的获取及计算
一般付费数据库有提供计算好的财务指标数据,但也不排除某些指标需要获取原始数据进行自定义计算。开源的数据源一般需要自己计算。
常规的操作就是
- 获取财务报表数据
- 合并报表计算指标数据
我们接下来以600519利润表为例,看看如何获取及计算相关数据。
stock_financial_benefit_ths_df = ak.stock_financial_benefit_ths(symbol="600519", indicator="按报告期")
#为了更加理解,我们先可视化下营业总收入的走势吧。
stock_financial_benefit_ths_df=stock_financial_benefit_ths_df.set_index('报告期').sort_index()
stock_financial_benefit_ths_df
#查看下列名
stock_financial_benefit_ths_df.columns
#可视化营业收入走势
df_600519=stock_financial_benefit_ths_df['*营业总收入'].str.replace('亿','').astype(float)
df_600519.plot(figsize=(16,8))
#看起来不太正常对么?因为是按照报告期来计算的,所以要做个转换,我们只要年底12-31的数据。
df_600519.index=pd.to_datetime(df_600519.index)
df_600519.asfreq('A').plot(figsize=(16,8))
df_600519=pd.DataFrame(df_600519)
#计算同比增长率
df_600519['营收同比增长'] =df_600519.pct_change(4)*100
# 将数据按年重新采样,并创建一个新的DataFrame对象
df_resampled = df_600519.asfreq('A')['2002':]
# 创建具有多个轴的图形
fig, ax1 = plt.subplots(figsize=(16, 8))
ax2 = ax1.twinx() # 创建一个新的轴,共享x轴
# 在左侧轴上绘制第一列数据
ax1.plot(df_resampled.index, df_resampled.iloc[:, 0], 'b-', label='营业总收入')
ax1.set_ylabel('营业总收入')
# 在右侧轴上绘制第二列数据
ax2.plot(df_resampled.index, df_resampled.iloc[:, 1], 'r-', label='营收同比增长')
ax2.set_ylabel('营收同比增长')
# 添加图例
lines, labels = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax1.legend(lines + lines2, labels + labels2, loc='upper left')
# 显示图形
plt.show()
2.4本节小结:
到这就完成了对营业总收入数据的获取与指标的计算,是不是很简单?
剩下的工作就是统计与横向对比了,后期我们详细聊,这里只需要各位对2.2节的财务指标如何获取数据,如何计算有个了解即可。
2.5本节动手题:
上述是以计算营收同比增长为例子,那么如何计算净利润同比增长呢?
3、资产估值及定价学习,利用python代码实现资产定价
3.1无风险利率
阅读材料五
无风险利率是指将资金投资于某一项没有任何风险的投资对象而能得到的利息率。这是一种理想的投资收益,一般受基准利率影响。
在国内投资市场中,无风险利率主要存在三种,分别是国债收益率、银行定期存款利率、上海银行间同业拆借利率。
值得注意的是,无风险利率并不是一成不变的,它会随着市场环境和经济状况的变化而变化。
为什么我们要先了解无风险利率?因为它是很多估值方法必然要了解的一个参数。
例如经典的资本资产定价模型:E(ri)=rf+βim(E(rm)-rf)
其中:
E(ri) 是资产i 的预期回报率
rf 是无风险利率
βim 是Beta系数,即资产i 的系统性风险
E(rm) 是市场m的预期市场回报率
E(rm)-rf 是市场风险溢价,即预期市场回报率与无风险回报率之差。
从这个公式就能看出来,无风险利率可以说是任何投资品种收益定价的基础。
一般情况下,无风险利率决定某投资品种收益的下限。当然收益的构成是复杂的,我们简化一下,可以将收益r看做无风险利率r0+风险溢价r1两部分构成。
无风险利率r0,银行存款,国债收益率都是无风险利率的代表,指无本金损失风险最低能获得的收益率。
风险溢价r1,是最为复杂的部分,包括通货膨胀溢价、利率风险溢价、信用风险溢价、市场风险溢价等,咱们知道即可,所以这里简化一下,统称为风险溢价部分。
我们看看上海银行同业拆借市场3M期的利率走势
3.2相对估值法
相对估值法是一种常用的股票估值方法,它通过比较类似的公司(同行业或同市场)来确定某家公司的价值。相对估值法通常会选择一些关键的比较指标,例如市盈率(P/E)、市净率(P/B)、市销率(P/S)等,然后根据这些指标来评估公司的价值。
相对估值法的优点在于它能够反映市场对该类公司的整体看法,有助于投资者做出更为准确的投资决策。此外,该方法还可以用来判断公司的股价是否被低估或高估。
相对估值法也存在一些局限性。首先,它需要找到与该公司类似的公司进行比较,这可能需要花费一定的时间和精力。其次,即使找到了类似的公司,也需要对这些公司的数据进行适当的调整,以反映它们之间的差异。此外,相对估值法无法给出公司的绝对价值,因此需要结合其他方法来使用。
阅读材料五
1.市盈率(P/E)是指股票在市场中的价格与每股收益的比率。市盈率越高,表明股票价格相对于公司收益的溢价越高。通常来说,如果市盈率过高,那么该股票的价格可能存在泡沫,价值被高估;而如果市盈率过低,则可能存在投资机会。我们接下来获取某只股票的市盈率来看看
2.市净率(简称P/B)指的是每股股价与每股净资产的比率。市净率可用于股票投资分析,一般来说市净率较低的股票,投资价值较高,相反,则投资价值较低。
市净率的计算公式是:市净率=股票价格/每股净资产。市净率体现的是市场价格相对于公司价值的比率!
3.市销率(简称P/S)是指总市值与主营业务收入之间的比率。市销率主要应用于评估企业的经营前景,尤其是对于那些没有盈利或者资不抵债的企业。这是因为市销率不会出现负值,而且相对稳定可靠,更贴近市场实际情况。
4.等等等.....
我们这里不演示公式的计算,因为过于简单。
上面这些估值指标之所以属于相对估值法,完全因为需要对比才有效果,常规来说相对估值法用法有几种:
1.公司当前市盈率与历史水平进行对比,看看所处的位置。
2.公司当前市盈率与行业平均水平进行对比,看看所处的水平。
3.公司当前市盈率与同行业中其他公司的市盈率进行对比,看看价值高低。
#我们这里演示一下市盈率估值法的第一种用法
stock_600519_ = ak.stock_zh_valuation_baidu(symbol="600519", indicator="市盈率(TTM)", period="近一年")
stock_600519_.set_index('date', inplace=True)
stock_600519_
#可视化一下看看,明显的市盈率处于过去一年的低点
stock_600519_.plot()
#我们可以使用标准差方法做一个60日滚动的估值走势通道。
def sigma(df):
df['mean']=df['value'].rolling(60).mean()
df['std']=df['value'].rolling(60).std()
df['正2倍']=df['mean']+df['std']*2
df['负2倍']=df['mean']-df['std']*2
return df
stock_600519_sigma=sigma(stock_600519_)
stock_600519_sigma.loc[:,['value','正2倍','负2倍']].plot()
#估值走势通道
3.2.1 小思考
我们用滚动计算的方法计算出来了市盈率走势通道,就你观察的情况,你认为目前的估值水平如何?能不能自己尝试用其他指标计算一下?
3.3绝对估值法
绝对估值法是一种关于内在价值的估算方法,一般情况下有现金股利贴现模型和自由现金流贴现模型。
现金股利贴现模型的理论基础是现值原理,任何资产的价值都是其未来现金流的现值总和,只不过它的现金流就是预期的现金股利(分红)。一般情况下,这种估值方法比较适合分红多且稳定的公司。
现金流贴现模型,通过计算企业未来现金流,然后将其折现,最后加总得出企业价值。这种方法认为一家企业值多少钱,主要看在其生命周期内能产生多少预期现金流,以及这些现金流的确定性。
市场上常用现金流贴现模型,分为三种情况,固定增长率模型、二阶段增长模型、三阶段增长模型:
永续增长模型:即自由现金流按照固定的增长率g增长,计算公式为P=D/(r-g),r为折现率,一般用wacc加权平均资本成本替代,默认为10%。
二段增长模型 :
其中:
P :企业价值
FCFFk: 第 k 年的企业自由现金流
r : 折现率
n1 : 第一阶段的持续年份
TV: 最终价值
在实际操作中,我们给于成长公司第一阶段高增长率,第二阶段一个低增长率。
自由现金流:𝐹𝐶𝐹𝐹 = 𝐸𝐵𝐼𝑇 ∗ (1 −Tax Rate) + 折旧和摊销 − 资本性支出 − 净营运资本变化
公式看上去有点复杂,但是其背后的逻辑是很清楚的,本质上就是企业的净利润和自由现金流在某些分项上是不匹配的,需要做一些加减项的调整。
# 某股2023年中报每股自由现金流为25.96元,预计23年全年50元。
# 预计未来3年自由现金流保持12%的速度增长,此后每年保持6%增长速率,折现率为10%,按照上述公式,理论股价为:
def free_cash_flow(fcff, r, n, g, g1):
'''
fcff : 第0年的企业自由现金流
r : 折现率
n : 第一阶段的持续年份
g : 第一阶段的增长速率
g1: 永续增长速率
'''
data_n = np.repeat(fcff, repeats=n) # 建立现金流序列
data_g = np.repeat(g, repeats=n) # 第一阶段增长率
data_date = np.arange(1, n+1)
data_fcff = data_n*(1+data_g)**data_date
TV = data_fcff[-1]*(1+g1)/(r-g1)
p = np.sum(data_fcff/(1+np.repeat(r, n))**data_date)+TV/(1+r)**n
return p
print('理论价格为:',free_cash_flow(50,0.1,3,0.12,0.06))
理论价格为: 1554.1157024793388
有了上述理论基础,我们就可以根据企业的估值与市价进行对比,从而得出相对高估/低估的结论。
当然细心的朋友应该可以发现,里面参数的调整对最终的估值影响较大。
一般情况下,使用绝对估值法设置参数时,我们都要谨慎在谨慎,且要有金融理论或者市场特征依据,否则估值就是镜中水月。
3.4本节小结
本节我们学习了相对估值法及绝对估值法的理论基础及代码实践。主要目的还是希望给各位一个理论基础,为后期的学习打下理论基础。
3.5本节动手题
请你任意找一只股票,利用上述演示的绝对或者相对估值法,判断它的估值水平,是否值得买入?