Margin call的中文意思,其实远没译名来得那么文艺,直译过来是一个冷冰冰的专业术语:追加保证金通知。
说它冷,是因为所有进行保证金交易的人,在看到这个通知时往往会感到彻骨的寒意:你离爆仓、离血本无归,只有一步之遥。
而电影在一开始,就把这股寒意定在了基调之中。
投行内部大面积裁员,在公司任职了19年的风控总监Eric被扫地出门,所有权限说收就收、手机说停就停,华尔街冷酷之风扑面而来。在走人前的最后时刻,这位倒霉的老领导把一个U盘交到了下属的年轻分析师Peter手里,毫无疑问,U盘里的内容成为了之后电影的核心。
当晚同事们都去酒吧happy,唯有身受“托孤”重任的Peter备受鼓舞,选择独自待在公司跑模型加班。老天爷也没有辜负他的勤奋努力,“奖励”了他一个残酷的现实:由于使用了错误的估值模型,公司已经走在了破产边缘,套用剧中人物的话来说,就是“只可惜,我今晚站在这里,什么也没听到,只有寂静。”
I amstanding heretonight,
I amafraiddon'theara thing,
justsilence......
那么这个“菜鸟”是怎么打开潘多拉魔盒的呢?
他把MBS(住房抵押贷款证券化)动态资产池进行了现金流回测。首先用两年的统计数据,统计回测风险因子同资产池单个资产的现金流关系,估计参数出模型,然后把波动率水平延展了大概10%~15%,并把从近两周风险因子的实际表现输入到了这个新模型,观察担保债务凭证表现。结果一出,现金流的实际损失出现的频率和程度超过风险价值模型预测,尾损过大,意识到模型可能有问题。
然后就是Peter比他的老上司Eric做得成功的地方,他首先把流动性冲击对资产池的影响做了计量更正,然后把市场极端对copula相关矩阵的计量影响也做了更正,最后还把账簿上没有出表等待打包的MBS资产和已经打包但是还没转手的担保债务凭证价值做了正确的计量更正。发现有不少MBS资产中隐含的看跌期权按老模型估值显示的是虚值期权,但是按新的模型测算有相当一部分都是实值期权。
简单来说,根据新模型,市场一旦下跌25%,这些曾经带来无数收益的MBS就会产生超过公司市值的损失,导致这家投行立刻破产!
之所以他被裁掉的老板Eric没做出来,原因有两个。第一,关键的流动性风险因子隐藏在残差项里没有被正确的描述出来,回测也无法通过统计P值显著性测试;第二,copula矩阵用着简单做起来难,相关的统计学课题是博士生们每天消耗无数脑细胞攻克的难题。
所以为什么电影里一票高层间支支吾吾相互扯皮,背后暗示其实大家早就明白这会出事,但在Peter把模型做出来前打死也没人愿意提出不做这个业务呢?原因就在于你虽然知道有房地产泡沫和利率上升对CDO有巨大负面影响,但你既不知道影响程度也不知道影响的方式(市场间影响的传导机制)。你啥都不知道那你还站出来说那不是和股东、董事局都对着干么?全剧里只有工程师出身的Eric一根筋做了傻事儿,华丽被裁。而我们伟大的Peter同志MIT火箭专家出身加上运气不错,加班建模成功,深藏功与名。
关于这部电影,知乎上有一篇文章非常火:怎么评价电影《Margin Call》的专业性,
先看原文(这部分较长,请保持耐心)
专业场景1:Peter建模
提问:Eric和Peter做了什么工作?
答:他把MBS动态资产池进行了现金流回测。首先用两年的统计数据,统计回测风险因子同资产池单个资产的现金流关系,估计参数出模型,然后把模型加入流动性惩罚("……strech the pattern 10%~15% roughly……") 也就是台词中的“level of volatity”,然后peter把从上上周四到这周三风险因子的实际表现输入到了这个新模型,观察CDO的表现。发现,咦?这个现金流的实际表现和我的pattern怎么又这么大区别呢?是不是我们的模型出问题了?
这部分就是Eric没做成功但是Peter成功的地方,他首先把流动性冲击对资产池的影响做了计量更正,然后把市场极端对copula相关矩阵的计量影响也做了更正,最后还把账簿上没有出表等待打包的MBS资产和已经打包但是还没转手的CDO价值做了正确的计量更正。然后发现有不少MBS资产中隐含的看跌期权按老模型估值显示的是虚值期权,但是按新的模型测算有相当一部分都是实值期权(Red flag)。同时根据模型4,一旦市场继续下行25%,期权行权带来的损失会超过公司目前的市值!(注:MBS内涵一个看跌期权空头头寸,具体的答主下面也会提)
之所以他被裁掉的老板Eric没做出来,原因有两个,第一,关键的流动性风险因子隐藏在残差项里没有被正确的描述出来,回测也无法通过统计P值显著性测试(一般是参数的T检验);第二,copula矩阵用着简单做起来难,衍生出来的统计学课题是全世界博士生每天熬更守夜在研究的问题(公益广告:珍爱生命,远离PHD)所以你会发现明白为什么早在一年前,Eric,沙拉,凯文斯派西,CEO,等等一票高层虽然都已经知道MBS蕴含超大的风险,却没有人敢站出来说,来!我们把MBS资产清仓了!不做CDO生意了!原因就在于你虽然知道有房地产泡沫和利率上升对CDO有巨大负面影响,但你既不知道影响程度(magnitude)也不知道影响的方式(房地产到cdo市场的传导机制)。你啥都不知道那你还站出来说那不是和股东、董事局都对着干么?全剧里只有工程师出身的Eric一根筋做了傻事儿,华丽被裁。而我们伟大的Peter同志MIT火箭专家出身加上运气不错,加班建模成功,深藏功与名。
专业场景2:为什么不能抛?或者说抛不掉?
第一小问:杰拉德力主马上抛售,却被凯文老师一口回绝,原因何在?
答:两个原因:
1、因为mbs在美国交易市场采用的是做市商交易,每一个参与者的报价都是同时保ask和bid,只卖不买了?OK,那bid价就是0。我请问您一个资产的bid价是0你卖给谁?您能卖给谁?而且很明显,剧中这个公司在华尔街应该是很主要的做市商,做市商玩单边是没人接盘的。这个道理同样也适用于目前国内摇摇欲坠的新三板市场(好吧欣欣向荣的新三板市场)。
2、影响公司声誉,进而影响公司其他业务,比如上市承销,财务咨询……这些剧中凯文斯拍戏说过了,不多提。
第二小问:为什么杰拉德要问风控官沙拉,资产价值能计量到多少?
答:杰拉德关注资产价值主要是想确认公司的资产端不会因为这几天市场的糟糕情形而发生大规模减记。
主要是会计方面:在金融危机前,国际会计准则对于衍生品的计量做了重大修改,以前都是按照成本计量,现在允许金融机构按公允价格计量,变动计入其他综合收益。本来MBS资产都是按照成本法来得,你买的时候花多钱他账面上就是多少,突然你出表受阻,要按公允价值计量,另一边你的交易部又疯狂砸盘,那你资产负债表的左边和右下边都在缩水,右上边却不动,媒体往往叫“失血”(bleed),会严重影响公司股东信心,甚至可能导致破产。
第三小问:为什么沙拉的第一个回答是why are they still on the books?
答:翻译有误,这句话的意思其实是,为什么这批mbs资产还会在我们的资产负债表上?
一般而言,资产证券化的一个关键步骤是吧mbs资产装入spv,也就是出表。很明显公司广泛采用了动态资产池结构,即所有mbs资产照理说都是spv里的,发行方不会在会计上确认它。所以沙拉作为首席风控官,他日常工作里从没说过要把这一部分资产的价值进行计量(因为它们都不在账上),所以作为思维惯性,她觉得资产都不在我负债表上,是表外的,那我为什么还计量它?
为什么呢? “Because nobody wants to fucking buy it……"
这对话赞得来……
第四小问:为什么没人愿意买是个严重问题?
答:之前提过,如果没有人愿意持有这项MBS,这群资产就砸在发行人手里,出不了表,即使强行装入spv,只要没人来购买(也就是过手)那就只能确认这批资产,同时确认背后的负债。那么如果发生大规模减记,就会发生第一小问中的失血问题。杰拉德深知其中利害,直呼fxck me,而且为了免于走漏风声,支开了交易组的3人。
第五小问:为什么光是资产的计量就要用时好几个月?
答:这个设计到会计知识了,考过ACCA的应该知道,在金融危机前,国际会计准则对于衍生品的计量做了重大修改,以前都是按照成本计量,存在不能准确反应价值的问题。后来特别规定,在市场上公开交易的资产统统按公允价格计量,变动计入其他综合收益。
但现在问题来了,没人买你的CDO,市场上没有成交价,你又必须按照公允价值计量,而公允价值计量的基础又是存在交易。这就是个死循环,因为没人买你的CDO,所以你需要在会计上确认资产的公允价值,因为你要确认资产的公允价值,你需要有人买你的CDO……那怎么办呢?我总不能让会计标零吧?于是就等交易!等几周,几个月总会有的!或者我做内在价值计量,用基准利率加上信用风险息差来给你的没有交易的CDO估个价,但这里估计名义现金流又是个问题。
这就是为什么沙拉说在不流动的市场里我估值困难,要block by block的原因,因为你要对资产池里所有单项资产全估计一遍现金流,然后做一个影子评级,最后折现来估值……天啦噜,想想都觉得好多。
专业场景3:支开风控交易3人组以后,杰拉德的决议
本来这一场景我没截图,后来看评论区里很多人问资产池协方差矩阵和copula模型什么的,干脆就补充一下。
这一场景里最有代表性的对话就是COO杰拉德那句接地气又切中肯綮的那句“一加一再也不等于二了?”
是这样的,在CDO的资产池里,最重要的风险因子子项就是单项资产和单项资产之间的相关度。定量分析中一般采用统计分析,得到单因子高斯copula矩阵,然后求解。原理是下面这个方程式:
(CDO的名义现金流)/(无风险利率+信用利差)=(CDO经过风险调整的现金流)/无风险利率
计算机都有现成的程序,跑完就可以计量出资产的价值
这个copula模型有一个比较大的争议,就是他假设资产和资产的相关度(p)是时间平稳的,也就是静态的。
客观公允的说,这个假设有他的实际意义,首先计算简单,而越简单的模型越容易被更多的人检查,错误率低,第二,这个假设是物理自平衡的,也就是说当里面的资产在某个极端情况下都往一个方向偏移的时候,有自我回复平衡的趋势。
但是当市场极端(acute)的时候,copula矩阵描述的情况可能是和实际情况出入很大。注意,MBS,CDO的定价强烈依赖copula方阵,所以容易出现错估等问题。
那为什么讲1+1不再等于2呢?这是因为在COO眼里是这样的:CDO的定价的方程式咱看不懂,大道理我知道:把所有资产的现值加起来,扣除copula方阵告诉我的相关性惩罚,不就是资产池的价值么?但是现在peter很明确地指出(而不是像沙拉啊,凯文斯拍戏啊之类的人只是强烈地“暗示”)你的copula方阵有问题,计算出的惩罚连带也有问题。这还不算,我还把新的估计相关度的方法计算出来了,你资产的真实价值是负的,还负不少……完了,我必须给老大打个电话!
所以剧中你会发现,当沙主任(就是在囧叔daily show里的那个喜剧演员,他在剧中演一个合规总经理)说话的时候,杰拉德excuse me跑出去,就是给CEO大佬打电话去了。
专业场景4、执行委员会会议
第一小问:董事长为什么只和一个人握了手?那个人究竟是谁啊?
答:因为那个人是独立董事,代表中小股东利益,具有非常特殊的法律地位,独立董事本身不是公司的股东,也不是雇员,但是如果公司有重大或紧急决策时他必须在场。半夜把这个人物(人家不是公司的正式雇员,也不是股东)请过来在美国是一件非常失礼的事儿,所以导演特别给了董事长一个握手致歉的镜头。
第二小问:Peter向董事长解释的风险到底是怎么回事儿?
答:理解这个问题需要对MBS业务有相当的了解,而普通观众可能连MBS是什么都不知道,那怎么让观众理解剧情呢?导演采用了折中手法,即让peter说专业术语,董事长用接地气的汉语再重新解释一遍,那么,究竟peter说得事情是怎么回事儿呢,这里简要分析下
=====插入一段=====
首先这段场景可能是整个margin call电影中技术含量最高也最难解密的部分,理解它需要相当的金融知识沉淀,接下来您所阅读的答案已经不是最初的版本,而是在多位知友(其中不少人是国内最顶尖的结构化金融从业者)的热心帮助下修改成稿的更新结果,文字里都凝聚着他们智慧的结晶。答主个人在这里对他们致谢!
=====插入结束======
第一小问:这里的杠杆率和我们平时会计学期末考试里考的那个杠杆率是一个意思吗?
答:不完全是,会计学里的杠杆率是一个很古老的概念,就是总资产比所有者权益的倍数,描述的是整个资产负债表的结构(典型特点是静态,线性);这里的杠杆率是衍生金融工具语义下的词汇,描述的是投资成本和可变收益之间的函数关系(典型特点是非线性)
下面要分两种情况讨论了,第一种情况我们假设Peter公司做的主要是MBS类生意;第二种情况要复杂些,我们假设Peter公司做的主要是由CDS合成CDO的生意。
情况一:Peter公司做的主要生意是MBS类CDO
答:这里先普及一个知识:还没有进行真实销售的MBS资产对持有者而言等于卖出了对应份数的看跌期权(净空头头寸)。什么意思呢,就是说如果受托人(就是这家公司)账簿上有1块钱的MBS资产等待证券化。但是还没来得及出表MBS对应的房产抵押贷款就发生拖欠甚至违约,只值50美分了,那这50美分的损失你要承担。因为是CDO受托人在这个过程中本质是一个信托行为,这1块钱面值的MBS你在入表的时候资产的借方只记录了10美分甚至是没有确认(表外融资),但是损失却是50美分,翻了五倍。所以对应的风险杠杆就是5倍。
至于为什么风控没有识别出这个5倍杠杆呢(英文叫red flag)原因就在于它平常很快就出表了,不再风控VAR统算范围内(考过CFA或者FRM的人应该能够回忆,VAR有个关键参数,时间地平线T,一般MBS出表速度都比T要短)。所以归根到底,peter模型最伟大的地方在于把流动性对资产的损失(同时涵盖流动性损失,copula相关矩阵扭曲等所有风险因子)进行了准确的函数表达,算出来当市场在下降25%的时候流动性是什么样的,资产损失又是什么样的。
明白了MBS在低流动性时等于卖出一个看跌期权这个道理以后,你应该就懂为什么对话里说,公司之前挣了很多很多钱了。简言之,做卖空期权的写方生意等于:当房地产上升时,公司大把挣钱,当房地产下降的时候,公司破产。
情况二:我们假设Peter公司做的主要是由CDS合成CDO的生意
答:在次贷危机之前,除了典型的MBS类交易,市场上也活跃着不少CDO资产的交易。CDO大致分为三类:现金流CLO(SPV购买商行贷款然后过手型CDO),市价CLO(资产池锚定一定抵押折扣率然后随着资产公允价值而浮动的CDO),和合成CDO(由多份CDS净空头头寸组合的CDO)。
根据剧情,我们通常猜测Peter公司发行和交易的是最后一种合成CDO,因为他的典型杠杆率一般,潜在杠杆率却很大,风控模型稍有疏忽就能酿成大祸、
专业场景4.5:为什么凯文斯派西一句话把CEO惹毛了?
注意这段对话,不少人把这对话简单理解为导演在渲染华尔街从业者的贪婪和无情,而忽略了其中蕴含的法律背景。
第一小问:为什么董事长之前还是温文尔雅,凯文斯派西说了句“而且你知道你卖出的东西一文不值”后突然口气变得强硬、威胁?
答:按照美国的消费者保护法(没错,在神奇的美帝,消费者保护法还能管得到金融交易),卖方在向买方兜售商品时,必须如实披露商品属性,否则构成违法,轻则可以申请交易无效,重则涉及惩罚性赔偿,构成fraud的,还要追究刑事责任。
凯文同志一时间气昏头,说了句:“而且你知道你卖出的东西一文不值”。别小瞧这句话,这等于是在执委会会议上公然警告CEO说你如果销售一个你已经完全知晓有巨大当期风险(peter的模型告知)的金融资产,却不向客户disclose,是一种诈骗哦!是诈骗哦!是诈骗哦!哦!
CEO同志自然也不是吃素的,人家编程不懂模型不懂法律比谁都懂:“我们以公允价格把金融资产卖给有意向的买家”。也就是说这里的法律逻辑是说,不是讲我有意隐瞒、欺诈客户,而是我这里是一个公开市场行为,价格由市场交易决定,资产是市场公开接受的,价格是买卖双方公允决定的。欺诈要件不构成。
至于这个到底在司法上够不构成欺诈?嗯,请各位百度JP摩根银行 空格 巨额司法部罚款。
专业场景5:开盘后交易,交易员的“行话”解密
第一小问:为什么你买债券还不在乎发行机构?
答:不在乎发行机构的原因可能性最大的是这么种情况:交易的标的恰好是Agency MBS。也就是房地美和房利美打包并发行的MBS.这一类的标的因为有美联储的联合信用担保,违约或本金损失概率较低,信用登记次于国债高于州券和县券,交易的主要风险因子还是流动性啊早偿啊和隐含期权这一类,所以剧中的美女交易员直接说“no, not really"。证据是帅气男主角will反问的那句"where it from?do you care",语气反讽,暗示这个美女交易员平时专门做angency MBS,别的从来不碰。
第二小问:为什么是375million这么一个不零不整的怪数字?
答:因为它是金融工程切割出来的。这里是一个15年到期,票面利率libor+150bps的优级证券,总发行资产1000,结构化后切割切成375 375 250三个层级,交易的恰好是375。
cocos2dx 2.2版本一下json解析
#include "cocos2d.h"
#include "cocos-ext.h"
USING_NS_CC;
USING_NS_CC_EXT;
using namespace CSJson;
从cocos2dx 2.2版本后 就不需要开发者手动添加jsoncpp第三方库 在自己封装解析json相关功能的时候 只需要在类中添加这样的头文件 就可以正常使用相关变量和方法了
Value 对象可以指向任何类型 有点像c++中的 void* 类型
Reader 对象解析json 得到value对象
FastWriter对象 将Value数据按照编码格式生成json格式
Value array;
解析一个json文件函数
/读取一个jeson文件 并将其转换为Value
Value CCAnalysisJeson::ReadJson(const char * filename)
{
unsigned long size;
const char* file=(char*)CCFileUtils::sharedFileUtils()->getFileData(filename,"r",&size);
CCLOG("%s",file);
Reader reader;
if(!reader.parse(std::string(file),array,false))
{
return 0;
}
return array;
}
//根据一个Key值获得对应的Value
Value CCAnalysisJeson::GetValue(Value root, const char *keyname)
{
Value val;
val=root.get(keyname,val);
return val;
}
完成以上两个函数 则可以根据json文件的键值的名字获取对应的值
比如从json中获取玩家的姓名
string CCAnalysisJeson::GetPalyerName(const char* filename,int index)
{
ReadJson(filename);
string strPlayName=GetValue(array[index],"name").asString();
return strPlayName;
}