控制风险是每一位投资者都需要学会的技能,面对变化更加迅速且不断演变的数字货币市场,程序化交易者尤其需要注重风险管理。这是因为程序化交易往往基于历史数据和统计模型来自动执行交易,而在快速波动的市场中,这些模型可能迅速变得不再准确。因此,有效的风险管理策略对于保护投资者的资本至关重要。
在诸多风险管理工具中,价值在风险(Value at Risk,简称VaR)是一种广泛使用的风险度量方式,它可以帮助投资者预测在正常市场条件下投资组合可能发生的最大损失。VaR能够将风险量化为一个单一数字,简化了风险的表述,使得投资者能够直观地理解潜在的损失。
VaR,或称“在险价值”,是用来量化在一定的时间内,按照一定的置信水平,所能承受的最大可能损失。换句话说,它告诉投资者或风险管理者:“在正常市场状况下,我们有多少钱是在'安全'的范围之内,而不会在明天就亏掉。” 比如,如果一个数字货币投资组合的1天99%VaR是$10,000,那么意味着在99%的情况下,我们预计一天的损失不会超过$10,000。
易于理解: 例如,一个数字货币投资组合的1天95%VaR是$5000,这意味着有95%的信心认为,投资组合在一天之内的损失不会超过$5000。把复杂风险量化为一个直观数字,易于非专业人士理解。当然这样也不可避免的有一定的误导性。
比较标准: 假设有两个投资组合A和B,A的1天95%VaR是$3000,而B的是$6000。这意味着在正常市场条件下,A的风险低于B。即使这两个投资组合包含不同的资产,我们也可以直接比较它们的风险水平。相应的,也可以判断投资水平的高低,如果A和B两个策略的过去一个月的收益都是$6000,而A的平均和最大VaR值显著低于B,我们可以认为A策略更好,能在更低的风险水平下实现了更高的收益。
决策工具: 一个交易者可能会使用VaR来决定是否增加一个新的资产到投资组合中。如果新增资产使得VaR显著增加,这可能意味着新增资产的风险与投资组合的风险承受水平不匹配。
忽视尾部风险: 如果一个投资组合的1天99%VaR是$10000,那1%的极端情况下的损失可能远远超过这个数值。数字货币领域,黑天鹅事件很频繁,极端情况会超出大多数人的预料,因为VaR没有考虑尾部事件。
假设限制: 参数VaR通常假设资产收益是正态分布的,这在现实市场中很少成立,特别是在数字货币市场。例如,假设一个投资组合中只有比特币,我们使用参数VaR并假设比特币的收益是正态分布。但实际上,比特币的收益率可能会在某些时期出现大的跳跃,存在明显的波动率聚集现象,如过去一周波动率很大,接下来的波动率比较显著概率会提高很多,这会导致正态分布模型低估风险。有模型会考虑到这个问题,如GARCH等,今天就不讨论了。
历史依赖: VaR模型依赖于历史数据来预测未来的风险。但是,过去的表现并不总是预示未来的情况,尤其是在快速变化的市场如数字货币市场。例如,如果过去一年比特币非常稳定,历史模拟法可能会预测一个很低的VaR。然而,如果突然出现监管变化或市场崩溃,过去的数据将不再是未来风险的有效预测器。
主要有三种计算VaR的方法:参数方法(方差-协方差法):假设收益率遵循某种分布(通常是正态分布),使用收益率的均值和标准差来计算VaR。历史模拟法:不做任何关于收益率分布的假设,直接使用历史数据来确定潜在的损失分布。蒙特卡罗模拟:使用随机生成的价格路径来模拟资产价格,并从中计算VaR。
历史模拟法这个方法直接利用过去的价格变化来估计未来可能发生的损失。它不需要对收益分布做出任何假设,因而适用于那些收益分布未知或异常的资产,比如数字货币。
以一个比特币的现货持仓为例,如果我们想计算这个投资组合的1天95%VaR,我们可以这样做:
下面是一段具体代码,获取了过去1000天的数据,计算出当前持有一个BTC现货的VaR为1980USDT。
import numpy as np
import requests
url = 'https://api.binance.com/api/v3/klines?symbol=%s&interval=%s&limit=1000'%('BTCUSDT','1d')
res = requests.get(url)
data = res.json()
confidence_level = 0.95
closing_prices = [float(day[4]) for day in data]
log_returns = np.diff(np.log(closing_prices))
VaR = np.percentile(log_returns, (1 - confidence_level) * 100)
money_at_risk = VaR * closing_prices[-1] * 1
print(f"VaR at {confidence_level*100}% confidence level is {money_at_risk}")
考虑相关性的VaR计算
在计算包含多个资产的投资组合的VaR时,我们必须要考虑资产之间的相关性。如果资产之间的价格变动是正相关的,那么组合的风险会增加;如果是负相关,组合的风险则会减少。
使用历史模拟法计算考虑相关性的VaR时,我们不仅要收集每个单独 资产的历史收益率,还要考虑这些资产收益率的联合分布。实际操作时,你可以直接使用投资组合的历史收益率进行排序和计算,因为这些收益率已经隐含了资产间的相关性。 在数字货币市场,相关性尤其重要,基本上都是BTC作为市场主导,如果BTC走牛,其他数字货币上涨的概率会增加,如果BTC迅速大涨或大跌,因为市场情绪可以迅速变化,导致相关性在短期内显著增加,这在极端市场事件中尤为常见。因此,历史模拟法在考虑数字货币投资组合VaR时是一个很有用的工具。它不需要复杂的统计模型,只需要有效的历史数据,并且它自然地包含了资产间的相关性。
以持有1个的BTC多仓和10个ETH的空仓为例 ,按照前面的方法,可以计算出10个ETH空仓的VaR为1219USDT。当这两种资产组合时,VaR的计算方法如下:
confidence_level = 0.95
btc_closing_prices = np.array([float(day[4]) for day in btc_data])
eth_closing_prices = np.array([float(day[4]) for day in eth_data])
btc_log_returns = np.diff(np.log(btc_closing_prices))
eth_log_returns = np.diff(np.log(eth_closing_prices))
log_returns = (1*btc_log_returns*btc_closing_prices[1:] - 10*eth_log_returns*eth_closing_prices[1:])/(1*btc_closing_prices[1:] + 10*eth_closing_prices[1:])
VaR = np.percentile(log_returns, (1 - confidence_level) * 100)
money_at_risk = VaR * (btc_closing_prices[-1] * 1 + eth_closing_prices[-1]*10)
print(f"VaR at {confidence_level*100}% confidence level is {money_at_risk}")
结果为970USDT, 这意味着这个组合的风险低于分别单独持有相应的资产,这是因为BTC和ETH的行情具有高度相关性,多空组合的对冲作用起到了降低风险的作用。
本文将介绍一种适应性强的风险评估方法,即历史模拟法(Historical Simulation)在计算VaR时的应用,以及如何考虑资产之间的相关性来优化风险预测。通过具体的数字货币市场实例,阐述如何运用历史模拟法来评估投资组合风险,并讨论在资产相关性显著时进行VaR计算的方法。通过这种方法,程序化交易者不仅能够估计在大部分情况下的最大损失,还能对极端市场状况有所准备,从而使他们在交易中更加从容不迫,准确执行策略。