模拟全球汇率市场

回首前尘
首先回顾一下全球汇率市场的历史背景:
1944年7月,二战结束的前一年,来自44个国家的经济学家及代表团们齐聚在美国东北部一个名叫布雷顿森林的小镇上,就战后世界经济及货币秩序的建立开始了为期一个月的讨论。

模拟全球汇率市场

布雷顿森林会议地点:华盛顿山饭店

这其中,一位代表英国的经济学家凯恩斯(Keynes),为了维护英国继续对世界金融和货币的控制权,与另一位来自美国财政部的谈判代表怀特(Hayek)开始了智慧交锋与博弈,这身后是两个大国之间的较量。最终,星光黯淡的英国败下阵来,美国扛起了领导世界金融的大旗。

模拟全球汇率市场

凯恩斯(右)与怀特于1946年3月

会议达成的协议是,设立国际货币基金组织,美元与黄金挂钩,各国货币与美元挂钩,形成固定盯住式的货币汇率体系。

然而好景不长,美元与黄金的双本位制存在某种缺陷,尤其是美国出现资本逆差的时候,各国国家开始用手中的美元兑换黄金,造成了黄金短缺的局面。1971年,布雷顿森林货币体系建立三十年后,它走向了破产。

又一缕五十年光阴。如今,弹性的市场汇率制成为主流,但美国依然手握货币金融的霸权。目前汇率市场上交易活跃的六大货币对,全部围绕美元配对。根据国际清算银行BIS外汇市场2019年4月的考察报告,美元交易占比高达88%,而人民币,尽管近年来逐步提高,占比也仅有4.3%。

按体量来看,外汇市场也是最大的金融市场,平均每日交易额高达5万亿美元,是全球股票市场成交额的25倍之多。

模拟未来

介绍完历史背景后,接下来是本文所要做的:尝试模拟汇率市场未来走势。

但在汇率市场如此高体量下,用电脑模拟未来走势的工作量看似十分庞大,但实则不然。越是混沌的市场,个人影响才微乎其微,这样逐渐回归客观,数学上才接近大数定理,易于建模。相反,那些由几个大佬拍手即合便决定了未来走势的市场,反而是最难预测的。

所以下面所做的,大体分为以下三部分:

首先借用数学构建金融模型,主要思想是一个货币对对应一个随机微分方程,总共六大货币对,形成一个六维的矩阵形式。

接下来确定每个随机微分方程的趋势项和混沌项:趋势项由远期汇率平价计算得出,混沌项则采用过去一年历史数据的cholesky矩阵。最后用R语言模拟此六维随机微分方程阵, 输出的便是模拟的汇率市场未来走势。

在了解了大致的步骤后,一切归零,下面就是详解一步步如何操作的。

第一步便是要获取六大货币对的历史数据,其中六大货币对包括:欧元兑美元(EUR/USD)、美元兑日元(USD/JPY)、英镑兑美元(GBP/USD)、澳元兑美元(AUD/USD)、美元兑瑞士法郎(USD/CHF)、美元兑加元(USD/CAD)。

在时间窗口选取上,采用最近一年即2018年9月3号至2019年8月30号的数据。每日汇率的数据各大财经网站上都有,这里不用过多介绍。下面是获取后的截图(显示在Excel里):

模拟全球汇率市场

第二步要获取这七个国家(美国、欧洲、英国、日本、澳大利亚、瑞士、加拿大)的利率数据,因为根据远期汇率平价公式,某个汇率的远期价格是由当前汇率价格和本汇率两个货币的利率水平决定的,而汇率的远期价格代表了当前市场对未来的汇率期望,任何违背这一定价公式的,都有可能存在套利空间,所以这也是把其确立为本模型中趋势项的原因。

模拟全球汇率市场

但在各国利率数据选取上,为了方便与一致性,选择全球市场广泛应用的Libor银行间拆借利率,时间跨度为90天,并分别以各货币报价。所有数据来源于美国圣路易斯联储银行官方网站:https://fred.stlouisfed.org/。 整合后的利率数据截选如下:

模拟全球汇率市场

接下来,就是用以上远期汇率平价公式计算一日后的远期价格:

模拟全球汇率市场

计算后的结果截选如图:

模拟全球汇率市场

在得到了公式计算出的1日远期价格后,但市场接下来一天的实际表现并不是追随远期价格,有时甚至朝着远期价格相反的方向运动,所以便要计算实际的汇率市场每天的涨跌幅多少占比是由远期价格造成的,多少是由其他原因造成的,这些所有其他的因素便是本文模型中的混沌项。具体计算方法如下:

模拟全球汇率市场

计算出的噪音波动结果截选如下:

模拟全球汇率市场

以上所有步骤需要注意的是,截图只是截选了历史时间里前几个交易日的结果,所有的过程要计算到整个选取的历史时间,即2018年9月3号至2019年8月30号。所以现在我们得到的是六列,时间从2018年9月4号至2019年8月30号每个交易日由市场噪音而非远期价格引起的涨跌幅数据。

下面便要根据这六列数据构建方差-协方差矩阵,可在Excel中操作,结果如下:

模拟全球汇率市场

但为何要创建方差-协方差矩阵,主要有以下两点原因:其一,这六大货币对占了全球汇率市场绝大部分的交易额,且都与美元为锚,这意味着它们之间都与美元有很大的关联性。此外,除美元外其他货币之间也有关联,市场上普遍认为,这六大货币对中的三个出现上涨,一般对应另外三个的下跌,以维持整个汇率体系平衡。综上来看,采用方差-协方差矩阵来描述不同随机变量之间的联系是合适的。其二,本文的目的是要模拟未来汇率市场的走势,而模拟不是随便给出一系列数值,而是要基于历史情况得出的。关于历史数据,已被多次研究证实的是,每日汇率的涨跌幅近似于但不完全等于正态分布,这就给了方差-协方差矩阵的子兄弟Cholesky矩阵施展空间,因为Cholesky矩阵就是用来模拟关联性的多维正态分布的。

而如何从方差-协方差矩阵拆解到Cholesky矩阵,就要依靠R的帮助了,所以接下来要做的就是把方差-协方差矩阵的数据导入到R里,变换得到Cholesky矩阵。此Cholesky矩阵便是六维随机微分方程矩阵的混沌项,再加上远期汇率平价系数的趋势项,整体的六维随机微分方程矩阵就得到了。

六维随机微分方程矩阵可总结如下:

模拟全球汇率市场

整体框架完成,最后就要在R平台上输入了。

# 从Excel读取方差-协方差矩阵

library(readxl)

Comatrix <- read_excel(

"Currency.xlsx",

  sheet = "Sheet1", 

  range = "AI9:AN14", 

  col_names = FALSE)

# 变换Cholesky矩阵

chol<-chol(Comatrix)

# 矩阵转置

chol<-t(chol)

下面输入相关参数,模拟起始点为2019年8月30号,对应当天的汇率分别为:

# 当日汇率

# EUR/USD

ER0_1 <- 1.0989

# USD/JPY

ER0_2 <- 106.31

# GBP/USD

ER0_3 <- 1.2158

# AUD/USD

ER0_4 <- 0.6737

# USD/CHF

ER0_5 <- 0.9901

# USD/CAD

ER0_6 <- 1.3312

输入1日远期汇率系数,公式见上,计算过程不展示了,直接显示结果见下,注意计算时货币利率选用2019年8月30日当日的利率值。

# 各汇率1日远期系数

# EUR/USD

f_1 <- 0.999927499

# USD/JPY

f_2 <- 1.00005951

# GBP/USD

f_3 <- 0.999961714

# AUD/USD

f_4 <- 0.999967846

# USD/CHF

f_5 <- 1.000083142

# USD/CAD

f_6 <- 1.000008267

提取Cholesky矩阵各个值:

c11 <- chol[1,1]

c21 <- chol[2,1]

c22 <- chol[2,2]

c31 <- chol[3,1]

c32 <- chol[3,2]

c33 <- chol[3,3]

c41 <- chol[4,1]

c42 <- chol[4,2]

c43 <- chol[4,3]

c44 <- chol[4,4]

c51 <- chol[5,1]

c52 <- chol[5,2]

c53 <- chol[5,3]

c54 <- chol[5,4]

c55 <- chol[5,5]

c61 <- chol[6,1]

c62 <- chol[6,2]

c63 <- chol[6,3]

c64 <- chol[6,4]

c65 <- chol[6,5]

c66 <- chol[6,6]

接下来创建趋势项、混沌项的矩阵:

# 趋势项

drift <- c(

"(f_1-1)*ER_1","(f_2-1)*ER_2",

"(f_3-1)*ER_3","(f_4-1)*ER_4",

"(f_5-1)*ER_5","(f_6-1)*ER_6")

# 混沌项

diffusion <- matrix(data = c(

  "ER_1*c11",0,0,0,0,0,

"ER_2*c21","ER_2*c22",0,0,0,0,

"ER_3*c31","ER_3*c32",

"ER_3*c33",0,0,0,"ER_4*c41",

  "ER_4*c42","ER_4*c43","ER_4*c44",

  0,0,"ER_5*c51","ER_5*c52",

  "ER_5*c53","ER_5*c54","ER_5*c55",0,

"ER_6*c61","ER_6*c62","ER_6*c63",

"ER_6*c64","ER_6*c65","ER_6*c66"),

6,6, byrow = TRUE)

在以上参数与矩阵创建完成后,下一步需要借助yuima程序包进行模拟,本次模拟未来一年走势,即252个交易日。

# 导入yuima程序包

library(yuima)

# 建立模型

ER <- setModel(

drift = drift,

diffusion = diffusion,

  solve.variable = c("ER_1","ER_2",

    "ER_3","ER_4","ER_5","ER_6"),

state.variable = c("ER_1","ER_2",

"ER_3","ER_4","ER_5","ER_6"),

time.variable = "t",

xinit = c(ER0_1,ER0_2,ER0_3,

ER0_4,ER0_5,ER0_6))

# 模拟

ER.sim <- simulate(ER,

true.parameter = list(

f_1 = f_1, f_2 = f_2, f_3 = f_3,

f_4 = f_4, f_5 = f_5, f_6 = f_6,

c11 = c11, c21 = c21, c22 = c22,

c31 = c31, c32 = c32, c33 = c33,

c41 = c41, c42 = c42, c43 = c43,

c44 = c44, c51 = c51, c52 = c52,

c53 = c53, c54 = c54, c55 = c55,

c61 = c61, c62 = c62, c63 = c63,

c64 = c64, c65 = c65, c66 = c66),

sampling=setSampling(

Initial = 0,

Terminal = 252,

n=252))

模拟完成后,最后一步就是制图了

# 导出模拟数据

data <- ER.sim@data@original.data

data <- as.data.frame(data)

data <- cbind.data.frame(

c(0,seq(1:252)),data)

colnames(data) <- c(

"time","ER1","ER2","ER3",

"ER4","ER5","ER6")

#制图

attach(data)

par(mfrow=c(3,2))

par(mar=c(2.2,2.5,2.2,2.2))

plot(time,ER1, type = "l",

main = "EUR/USD")

plot(time,ER2, type = "l",

main = "USD/JPY")

plot(time,ER3, type = "l",

main = "GBP/USD")

plot(time,ER4, type = "l",

main = "AUD/USD")

plot(time,ER5, type = "l",

main = "USD/CHF")

plot(time,ER6, type = "l",

main = "USD/CAD")

最终,电脑模拟出的六大货币对未来一年的汇率走势如下:

模拟全球汇率市场

优化与反思

尽管目前在理论的支持下,可以用金融模型尝试模拟未来,但这并不能说明什么。市场上存在的变数太多,模拟出的一次结果可能是亿万种可能中的一个,也可能离实际偏差太远而永远不会出现,下面就这些问题进行一些探讨。

首先需要解释一下,为何选用R而非Python。R里面的yuima程序包专门模拟随机微分方程,也包括多维的情况,代码操作上可以直接写矩阵形式,而在Python里就要重复写六次了。

关于模型本身的不足及如何改善方面,首先各国货币利率,本文选取2019年8月30号的为基准不变,但实际上每天的利率都在变化,尽管每天波动很小,但长时间影响却是大的。如果再模拟利率的话,模型将变成二环相套模式,将更为复杂。其次,模型中没有考虑各国的宏观经济状况,一国的货币及财政政策转变会深远地影响汇率,同样,整个社会的经济运行,比如物价水平,亦会造成影响。还有就是黑天鹅的出现,会彻底重创整个汇率市场,这些都没有在此模型中体现出来。

但如果把这些都考虑进去呢,事情会变得相当复杂。

是见招拆招后一个个击破,还是化繁为简后快刀斩乱麻,许多人在此踌躇不前。

本文由 产业新干线 作者:NovaLink 发表,其版权均为 产业新干线 所有,文章内容系作者个人观点,不代表 产业新干线 对观点赞同或支持。如需转载,请注明文章来源。

发表评论