金融

货币的时间价值

货币时间价值是指货币随着时间的推移而发生的增值,也称为资金时间价值。

货币的时间价值(TVM)是指当前持有的一定量的货币比未来获得的等量货币具有更高的价值。这是因为,货币用于投资可获得收益,存入银行可获得利息,货币的购买力会因通货膨胀的影响改变。

货币的时间价值就是指当前所持有的一定量货币比未来获得的等量货币具有更高的价值。从经济学的角度而言,现在的一单位货币与未来的一单位货币的购买力之所以不同,是因为要节省现在的一单位货币不消费而改在未来消费,则在未来消费时必须有大于一单位的货币可供消费,作为弥补延迟消费的贴水。

无风险收益率 risk free rate

无风险收益率(Risk-free Rate),也称无风险报酬率(risk-free return rate),无风险收益率是指把资金投资于一个没有任何风险的投资对象所能得到的收益率。一般会把这一收益率作为基本收益,再考虑可能出现的各种风险。

无风险收益率是资金时间价值与通货膨胀补偿率之和,是除了通货膨胀风险之外,没有风险情况下的投资收益率。

VaR方法

Value at Risk 风险价值模型,也称受险价值方法、在险价值方法

VaR按字面解释就是“在险价值”,其含义指:在市场正常波动下,某一金融资产或证券组合的最大可能损失。更为确切的是指,在一定概率水平(置信度)下,某一金融资产或证券组合价值在未来特定时期内的最大可能损失。

用公式表示为:P(ΔPΔt≤VaR)=a

a给定的置信水平,默认是0.95,P资产价值损失小于可能损失上限的概率,ΔP某一金融资产在一定持有期Δt的价值损失额。VaR给定置信水平a下的在险价值,即可能的损失上限。

VaR从统计的意义上讲,本身是个数字,是指面临“正常”的市场波动时“处于风险状态的价值”。即在给定的置信水平和一定的持有期限内,预期的最大损失量(可以是绝对值,也可以是相对值)。

某一投资公司持有的证券组合在未来24小时内,置信度为95%,在证券市场正常波动的情况下,VaR值为520万元,其含义是指,该公司的证券组合在一天内(24小时),由于市场价格变化而带来的最大损失超过520万元的概率为5%,平均20个交易日才可能出现一次这种情况。或者说有95%的把握判断该投资公司在下一个交易日内的损失在520万元以内。5%的几率反映了金融资产管理者的风险厌恶程度,可根据不同的投资者对风险的偏好程度和承受能力来确定。

夏普比率 Sharpe Ratio

基金绩效评价标准化指标,风险的大小在决定组合的表现上具有基础性的作用。风险调整后的收益率就是一个可以同时对收益与风险加以考虑的综合指标,以期能够排除风险因素对绩效评估的不利影响。夏普比率就是一个可以同时对收益与风险加以综合考虑的三大经典指标之一。

投资中有一个常规的特点,即投资标的的预期报酬越高,投资人所能忍受的波动风险越高;反之,预期报酬越低,波动风险也越低。所以理性的投资人选择投资标的与投资组合的主要目的为:在固定所能承受的风险下,追求最大的报酬;或在固定的预期报酬下,追求最低的风险。

理性的投资者将选择并持有有效的投资组合,即那些在给定的风险水平下使期望回报最大化的投资组合,或那些在给定期望回报率的水平上使风险最小化的投资组合。解释起来非常简单,他认为投资者在建立有风险的投资组合时,至少应该要求投资回报达到无风险投资的回报,或者更多。

  • 夏普比率计算公式

[E(Rp)-Rf]/σp

其中E(Rp):投资组合预期报酬率,Rf:无风险利率,σp:投资组合的标准差

目的是计算投资组合每承受一单位总风险,会产生多少的超额报酬。

当投资组合内的资产皆为风险性资产时,适用夏普比率。夏普指数代表投资人每多承担一分风险,可以拿到几分报酬;若为正值,代表基金报酬率高过波动风险;若为负值,代表基金操作风险大过于报酬率。这样一来,每个投资组合都可以计算Sharpe Ratio,即投资回报与多冒风险的比例,这个比例越高,投资组合越佳。

假如国债的回报是3%,而您的投资组合预期回报是15%,您的投资组合的标准偏差是6%,那么用15%-3%,可以得出12%(代表您超出无风险投资的回报),再用12%÷6%=2,代表投资者风险每增长1%,换来的是2%的多余收益。

  • R版计算简单版本(只使用向量作为输入):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sharpe_ratio_annual <- function (R, Rf = 0, scale = NA, geometric = TRUE)
{
R = check_Data(R)
if (!is.null(dim(Rf)))
Rf = check_Data(Rf)
truescale = 252
sr <- function(R, Rf, scale) {
xR = Return.excess(R, Rf)
truetrue# 年化超额报酬除以年化标准差
SR = Return.annualized(xR, scale = scale, geometric = geometric)/StdDev.annualized(R, scale = scale)
SR
}
result = sapply(R, sr, Rf = Rf, scale = scale)
dim(result) = c(1, NCOL(R))
colnames(result) = colnames(R)
rownames(result) = paste("Annualized Sharpe Ratio (Rf=",
round(mean(Rf) * scale * 100, 1), "%)", sep = "")
return(result)
}
}
  • Python版计算简单版本(输入日收益率列表):
1
2
3
4
5
6
7
8
9
10
11
12
def sharpe_ratio(profit_list, risk_free_rate=0.03/252):
'''计算年化夏普比率
:param profit_list: 每日收益率列表
:param risk_free_rate: 无风险收益率(年度)
:return: 年化夏普比率'''
profits_array = np.array(profit_list)
risk_free_rate_array = np.array([risk_free_rate] * profits_array.size)
excess = profits_array - risk_free_rate_array
# 年化超额报酬
annual_excess = ((excess + 1).prod()) ** (252/len(excess)) - 1
std_dev = np.std(profit_list) * np.sqrt(252)
return annual_excess / std_dev

年化夏普率,使用年化超额报酬和年化标准差,详情见SharpeRatio.annualized

回撤率

回撤率是指该产品历史上一段时间最大跌幅。

最大回撤率 max drawdown

在选定周期内任一历史时点往后推,产品净值走到最低点时的收益率回撤幅度的最大值。最大回撤用来描述买入产品后可能出现的最糟糕的情况。

  • 公式

drawdown=max((Di-Dj)/Di)

D为某一天的净值,i为某一天,j为i后的某一天,Di为第i天的产品净值,Dj则是Di后面某一天的净值。其实就是对每一个净值进行回撤率求值,然后找出最大的

  • R版本简单代码(输入为向量)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
maxdrawdown <- function (R)
{
R = na.omit(R)
drawdown = Drawdowns(R)
result = min(drawdown)
result <- -result
return(result)
}
Drawdowns <- function (R)
{
x = R
colDrawdown <- function(x) {
Return.cumulative = cumprod(1+x)
maxCumulativeReturn = cummax(c(1,Return.cumulative))[-1]
column.drawdown = Return.cumulative/maxCumulativeReturn - 1
}
drawdown <- colDrawdown(x)
return(drawdown)
}
  • Python版本简单代码(输入为列表)
1
2
3
4
5
6
7
8
9
10
11
12
13
def max_drawdown(profit_list):
profits_series = pd.Series(list(map(lambda x: x + 1, profit_list)))
cumulative_return = profits_series.cumprod()
# 累计乘的array对象
cumulative_return_array = cumulative_return.values
cumulative_return_tmp = pd.Series([1]).append(cumulative_return)
# 最大累积乘
max_cumulative_return_array = cumulative_return_tmp.cummax().values[1:]
# 回撤
drawdowns = cumulative_return_array / max_cumulative_return_array - 1
# 最大回撤
drawdown = - min(drawdowns)
return drawdown

R语言

match.fun

R允许将函数作为参数,但是如果有一个与函数同名的对象,将有可能找不到这个函数,所以使用match.fun(fun)来匹配函数对象

1
2
3
4
test <- function(o, func){
func <- match.fun(func)
func(o)
}

函数参数中的省略号

出现在哪个函数中,就是这个函数的默认参数,也就是可以将这个函数的默认参数传递到内部函数的参数里,这两个函数的参数是一致的

1
2
3
4
5
6
fun1 <- function(data, graph=TRUE, ...) {
if (graph)
truetrue plot(data,...)
}
data=data.frame(x=c(1,2,3),y=c(1,2,3))
fun1(data,col="red",type="l")

dim

dim(x):查看变量的维数

NCOL

获取x的列数

1
2
NCOL <- function(x)
if (length(d<-dim(x))>1L) d[2L] else 1L

na.rm

表示是否去除数据结构中的na值,True or False

na.omit

删除含有缺失值的观测

if (na.rm) x = na.omit(x)

Return.excess

计算某段时间给定无风险收益率下的超额报酬,Return.excess(R, Rf = 0)

对于一个简单的向量,就是计算其向量R中的每一个收益率和无风险收益率的差值