“风险和资金管理”是基于一本量化交易书: “Successful Algorithmic Trading”第十三章的翻译。互联网上可以找到这本书的英文版本。
这一章主要介绍风险的分类和测量以及为了风险最小化收益最大化相关的资金管理技术。
初次翻译英文书籍,见笑了。
分割线
本章主要关注应用量化交易策略时的风险管理。风险管理一般有2个步骤。
首先,标识和减轻可能影响算法交易策略收益和运行的内部和外部因素,接着,优化策略组合,尽量最大化收益增长率,最小化账户回撤。
在第一部分,我们将考虑哪些可能影响算法交易业务长期收益的,不同来源的风险(包括内生风险和外部风险)。
在第二部分,我们将看看那些资金管理技术,既能保护我们的投资组合,又能最大化净资产长期增长率。
在最后一部分,我们将关注机构级别的风险管理技术,当然它们也很容应用个人投资者。
13.1 风险源
有许多风险源能影响算法交易策略的正确执行。上下文中定义的“风险”意味着账户亏损的机会。但我将更宽泛的定义风险:风险意味着某种因素,它提供了不确定性的一个度量,并且影响我们的策略或投资组合的收益。
我们将考虑如下几种风险:投资组合风险,市场风险,对手方风险以及操作风险。
13.1.1 策略风险
策略风险或者模型风险,包括这一类风险,由基于统计模型的交易策略设计和实现引起。
包括我们在“成功的回测”章节讨论的所有的问题,比如曲线拟合,幸存者偏差和前向偏差等。也包括那些与策略模型统计分析直接相关的主题。
所有统计模型都是基于假设。这些假设有时没有考虑合适的深度,有时忽略了整体。这意味着基于这些假设可能是不合适的,因此导致糟糕的预测和推导能力。线性回归的设置中有常见的例子。线性回归假设返回数据是同方差的(比如,返回的误差有固定的方差)。如果这不是实际情况,那么线性回归提供的参数估计是不精确的。
许多量化策略利用历史价格数据的描述性统计,特别是,他们经常用数据片刻比如均值,方差,斜率和峰态,都是策略返回的。像这样的模型(包括下面要介绍的“凯利公式”)都依赖这些片刻值是常量。在市场机制改变以后,这些片刻值可能会有巨大的改变,因此会导致模型退化。为了解决这个问题,模型会采用“滚动参数”。
13.1.2 投资组合风险
投资组合包含1个或者多个策略。因此,上面介绍的策略风险间接影响它。另外,在投资组合层级也有特定的风险。这些经常只考虑机构配置和高端个人配置,会在稳定的交易策略上对投资组合进行跟踪。
当投资组合退化到一系列因子,比如工业门类,资产级别,金融实体分组,搞清楚是否资产组合重度依赖特定因素是很有可能的。举个例子,一个股票资产组合可能非常依赖技术类股票,因此极易受那些影响科技行业的问题的影响。因此,为了考虑这些重度因子的风险,在投资组合级别就需要改写特定的策略。在有更多资本分配的机构环境中,这些都是重点关注的,并且资本保值优先于资本增值。个人算法交易投资者也是要考虑这些问题的。
另一个是每日交易量限制,是由来已久的问题(不考虑流动性很差的资产)。对于个人交易者,在大盘和商品期货市场上执行策略,不需要考虑市场影响。但是在一个流动性不活跃的品种上交易,不能交易量过大,比如是每日交易量的很大比例。由于这个潜在市场影响,先前的回测模型(经常不会考虑市场影响)会失效。为了避免这个问题,提前计算每日交易量的平均值是必要的(比如用一定周期的均值),保持这个量的小比例进行交易。
运行一系列策略的投资组合也会带来策略相关性问题。相关性可以通过皮尔逊相关系数等统计技术来计算。但是相关性本身并不是稳定的,特别是在市场流动性约束下,通常被称为金融危机蔓延,它也会遭受影响而快速变化。
总的来说,多个策略应该区分资产类别或者时间范围来避免相关性。滚动相关性可以通过大的时间周期来估计,如果使用投资组合方法,相关性估计应该作为你的回测系统的一个标准组件。
13.1.3 对手风险
对手风险总体上被认为是信用风险的一种形式。这个风险是指对手不支付他们有责任支付的金融资产。这是与风险对冲工具定价相关的量化金融的一个子集。但这并不是我们个人算法交易者主要关心的,我们更关心来自于交易所或者经纪行业的风险。
这看起来很学术,我个人能保证这些问题很真实!在我经历的一个机构遇到经纪人破产,意味着所有交易投资被退回。因此我现在在投资组合中考虑这个风险因素。为了减轻这个问题,推荐的方法是利用多个经纪,然而保证金交易情况下会导致交易逻辑更棘手。
对手风险总的来说是机构考虑的事情,因此我这里不会过多阐述。
13.1.4 运营风险
运营风险包含来源于基金或者交易运营机构的一系列风险,也包括商业/企业风险,IT风险和外部法规或者法律改变等的风险。这些主题经常不会进行深度探讨,我相信某种程度上折是短视的,因为这些问题完全有可能永久地停止交易。
基础设施风险经常与信息技术系统和其他交易架构相关联。这也包括雇佣风险(比如欺骗,突然离职等)。随着的基础设施规模增长,因此单点故障的可能性也会增加。这在交易基础设施中是很重要的。如果发生故障,可能导致整个系统宕机的灾难。以IT观点来看,这通常是拙劣的架构导致的结果,以非IT观点来看,这可能是糟糕的架构图导致的后果。
这些问题都与个人交易者有关。通常,因为补丁和黑客导致信息技术或者交易基础设施破坏。另外,缺乏记录和其他管理失败也可能导致巨大的潜在税负。令人欣慰的是,云架构提供了系统和自动化处理冗余的能力,从而导致良好的管理习惯。这类型的情况,不是来自于市场和策略,经常用于区分成功的长期算法交易者和个人,通过个人会因为灾难性的运营故障而放弃。
另一个影响避险基金界的问题是报告和合规。2008年以后的法规让资产管理公司有很大的负担,主要影响现金流和运营支出。对个人来说,考虑公司化,为了发展策略或者利用外部基金,需要谨慎考虑法律和合规环境,因为这是某种程度上的“移动目标”。
13.2 资金管理
本节探讨交易中最基本的概念-资金管理。一个毫无经验的投资者或者交易者会认为唯一重要的投资目标就是赚尽可能多的钱。但是长期交易实际更复杂。因为市场参与者有不同的风险偏好和约束,投资者可能有许多目标。
许多个人投资者认为唯一目标就是张华资产的持续增加。很少或者几乎不考虑带来增长的测了风险。更成熟的个人投资者计算账户回撤,依赖其风险偏好,可能能够应付账户资产50%的减少。能应付如此巨大回撤的原因是他们了解,在杆杆使用过程中,这个可能是组合资产长期增长率的最好表现。
因此我们努力达到这样的状态:通过杠杆获取最大化长期增长率和通过尽力减小回撤的时间和程度直接的平衡。能够帮助我们的主要工具叫做“凯利公式”。
13.2.1 凯利公式
本节谈到的“凯利公式”将是我们针对一套算法交易策略组成的多策略投资组合进行杠杆率和资金分配的工具。
我们将定义杆杆为资产大小相比于真实账户净值的比率。为了说清楚我们用抵押贷款购买房屋类比。你的预付金(英国称为“保证金”)代表你的账户净值,预付金加上抵押贷款代表资产组合的大小,预付金50000美金,房子价值200000美金(抵押贷款150000美金),杠杆率 = (50000 + 150000)/ 50000 = 4。在这个例子中购买房屋使用了4倍杠杆率。保证金账户与此类似。一个“现金”部分,一个杠杆率部分,通过使用保证金更多的股票可以被借出。
在我们描述凯利公式前,我想介绍几个假定,他们有不同的准确程度:
每个交易策略的回报遵循正常的分布(例如高斯分布)。更进一步,每个策略的回报有固定的均值和标准差。公式假定这些均值和标准差不会改变,它们在过去和将来保持一致。对于大多数策略来说,明显不符合实际情况,因此需要注意这个假定。
这里的回报被认为是超额收益。这意味它们是扣除所有金融成本比如杠杆费用和交易费以后的净收益。如果在机构环境中,还需要扣除管理费用和绩效费用。
所有的交易利润都会重新进入投资,不会被撤回。在机构环境中这明显不是不行的,因为管理费会被提走,投资人也经常会撤回资金。
所有的策略都是统计独立的(策略之间没有相关性),策略回报之间的协方差矩阵是对角阵。
现在我们真正来看下“凯利公式”。想象一下我们有N个算法交易策略集合,我们希望确定如何应用杠杆以获得最大的增长率(但是最小的回撤)以及如何在策略之间分配资金。如果表使用长度为N的vector f(注:vector类似列表)表示每个策略 i 对应资金分配,比如f = (f1, f2, f3, ..., fN),然后针对每个策略 i 最优化分配的“凯利公式”就可以写成:
f i = ui / (σi * σi)
ui 是策略 i 收益的均值,σi 是策略 i 收益的标准差。这个公式本质上描述了应该给策略配置的最优化杠杆率。
虽然“凯利公式”中的 f i 虽然给了我们最优化的杠杆和策略分配,我们仍然需要真正计算我们期望的长期复合增长率,我们用 g 表示。g将由以下公式给出:
g i = r + S i *S i / 2
这里 r 是无风险收益率,也是你从经纪商借贷的利率,Si 是策略 i 的年度Sharpe比率。后者的计算通过收益的年度均值除以收益的年度标准差。阅读先前关于收益计算的章节,了解Sharpe比率。
实际的例子
让我们看看单一策略的例子(i = 1)。假定我们购买一个虚拟的股票XYZ,它的年度收益率均值 m = 10.7%,年度收益标准差 σ = 12.4%。另外,再假定我们借贷的无风险利率为 r = 3.0%,
这意味着净收益均值为 u = m - r = 10.7% - 3.0% = 7.7%。Sharpe比率 S = 0.077 / 0.124 = 0.62。
通过“凯利公式”我们可以得到最优杆杆率为:f = u / (σ * σ) = 0.077 / (0.124 * 0.124) = 5.01。因此杠杆率表明,对于100,000美元资产,我们应该借入另外的401,000美元以获得总攻501,000美元的资产。实际上这是不可能的,我们的经纪商会要求我们提供大量的保证金,因此“凯利公式”需要调整。
我们能够使用Sharpe比率 S 和 无风险利率 r 来计算长期复合增长率 g = r + S * S /2 = 0.03 + 0.62 * 0.62 = 0.22,即 22%。因此我们可以期望这个策略能够带来22%的年回报率。
凯利公式的现实情况
要知道为了保持有效,“凯利公式”需要连续的平衡资金分配。明显地这在实际离散的交易环境中是不可能的,因此需要做一个近似。标准的“经验法则”是每天更新一次凯利分配。
更近一步,“凯利公式”本身应该定期重新计算,并且使用带回望窗口的均值和标准差。另外,对于一天交易一次的策略来说,这个回望窗口应该设置成3-6月。
这里是“凯利公式”下的投资组合再平衡的例子,它可能引起一些反直觉的行为。
假定我们有上面描述的策略。我们采用“凯利公式”借现金扩大我们的投资到501,000美金。假定我们接下来一天我们有5%的回报,这将使我们的账户价值达到526,050美金。
“凯利公式”告诉我们应该借入更多的资金以保持我们5.01的杠杆系数。当我们的账户净值是126,050美金而我们的投资是526,050美金时,我们的杠杆时4.17。
为了增加到5.01,我们需要借入另外的105,460美金,这样我们的账户资产达到613,510.5美金(5.01 * 126050)。
现在考虑接下来一天我们的资产损失10%,这意味着总的投资现在是568,359.45美金(631510.5*0.9)。我们的账户净资产是62,898.95美金(126050 - 631510.5 * 0.1),这意味着我们当前的杠杆率为568,359.45 / 62898.95 = 9.03。
因此我们需要卖出253,235.71美金的股票为了减少我们的投资达到315,123.73美金。 这时我们的杠杆又回到5.01。
因此我们盈利的时候买进亏损的时候卖出。亏损的时候卖出可能在感情上有困难,如果“凯利”假设都被满足的情况下,这在数学上是要做的“正确”的事情。这个方法是为了最大化长期复合增长率。
你可能注意到以天为周期进行资金重新分配太过于激励。这个例子是人为的,特地使用的大杠杆。一天10%的损失在高频算法交易不是特别常见的,但这个例子显示了大杠杆可能占绝对地位。
因为均值和标准偏差的估计总是不确定的,实际中许多交易者倾向于用更保守的杆杠结构比如“凯利公式”结果处于2,被称为“半凯利”。
“凯利公式”应该被认为是一个杠杆使用的一个上界,而不是一个直接规范。如果这个建议不被注意而直接采用“凯利公式”的结果可能导致灾难(比如账户净资产变为0),因为策略回报并非高斯分布。
你应该使用凯利公式吗?
每个算法交易者是不同的,但有风险偏好是一定的。当选择使用一个杆杆策略时(凯利公式公式只是其中一个例子),你应该考虑你需要工作在何种风险条件下。对于个人交易者,你能设定你自己的最大回撤,从而增加杆杆率。对于机构环境,你需要考虑不同视角的风险和更大框架更多其他因素下的杠杆因素。
13.3 风险管理
13.3.1 风险价值
对于长期资本增长来说,对单个算法交易策略或者策略组合进行亏损风险估算是非常重要的。机构环境下,许多风险管理技术被开发出来。一个特别的技术,叫做风险价值 VaR,将是本节的主题。
我们将使用VaR概念帮助我们在交易中量化单个策略或者策略组合的风险。VaR定义如下:
给定置信度,VaR是在给定时间周期投资组合损失大小的估计。
这里的“Portfolio”可以代指单个策略,一组策略,交易簿,自营交易,避险基金或者整个投资银行。“给定的置信度”是一个值,比如95%或者99%。"给定时间周期”将这样被确定:如果一个投资组合被清算只会导致最小的市场影响所需要的时间。
例如,VaR = 500,000美元,置信度为95%,时间周期为一天,可以简单表述为:接下来的一天,有95%的可能性损失不超过500,000美元。数学表达式为:
P(L <= -5.0*100000) = 0.05
或者更通用的表达式:置信度为c,损失L超过VaR的概率为:
P(L <= -VaR) = 1 - c
VaR的“标准”计算需要如下假设:
- 标准市场条件 - VaR不应该被认为是一个极端事件或者“尾部风险”,它应该是日常操作中损失的期望值。
- 波动和相关性 - VaR需要资产的波动数据,也需要它们各自的相关性数据,这两个数据很难被估算,因为它们在持续的变化。
- 回报的正规化 - 标准形式的VaR假定资产回报或者投资组合是正太分布。这导致简单的分析计算,但是实际大多情况下是不现实的。
13.4 优点与缺点
VaR在金融领域是无处不在的,因此你应该熟悉这个技术的优点和缺点。一些优点如下:
- VaR是针对个别资产,算法交易,量化组合,避险基金甚至银行投资部门的相关简单的计算。
- VaR相关的时间周期可以因为多个不同时间范围的策略而修改。
- 不同VaR值可以与不同形式的风险关联,比如资产类别或者交易品种类型。这使得很容易解释主要的资产风险可能聚集在哪。
- 单个策略能够约束因为整个投资组合可能基于单个的VaR。
- VaR能够被非技术的外部投资者和基金经理直接解释。
VaR不是没有缺点: - VaR没有讨论期望损失超过VaR值的数量。它告诉我们可能看到损失超过某个值,但是没有告诉我们具体超过多少。
- 因为它使用历史数据没有考虑将来市场结构变化可能改变波动性和资产相关性。
VaR不应该独立使用。它应该总是和一套风险管理技术一起使用。比如分散投资,最优化投资组合分配以及谨慎使用杠杆等。
计算方法
目前为止,我们仍然没有讨论VaR的真正计算,不管是一般情况还是具体的交易实例。有3个技术将是吸引我们的。第一个是方差-协方差方法(使用正态分布假设),第二个是蒙特卡洛方法(基于潜在的非正态分布)和第三个是历史推导,使用历史的资产回报数据。
本节中我们将集中介绍方差-协方差方法。
方差-协方差方法
考虑一个投资组合P 美金,置信度为c,资产(策略)日回报标准偏差 σ 和均值 u。针对单个资产(策略),基于方差-协方差方法的VaR计算公式如下:
P - (P(α(1 - c) + 1))
这里α是均值 u 和标准偏差 σ 的正太分布对应的累积分布的逆函数。我们能用SciPy和pandas库来计算这些值。如果设定P = 1000000和 c = 0.99,
我们可以用SciPy的ppf方法来计算α。这个例子中,每日回报历史数据来自于花旗集团(这里我们很容易用算法策略的回报来代替)。
#!/usr/bin/python
# -*- coding: utf-8 -*-
#var.py
from __future__ import print_function
import datetime
import numpy as np
import pandas.io.data as web
from scipy.stats import norm
def var_con_var(P, c, mu, sigma):
alpha = norm.ppf(1-c, mu, sigma)
return P - P*(alpha + 1)
if __name__ == '__main__':
start = datetime.datetime(2010, 1, 1)
end = datetime.datetime(2014, 1, 1)
citi = web.DataReader("C", 'yahoo', start, end)
citi["rets"] = citi["Adj Close"].pct_change()
P = 1e6
c = 0.99
mu = np.mean(citi["rets"])
sigma = np.std(citi["rets"])
var = var_cov_var(P, c, mu, sigma)
print("Value-at-Risk: %0.2f$" % var)
Value-at-Risk: 56503.12
VaR是相当有用而且在金融管理领域无处不在的技术。但它也是有缺陷的。David Einhorn,有名的避险基金经理有关于VaR最著名的论断:“安全气囊所有时间都工作的很好,除了出车祸的时候”。你应该总是把VaR作为你风险管理的增强,而不是单一指标。