Exception Handling & OOP in R

image大概不同的学科会造就不同的思考方式,记得若干年前和LD走在加州 Albany (伯克利附近)有些破败的马路上,突然在一片空地上看到两只狗,LD脱口而出“两只”,我也脱口而出“活的”。所以LD是学理的,我是学文的。

又好比为称赞人,学文的也许会顺口说道:“东陵虽五色,不忍值牙香。”,学理的会问:“这是说啥的?”;学文的会说:“这说的是瓜,用来称赞你的。”;学理的说:“这不是在骂人瓜娃子吗?”。。。学文的会暗自庆幸没有说:“浪乘画舸忆蟾蜍,月娥未必婵娟子”(“姮娥遂託身于月,是为蟾蜍”——张衡·《灵宪》)。

编程语言也是一样,不同之处是 epistemology 上的 (大概也只有学文科的人才会把 ontology, epistemology 这些东西挂在嘴边),就好比接触 C++ 以前从来没想到过 R 的程序可以如此这般如此这般的来写:例如以前从来没有想过 R 里的 (line by line ) debugging,  exception handling , 以及 OOP 之类的东西。一个简单的例子,譬如突然想大致画一下任意股票期权的 volatility skew。

纯粹(旧的) R 式的写法:

   1:  library('quantmod')
   2:  library('RQuantLib')
   3:  x <- getOptionChain("AAPL",Exp ="2011-07-16")
   4:  optionVal <- as.numeric(x$calls[,2])
   5:  strike <- as.numeric(x$calls[,1])
   6:  getSymbols("AAPL",src="google")
   7:  n <- length(strike)
   8:  mtrty<-businessDaysBetween(from=Sys.Date(),to=as.Date("2011-07-16"))/252
   9:  under<-Cl(AAPL)[nrow(AAPL)]
  10:  imvol <- array(NA,n)
  11:   
  12:  for ( i in 1:n){
  13:  imvol[i]=EuropeanOptionImpliedVolatility("call", optionVal[i],under,strike[i],0,0.02,mtrty,0.2)$impliedVol
  14:  }

quantmod library 提供了直接从 Google, Yahoo 等来源读取金融数据的接口,RQuantLib library 是 QuantLib 在 R 里的 port。 imvol 是一个vector, 用来储存数值算法得到 implied volatility,但是因为这只是一个粗略的计算,数据中存在着一个很大的问题:underlying 的数据和 derivative 的数据不是 synchronous 的(high frequency 数据常有的一个问题),某个 strike 的 derivative 交易的频率比较低,所以它的价格滞后,不能体现出它的真正市场价格。也是因为这个问题的存在,我们在运行这段 code 时候很快就出现错误: 

   1:  Error in EuropeanOptionImpliedVolatility.default("call", optionVal[i],  : 
   2:    root not bracketed: f[1e-007,4] -> [2.533890e+000,6.291277e+001]

因为 derivative 的价格和 underlying 的价格不是 syn 的,所以合理的 implied vol 的数值解不存在。程序因此中断,如果看 imvol 这个 vector:

[1] 1.331497 1.250151 1.481016       NA       NA       NA       NA       NA       NA
[10]       NA       NA       NA       NA       NA       NA       NA       NA       NA
[19]       NA       NA       NA       NA       NA       NA       NA       NA       NA
[28]       NA       NA       NA       NA       NA       NA       NA       NA       NA
[37]       NA       NA       NA       NA       NA       NA       NA       NA       NA
[46]       NA       NA       NA       NA       NA       NA       NA       NA       NA
[55]       NA       NA       NA       NA       NA       NA       NA       NA       NA
[64]       NA       NA       NA       NA       NA       NA       NA       NA       NA
[73]       NA       NA       NA       NA       NA

只有三个有效值,后面的值全是 initialize 的 missing values。按照旧的方法,debug 找出出现问题的地方,逐一处理,但是这样很麻烦,有时候也没有必要。所以就想到借鉴 C++ exception handling 的 try - catch方法,如果出错,我们 throw 一个 exception,然后继续其余部分的 code。R 里面也有类似的方法,所以我们可以重新写这个 loop:

   1:  for ( i in 1:n){
   2:    result<-try(EuropeanOptionImpliedVolatility("call", optionVal[i],under,strike[i],0,0.02,mtrty,0.2),silent =TRUE)
   3:    if(class(result) =="try-error") next
   4:    else {imvol[i]=EuropeanOptionImpliedVolatility("call", optionVal[i],under,strike[i],0,0.02,mtrty,0.2)$impliedVol}
   5:  }

在上面的 code 里我们作了一个简单 exception handling,先 try implied volatility 的数值解,把结果定义为一个叫做 result 的 object,如果出错,那么 result 应该属于 try-error 这个 class,所以我们作一个简单的判断,如果出错了,就直接 next 跳过。最后我们的 imvol vector 是:

[1] 1.3314972 1.2501506 1.4810157        NA        NA        NA 1.0397009        NA
 [9]        NA 1.0749333        NA 0.9936863        NA        NA 0.7165703        NA
[17]        NA        NA        NA 0.4677549        NA        NA        NA 0.5650445
[25]        NA        NA 0.4720218 0.2539875 0.3110036 0.2952723 0.2441016 0.2276886
[33] 0.2379125 0.2209396 0.2250593 0.2162720 0.2144386 0.2117865 0.2078974 0.2044520
[41] 0.2014596 0.1984621 0.1990857 0.1978392 0.1984587 0.1999078 0.2007216 0.2027609
[49] 0.2042993 0.2119021 0.2126273 0.2281725 0.2231475 0.2280039 0.1892973 0.2453698
[57] 0.2485359 0.3305246 0.3448491 0.2755123 0.2963304 0.3480423 0.3299750 0.3087564
[65] 0.3814543 0.3350278 0.3369351 0.4618993 0.3985197 0.3226662 0.4635653 0.3968701
[73] 0.3984441 0.4608958 0.3962065 0.4239336 0.4901043

尽管中途出错,但是仍然不会中断我们的 loop。

更进一步,我们可以像 C++ 一样在 R 里定义 class 和 相应的 method,从而进一步提高 code 效率(主要是 reusability ,这也是 OOP 的主要目的之一)。R 里有两种定义 class 的方式,一种旧的 S3 class,一种是新的 S4 class。 这里用 S3 作为例子,我们首先定义一个 impvol class 和它的 constructor:

   1:  impvol<-function(tick, exp="2011-07"){
   2:    getSymbols(tick,src="google",from=Sys.Date(),to=Sys.Date())
   3:    under <- as.numeric(Cl(get(tick)))
   4:    x <- getOptionChain(tick,Exp =exp)
   5:    optionVal <- as.numeric(x$calls[,2])
   6:    strike <- as.numeric(x$calls[,1])
   7:    option<-cbind(strike,optionVal)  
   8:    impvol<-list(tick=tick,
   9:              exp=exp,
  10:              under=under,
  11:              option=option)
  12:    class(impvol)<-"impvol"
  13:    return(impvol)
  14:    }

R 的 class 的定义和 C++ 还是有区别的,在 R 的 class 里面,我们只定义了它的 member variables ( tick, exp, under, option ),和它的 default constructor.  它的 method 并没有在 class definition 里 declare。定义了这样一个class 之后,我们就可以方便的获取任意stock 的数据了,譬如:

   1:  s1 <- impvol("F")

我们初始化一个关于福特的 impvol class 的object,把它定义为 s1 ,然后我们得到:

   1:  > s1
   2:  $tick
   3:  [1] "F"
   4:   
   5:  $exp
   6:  [1] "2011-07"
   7:   
   8:  $under
   9:  [1] 14.18
  10:   
  11:  $option
  12:        strike optionVal
  13:   [1,]     10      4.30
  14:   [2,]     11      3.30
  15:   [3,]     12      2.25
  16:   [4,]     13      1.35
  17:   [5,]     14      0.62
  18:   [6,]     15      0.21
  19:   [7,]     16      0.08
  20:   [8,]     17      0.03
  21:   [9,]     18      0.01
  22:  [10,]     19      0.02
  23:  [11,]     20      0.01
  24:   
  25:  attr(,"class")
  26:  [1] "impvol"
  27:  > 

上面列出了 s1 的 member variables,它包含 tick(是string obj),exp(是date obj),under(是 numeric obj),option (是 matrix),它的属性是 impvol object。借助于 class,我们可以很轻松的获取任意的股票数据。注意我们这个 class 其实是从  list 这个 class 的 derived,所以作为 derived class,就像 c++ 的inheritance 一样,它也具有 list 的属性。

然后我们定义 method,这里主要是作图,画implied volatility,这里也和 c++ 类似,我们需要 overload 一个已存在的函数 plot():

   1:  plot.impvol<- function(x, ...){
   2:    n <- nrow(x$option)
   3:    mtrty<-businessdaysbetween(from=sys.date(),to=as.date("2011-07-16"))/252
   4:    imvol <- array(na,n)
   5:    for ( i in 1:n){
   6:    result<-try(europeanoptionimpliedvolatility("call", x$option[i,2],x$under,x$option[i,1],0,0.02,mtrty,0.2),silent =true)
   7:    if(class(result) =="try-error") next
   8:    else {imvol[i]=europeanoptionimpliedvolatility("call", x$option[i,2],x$under,x$option[i,1],0,0.02,mtrty,0.2)$impliedvol}
   9:  }
  10:  result<-cbind(x$option[,1],imvol)
  11:  plot(result,col="2",main=paste("implied vol of", x$tick),xlab="strike",ylab="implied vol",xaxt = "n")
  12:  axis(1,at=x$option[,1],labels=t)
  13:    }

因为 plot 是一个 generic function, 我们用 plot.impvol 来 overload 它,注意在我们的 plot 函数里,我们实际上先计算了它的 implied vol。检视我们的 class 的method:

   1:  > methods(class="impvol")
   2:  [1] plot.impvol

测试我们的 method:

   1:  s1 <- impvol("f")
   2:  s2 <- impvol("goog")
   3:  s3 <- impvol("aapl")
   4:  s4 <- impvol("c")
   5:  par(mfrow=c(2,2))
   6:  plot(s1)
   7:  plot(s2)
   8:  plot(s3)
   9:  plot(s4)

我们得到下面的 vol skew的 plot:

image

x 轴每一个 tick mark 都是一个 strike,如果那个 strike 对应的 implied vol 是 na,plot 自动就把那个数据点 drop 了。以 google 和 apple 为例,我们发现 deep ITM 的 call option 的 implied vol 有很多 missing values,并且还有异常的数值,其中的原因就是我们上面说的 liquidity 和 trading frequency的问题。最后一个 citi 的图,strike 在 $1 附近还有数据点,更能说明这个问题:这个数据源里还包括了citi并股前的数据。

OOP 大大简化了 R 的编程,所以学习 C++ 其实同时也很有助于 R 的使用,就像学点儿数学对于文科生也很有帮助一样:)

P.S. 因为编辑 CSS 出错,导致后半篇的字母全部被转化为小写 =_= 。

Free Tags: 
Blog分类: 

Gambler’s Fallacy?

193888_10150161408806083_619986082_8650414_6822855_o

更新:有一个错误,算 risk-adjusted 的 payoff,其实类似于 Sharpe Ratio, significantly different from zero 没有什么实际意义,至少要 significantly 大于 1 才算是 reasonable 的 strategy :) -- July 24, 2011

三月份的时候路过拉斯维加斯去国家公园旅行,发现了一种新的自动机械轮盘赌,虽然在停留时间短暂,但是仍然在这台机器上赚了不少钱,于是想到了一个古老的问题:Gambler’s Fallacy (GF)

举个 GF 的例子,譬如一个 fair coin (这个假设很重要),如果连续仍了10次,都是正面朝上,那么当我们扔第十一次的时候,是不是更可能出现背面呢?如果你认为背面出现的概率会更大一些,这就是 GF 了,因为基础的概率学告诉我们,每次投掷都是独立事件,第十一次投掷的结果正面和背面的概率仍然是相等的。

单单看这个例子本身没有什么太大的意思,但是同时我们从统计的角度看这个问题,因为大数定理的存在(i.e. 这个 process 是 mean reversion 的,你仍的次数足够的多,你的期望值趋近于 0.5 ),那很自然就会想到,如果我们不只是简单作单次的预测下注,而是从大量重复统计的角度上下注(赌反方向),那么我们的收益会不会比纯粹 uninformed 的投注(譬如随机投注,或者只压正面)要好?

需要强调的是,我们考虑的只是投注的策略,而不是做时间序列上的预测 (forecasting),因为就预测而言,这是一个明显的白噪声过程。也就是说我们只考虑一个策略优化问题。

当然这既是一个 theoretical 的问题,也是一个 empirical 的问题,我们偷懒的只从 empirical 的角度看这个问题。

我们把问题简单化,只关注简单策略,也就说我们的策略必须是能用大脑计算的,否则即便是你通过收集这个自动机械轮盘赌的数据,发现了这个机械的 idiosyncrasy 导致投掷的结果出现统计规律,能用譬如一个 exponentially weighted moving average (EWMA) 来预测,但是你如果不能快速心算出你的策略,这也是没有什么实际意义的。

我们考虑三种策略,前两种是 uninformed 的,也就是说策略是独立于你新获取的信息的,最后一种是 informed的,策略是基于新获取的信息的。

第一种策略称之为 Odd Even Strategy (OES),顾名思义,就是第一压正,第二次压反,第三次压正,重复直到赌博结束;

第二种策略称之为 Straight Bet Strategy (SBS),也就是不管怎样,都只压正(或者压反);

第三种策略称之为 Looking Back Strategy (LBS),每次压住前往前看 m 个 periods,given 一个 threshold value rho (0.5<rho=<1), 如果这 m 个 periods 的 average 大于 rho, 则压 1 (譬如 1 表示正面),对称的,如果 average 小于 1-rho,则压 0。 如果条件不满足,什么都不压。假定 m =10,我们向前追朔10个periods (同时也符合一般轮盘赌提供的历史数据),利用一些简单的optimization 和 calibration,  大概估算 rho= 0.618。

假设我们玩1000次,下注的时候每次下注 $1 ,我们的赌本是 $1000,三种策略的收益如下图:

image

上图的收益并不能说明什么,只是一个 realization,但是相对而言,第三种策略的标准方差相对比较小,原因之一是因为第三种策略并不是每次都下注,如果把图放大其实可以看到蓝色线条有很多“平顶”,这是不下注的时候。

基于这三种策略,我们作一个简单的蒙特卡洛模拟,结果见下表:

  n=10^4 n=10^5  
  r-adj payoff sd r-adj payoff sd
 OES -0.01797056 0.02302582 -0.006824031 0.007238402
SBS -0.03311233 0.02290396 -0.01122852 0.007258676
 LBS 0.1144682 0.02278219 0.1226927 0.00721828

 

上面提到 r-adj payoff 指的是 risk-adjusted final net payoff, 它是用每1000次轮盘赌的最终净收益除以这1000次轮盘赌收益的标准方差得到的(类似计算 Sharpe Ratio 的算法),n=10^4 是1万次模拟的结果,n=10^5 是10万次模拟的结果。模拟的结果说明:

  1. Uniformed 的策略(OES,SBS)的风险调整净收益都不 significantly different from zero (at 5% significance level)。这和理论的预期是符合;
  2. Informed 的策略(LBS) 的风险调整净收益是正的并且significantly different from zero。

也就是说这样简单的informed的策略是能够带来正收益的。注意这个策略只是告诉你什么时候下注,和如何下注,把它和其他一些特定的投注策略(譬如 modified  martingale betting strategy)结合,应该能够提供一些可观的收益,所以我们在拉斯维加斯赢的钱也不完全是运气。

这个结果同时一些 empirical observation 项符合:1)这种机器不是在每个赌场都有,只有拉斯维加斯的 MGM才有;2)这个机器前排队的人很多;3)这个机器很容易坏。

离我们的比较近的 Atlantic City 没有这种机器,所以在那里赌博,只能靠运气了,不过上周的运气不错:

243452_10150258617601083_619986082_9247826_1760032_o

哈哈,这样的小概率都让我撞上了,狗屎运:)

P.S. 这个问题也有很广泛的意思,譬如股票交易,比较 liquid 的股票的 log return 几乎肯定是一个白噪声(Fama 的 Efficient Market Theory,呵呵,不知道他什么时候能得诺奖),如果我们有 high frequency data,我们能否有一些策略,通过白噪声的 mean reversion 来获利?猜测是由于 transaction cost 的存在(bid-ask spread, commission fees) 上述 payoff 可能会小于零,因此没有太大的现实意义,但是赌博可以一试。

P.S. 希望上述的运算和模拟里面没有错误,有空会验算一下:)

Blog分类: 

买车记

IMG_6577

和 LD  在和煦的阳光中沿着哈德逊河步行了 29 里去吃拉面之后,决定还是需要买辆车。

作为托马斯·霍布斯的信徒,我们坚信 Scientia potentia est (知识就是力量,这句话的最早的书面表达来自于霍布斯的 De Homine ,翻译成英语就是 Concerning Man,但是通常却被认为出自弗兰西斯·培根)。

所以——

信息经济学告诉我们,因为 hidden information, 买旧车的风险多多(当然这也是 common sense,所以 Akerlof 的这篇 paper 最初被 AER 和 RES 因为过于 trivial 而据掉),所以决定买新车;

固定收益金融学告诉我们,贷款会有利率风险,贪婪的银行通常会多收取一个 call option 的钱来对冲 prepayment risk, 同时也会收取高于 risk-free rate 的 premium 来对冲 default risk (尽管我们不会 default, 但是就像我们不知道旧车会不是 lemon 一样,借贷者也不确定我们是不是 lemon,当然 credit score 可以部分的解决这个问题),所以决定不贷款一次付清;

下一个问题就是车了,对于选什么车没有任何的头绪,所以不得不依赖(不可完全信赖)的专家意见,看了(主观)认为比较可靠的 Consumer Reports 的 2011 年新车推荐, family sedan 这类推荐的是 2011 Nissan Altima,再加之我们上一辆车就是 Altima,开了很多年,从来没有出过太大的问题,也很喜欢,所以就决定买 Altima。

选好颜色,银色或者红色,添加了几乎所有可以添加的 package: convenience , convenience plus, 2.5 SL , premium audio, etc, Nissan 的网站给了建议零售价,大约 $28k,这则信息告诉了我们价格的上限,然后查 truecar.com 得到实际价格的 distribution ,再查了 NY 州和 NJ 州的消费税,开始向附近的 dealer 询问价格。 重点是 truecar 上资源公布价格的 dealer —— 这又是一个信息经济学的问题,如果 dealer 能够提供低价,它肯定有 incentive 公布它的低价,否则它不会把自己的价格作为 public information 公开,所以这是一个 seperating equilibrium。当然问题是 dealer 是否会 honor 它的 commitment, 所以这点 truecar 作的还不错,它把所有的 price quote 都作为 contract —— 至于 contract 是否能被执行,这就是一个更宏观的政治经济学问题了,买辆车大约不用考虑这个层面上的问题,好吧,在美国,我们 assume 大部分的 contract 都可以执行。

拿到价钱,比建议零售价自然要低很多,然后就是去试驾和讲价钱了。就试驾而言,我们也开了七八年车了,一点点儿经验还是有的,至于讨价还价 —— 好吧,我本科学外交,我博士研究 bargaining theory,对付一个小小的 dealer 。。。结果。。。结果被 dealer 秒杀了 –_-# 。对于实际的 bargain,LD都比我强很多,最终 dealer 只肯再便宜 $700,然后就不为所动。

Rational 的讲,这个价钱已经在我们预期可以接受的范围之内,所以成交,于是耗时1.5 小时就买了这辆车。

本来第二天已经租好了车,因为打算去 Atalantic City 过周末,正好有了自己的车,退掉了租车,一来一回就算是长途试驾了,感觉很不错,终于又可以像以前一样自由了:)

唯一的遗憾是开车15分钟就能吃到的拉面,不如步行3个小时吃到的好吃,由此可见,步行 29 里是好吃拉面的必要调料。。。

Blog分类: 

监守自盗

Inside Job

看了最新得了奥斯卡最佳纪录片奖的 Inside Job (汉语译作《监守自盗》)之后,倒觉得它无关乎金融和经济,而是一部不错的政治教育片。

07年开始的金融危机像所有大的危机一样是一种并发症,虽然现在很方便的把它归罪于次贷,但是次贷充其量只是一个导火索,引发了了其它的危机,就好比(传说中的)害了背疽的徐达因为吃了蒸鹅而死掉——次贷就像是蒸鹅,其它的病症就像背疽,如果只害背疽不吃蒸鹅,不一定会死;同样的不害背疽而吃了蒸鹅肯定也不会死,那究竟蒸鹅还是背疽算是主要的致死因素?(背疽和蒸鹅都是死亡的既不充分也不必要原因,当然关于这个蒸鹅和背疽的问题在抽象和上升到哲学的高度以后,形成了政治学和社会学里一个新的分支——新的定性方法研究 –_-# )

次贷的问题在07年1月就爆发了,但是当时并没有马上引起危机;而真正的危机是从07年8月6日才开始的,首先受到冲击的是对冲基金和投行里作量化交易的部分,他们的策略的相关性很强,一开始几乎是莫名其妙的,大家同时开始赔钱,他们作多 [long]  的股票证券开始狂跌,他们做空 [short] 的股票证券开始狂升,他们的资金杠杆比率 [ leverage ratio] 越来越高,所以不得不赔钱卖出作多的股票,再赔钱买入做空的股票,以降低资金杠杆比率 [deleverage] ,结果这一进一步造成量化交易市场的恐慌(对于普通的投资者是看不到这样的恐慌的,事实上那一天,道指还涨了),大量的抛售导致一些对冲基金一两天内的损失就达到20%。但是这个莫名其妙的危机的源头到底是什么,谁也不知道,现在唯一比较合理的解释就是MIT Khandani 和 Lo的那篇文章(在那之前其他人也有类似的看法):某个很大的多策略的对冲基金在次贷或者债务担保证券(CDO)或者其他类似的金融产品上赔了钱,所以不得不卖掉持有的其它产品(譬如股票)来 deleverage, 导致了链式反应。

然后马上受到波及的(也许不是被波及而是同时发生)是回购协议市场(Repurchase Agreement Market,简称 repo )。 银行短期向大的投资者借贷必须交付抵押(因为FDIC对于这样的借贷是不提供保险的,所以必须抵押。在危机前,FDIC对于个人储户的存款保险单的限额也不过10万美元,危机爆发后,这个限额上升到25万美元),通常是 securized bonds,而抵押的时候必须要 haircut,也就说银行抵押一千万美元的 securized bonds,只能获得譬如说 0.95千万 的借贷。通常情况下,haircut 是几乎是 0。但是在量化交易危机的同一周,07年8月9日,repo 市场开始恐慌,投资者要求增加 haircut 或者就要马上取款(就像经典的 bank run 一样),repo 市场大约有 12 万亿美元(次贷的市场大约只有1万2千亿),20%的 haircut 就要求银行必须多拿出来两万亿左右的资产抵押,这对银行来说是不可能,所以银行只能卖资产还钱,但是当时 securized bonds 的市场已经变得很差,为了避免损失,银行只能卖没有 securized 的 AAA bond (也就是研究危机的 literature  常说的 fire sale), 因为银行的大量抛售,bond market 出现了一个很奇怪的现象——从07年9月开始,很长的一段时间内,AAA bond 和 AA bond 的spread 是负的(也就说 rating 更高的 bond 卖的比 rating 更低的bond 还便宜)。。。于是危机开始扩散到银行 (参看  Garton 的 NBER working paper )。

这两个例子还只是冰山一角。。。蒸鹅不断的影响着背疽,终于悲剧了。

回到这部电影上,其实复杂金融产品里的信息不对称和道德风险( moral hazzard ) 也早已为人所知,其实不单是金融产品,任何涉及专业知识(其实也就是不对称信息)的交易,都会出现类似的问题,譬如你去修车,当你根本不懂修理的常识时,,你很有可能被黑车铺宰,就像你每次去 Jeff Lube 换油, 它都危言耸听的让你换 air filter 一样。

而电影中对于一些的解决方案似乎就只有一个词“regulation” (监管)。这个词容易拼,却很难做到,这是决策科学和政治学里一个很大的问题,是另一个层面上的信息不对称问题: 如果你想监管,你必须知道如何监管,但是对于复杂的金融衍生物和金融市场,要想弄明白异常之难,你有两个选择:第一,让政客们花时间去学习熟悉明白金融市场,譬如在国会开会的空隙里去学学随机微分;第二,请金融方面经验和知识的“专家”,譬如高盛的前 CEO Henry Paulson来协助制定金融法规。

第一个选择显然是不可能的,让 Sarah Palin 弄明白如何用 Gaussian copula 给 CDO 定价以及这样定价的问题,比让她拼写对 repudiate 难上上万倍;

第二个选择正式影片里批判的,因为 Paulson 这样的专家很可能是 biased (又回到我们关于 biased advisor 的讨论),事实上涉及金融,任何专家都有足够的incentive 来提供 biased 建议,就像影片中采访的某大学商学院的教授和院长一样。

那还有没有第三个选择?有,所以现在有了 Dodd-Frank 法案 —— 与其听信专家的 biased advice 或者 babbling,干脆作出不获取信息的 less informed 的盲目决策好了。 结果呢?

举个例子,很多人都说金融评级公司在这次危机中有不可推卸的责任,所以 Dodd-Frank 法案说,评级公司必须对自己的评级承担法律责任。于是评级公司拒绝让其他公司在发行新的债券的时候使用他们的评级,而法律规定新的债券发行的时候必须要有评级公司的评级 —— 于是就成了僵局。这一僵局意味着价值 1.4 万亿的按揭贷款市场将无法再发行新的债券,这对经济的影响是显而易见的。

问题不仅仅是评级,还有 foreign exchange swaps, forwards 等等。现在有了问题,那就改吧,怎么改?让政客去学习金融?还是再听 Paulson 们一次?还是再盲目的改一次,try and error? 这一问题再次出现。

这个问题也许有制度主义上的解,[这段删除,本来想说 Keith Kriebal的,结果发现会有误伤之嫌。]

好吧,这部片子提出了一个很有趣的古老的问题:)

Blog分类: 

嘉庆朝

The_Imperial_Portrait_of_Emperor_Jiaqing2前两天说起清代大臣的谥号,因为太忙没时间,未能尽言,现在有点儿空闲,多说两句。

美谥有点像时尚,流行的原因有时也不太可考,就像后世以为最荣的“文正”,如果找出它成为 No 1 的原因,大概源头还在司马温公那儿。《宋史·司马光传》上说:

夏竦赐谥文正,光言:“此谥之至美者,竦何人,可以当之?”改
文庄。

司马光认为夏竦不能谥文正,而他自己后来又谥文正,大概正是因此,抬高了“文正”的行情。宋人笔记《梁溪漫志》里也提到:

谥之美者极于文正,司马温公尝言之而身得之。国朝以来得此谥者惟公与王沂公、范希文而已,若李司空(昉)、王太尉(旦)皆谥文贞,后以犯仁宗嫌名,世遂呼为文正,其实非本谥也。如张文节、夏文庄始皆欲以文正易名而朝论迄不可,此谥不易得如此,其为厉世之具,深矣。

所以到了清代,一般大臣的谥号,内阁拟定就可以了,唯独“文正”这个谥号必须要皇帝特准,因此清代一共只有八位“文正公”(当然这个数目比起宋代还是算多,正如上面引文所言,宋代有些“文正”的谥号是因为避讳从“文贞”而来的,旧时“贞”、“正”同音,不算真正的文正)。而这八位文正公除了一两位外,大概都未能和宋代的范文正(仲淹)或者司马温公相比,而里面最问题最大的恐怕要数嘉庆、道光两朝的曹振镛了。

中国历史上不乏忠奸良佞之辩,而曹振镛从各个角度来看似乎都不算奸佞之臣:他忠厚、清廉、退让、谨慎。特别是清廉,在乾隆以后贪渎横行的时代,是否清廉几乎成为判定良臣的最重要标准之一。譬如在对待工程的态度上,通常贪官都恨不得皇帝天天大兴土木,以便中饱私囊,而曹振镛却屡次请罢不急工程,撙节糜费。曹振镛是安徽人,世代和盐商有很大的联系,但当朝廷改行淮北票法伤及旧盐商利益时,他也没有护短,而是说“焉有饿死之宰相家?”,支持改革。曹振镛也算是忠厚之人,尽管很多情况下,很难界定圆滑和忠厚,但是他毕竟也没有像传统意义上的权奸一样大肆排挤贤良。

但是正是像曹振镛这样的良臣彻底把清朝拖入了“嘉道中衰”。道光朝一位叫做朱琦御史有一篇《名实论》,认为德行有“乡曲之行”和“大人之行”之分:乡曲之行“曰忠厚 ,曰廉隅 ,曰退让”;大人之行,“在于经国家 ,而安社稷 ,有刚毅之节 , 为人主所惮 ,有深谋远虑 , 为天下长计 ,合则留 ,不合则以义去 ,身之安否 ,不遑计也。世之指擿, 不敢逃也。” 嘉道之间的问题就在于所谓的良臣都是有着“忠厚、 廉隅、 退让”乡曲之行的人,这些人“峨冠博带 ,从容缓趋于廊庙之间 ,上之人固亦深信不疑, 以为渊厚不可以测, 一旦遇大利害, 束手无措, 缄口结舌而不敢言, 所谓忠厚廉隅退让至此遂举无所用 !”

曹振镛就着这样良臣的代表,虽然他生极恩宠, 死备哀荣,但是逐字逐句读《清史稿》、读清代的笔记野史,你根本找不出他到底有过什么事迹。他的一生,倒是真像朱克敬在《瞑庵杂识》里录入的《一剪梅》描述的那样:

仕途钻刺要精工 ,京信常通 ,炭敬常丰 ,莫谈时事逞英雄 ,一味圆融 ,一味谦恭。
大臣经济要从容 ,莫显奇功 ,莫说精忠 ,万般人事要朦胧 ,驳也无庸 ,议也无庸。
八方无事岁年丰 ,国运方隆 ,官远方通 ,大家赞襄要和衷 ,好也弥缝 ,歹也弥缝。
无灾无难到三公 ,妻受荣封 ,子荫郎中 ,流芳身后便无穷 ,不谥文恭 ,便谥文忠。

曹振镛把词中的境界发挥到了极致,但问题是清代到了嘉道间并非“八方无事岁年丰 ,国运方隆”,而是危机重重。

重重危机,有些危机已经是很“现代”的问题,譬如美洲白银产量激增(因为使用了新的冶炼技术)和中国对外贸易顺差带来的输入性通货膨胀。

美洲白银产量的激增就像现在美国量化宽松政策一样,大量的白银通过贸易顺差涌入中国,首先带来的是“汇率”的问题 —— 铜钱和白银比率的问题。

顺治三年的旧制,制钱每十文准银一分,清代一直贯彻这一比率,一两白银兑换铜钱一千文,所有的货币支付,数少时用钱,数多时用银。但是大量白银的流入,导致这样的比例无法维持,康熙六十一年时,钱银比已经涨到七百八十文易银一两,为了维系1000:1的比率,政府只能加大制钱的投放量,康熙间,京局每年铸币大约六、七亿文,到了乾隆、嘉庆两朝,每年大约铸币十五六亿,铸币增长了近三倍。

增加货币投放量的结果是通货膨胀。虽然从一定程度上讲,康乾间的通胀刺激了经济的发展,对于“康乾盛世”也功不可没,但是持续的通胀亦是“嘉道中衰”的罪魁祸首之一。从康熙到嘉庆间,物价大约涨了三倍,但是国家的正式财政收入却并没有增长。特别是嘉庆帝恪守康熙帝“滋生人丁永不加赋”的许诺,并未增加丁银,物价上涨而赋税未涨。

嘉庆帝始终牢记着“明亡于万历”的祖训,不敢增加税赋,自嘉庆初平定了川陕白莲教起义以来,财政一直吃紧。

同时,国家控制的专卖的盐业也因为实行官方定价(清代盐价提价必须得到皇帝的批准,哪怕只是一斤涨价一两文钱),不随市场价格浮动而不断亏损,譬如长芦盐厂,到了乾隆末每年亏损折合银七八十万两。

官员俸禄自雍正朝颁行养廉银以来也未在提高,显而易见的后果就是更加大规模的贪污 ,无官不贪。

到了嘉庆朝,通胀累积的结果就是中央财政日渐衰竭,地方官员贪污成风。

然后还有人口问题。人口激增,人均土地减少,出现大量无地流民(可以类比现在的失业率),如果政府主导发展工商业,这些流民还可安置,但是嘉庆帝偏偏没有延续康乾间对于工商业的宽松政策,反而禁止民间开矿等等,于是无地的流民民变不断。。。

各种问题累加,社会怪象层出不穷。譬如嘉庆八年,竟出了中国历史几乎空前绝后的平民刺杀皇帝事件(明代的梃击案毕竟针对的还只是东宫)。一个叫做陈德的厨子,因为妻子亡故,岳母瘫痪在床,膝下有一对未成年的儿子,自己又被东家辞退,没有了生计,因为萌发了刺杀皇帝的念头,于光天化日之下在神武门持短刀刺杀嘉庆帝,在场的侍卫们从未经过这样的场面,竟都吓的呆若木鸡,幸亏有大臣格挡,刺杀并未成功。

而面对这样的危机与问题,嘉庆皇帝几乎茫然不知所措,而朝廷重臣曹振镛对于一切问题的答案只是“多磕头,少说话。”。。。。

。。。 其实历史有很多可以借鉴的地方。

Blog分类: 

英雄事

39298_1一边 debug C++ codes,一边听昆曲《牡丹亭》,随便点开的是一出《怅眺》,末了一首联句很有趣:

越王自指高台笑, 刘项原来不读书。

前半句是皮日休的《馆娃宫怀古》,后半句是章碣的《焚书坑》,这个笑字用的很妙,因为汉王和项王总是一副难兄难弟(二声“难”,不是四声“难”)的模样,譬如杜牧的杜牧的《过骊山作》:

始皇东游出周鼎,刘项纵观皆引颈。

可以想象这哥俩儿踮着脚,伸着脖子,拍着前面人的肩膀说:“低点儿,低点儿,挡着我了”的样子(这也大概就是《史记》上刻意说的“纵观”,恣意的观看。)

两人见过秦始皇的反应也像,刘邦说:“嗟乎,大丈夫当如此也!”。项羽说:“彼可取而代也。”

其实两人那时确实很像,都是楚人,家离的不远,在那之后的一段时间里,都非常符合俺心目中英雄的形象。

借用韩信的话,我对英雄的定义是“匹夫之勇,妇人之仁”。这话本是韩信用来形容项羽的:

项王喑噁叱咤,千人皆废,然不能任属贤将,此特匹夫之勇耳。项王见人恭敬慈爱,言语呕呕,人有疾病,涕泣分食饮,至使人有功当封爵者,印刓敝,忍不能予,此所谓妇人之仁也。

韩信自然是在贬低项羽,但是换个角度想,如果一个人既是千人敌,又能恭敬慈爱,不正是英雄的形象么?

孔子说:

知,仁,勇,三者天下之达德也。

其实“知”往往与“仁”、“勇”矛盾。 “知”,让你凡事深思熟虑,让你 rational,但是一旦深思,大概就会犹豫“仁”与“勇”,古人说:

仗义每从屠狗辈,负心多是读书人。

所以不读书的刘项,在那时都是英雄。譬如刘邦夜里私自放走送往骊山的刑徒,害得他丢了他的亭长,逃入芒、砀山间,这是妇人之仁;又譬如众人杀了沛令,需要推选领袖的时候:

萧、曹等皆文吏,自爱,恐事不就,后秦种族其家,尽让刘季。 ……於是刘季数让。众莫敢为,乃立季为沛公

念过书的萧何、曹参都知道当带头大哥风险太大,如果起事不成(按当时的情况,这是很可能的),就会被灭族,思量了风险之后,一致决定推立刘邦,而刘邦也就答应下来了,这正是匹夫之勇。

所以刘、项皆英雄,直到楚怀王决定入定关中。那时秦军正盛,项梁新死,所有的诸侯都很理智的不愿入关,只有刘邦和项羽愿意向西击秦。

刘、项两人大概也就从此开始分道扬镳,主要的原因之一是刘邦再次遇到了张良。张良辅助刘邦取得的第一场大胜利用的就是诡道 —— 先派人劝降了峣关的秦将,然后趁其不备,又发兵攻击峣关,当然是大胜,但是这样的作为大约很难算的上是英雄。

对比项羽的巨鹿之战,破釜沉舟,烧庐舍,持三日粮,大破曾经傲视六国的秦军,这是何等的英雄。

当然,从兵家的角度讲,兵者,诡道,不战而屈人之兵自然是上等,但是纯粹靠战场外的欺骗实在算不上英雄,相比之下,远远不如韩信的背水一战——毕竟韩信的阴谋仅限于战场之上,而张良的为人让人觉得处处都是阴谋——就像以前提到的张良计,他赞同郦食其去出使齐国,劝降齐王,大概他一开始就预料到了韩信不会止步不前(因为有李左车作韩信的谋士),而郦食其即使说降了齐王也不过是去送死。可怜的高阳酒徒,拿着酒罐子,高高兴兴去说服了齐王投降,然后因为韩信趁齐国不备破齐而被齐王给烹了-_-#

鸿门宴上,项羽继续妇人之仁,直到乌江畔:

[项羽] 顾见汉骑司马吕马童,曰:“若非吾故人乎?”马童面之,指王翳曰:“此项王也。”项王乃曰:“吾闻汉购我头千金,邑万户,吾为若德。”乃自刎而死。

“吾闻汉购我头千金,邑万户,吾为若德。”不知吕马童此时心中是何感想。。。

呵呵,英雄事,千古意,一凭阑。

Blog分类: 

R 的 vectorization, again

思考的方式,大概会受一个人正在说的语言影响,写 codes 似乎也是一样。如果是写 C++,思考的习惯大概会和 Matlab 不一样——不是说 syntax 或者是 concept,而是解决问题的抽象方式。

一个简单的题目,模拟一个 Markov Pure Jump Process (MPJP), transition matrix 是一个 8x8 的矩阵,模拟一百万次,先在 R 中写,习惯的先写一个1:8的loop 模拟一条路径,然后重复一百万次:

   1:  exp_sim=function(n){          
   2:    sim=array(0,c(n,64)) 
   3:    for (k in 1:n){ 
   4:      for(i in 1:8){ 
   5:        j=i 
   6:        t=rexp(1,rate=lam[j])           
   7:        while (t<5){ 
   8:          j=sample(1:8,1,prob=P[j,])    
   9:          t=t+rexp(1,rate=lam[j])       
  10:          }                             
  11:        sim[k,((i-1)*8+j)]=1 
  12:        } 
  13:      } 
  14:    result=array(0,c(8,8)) 
  15:    for (i in 1:8){ 
  16:      for (j in 1:8){ 
  17:      result[i,j]=mean(sim[,((i-1)*8+j)]) 
  18:      } 
  19:      } 
  20:      result 
  21:  }

结果消耗的时间可想而知,耗费了大约 340 秒才完成,实在太慢了,以为是 R 的问题,又在 matlab 里重新写过,运行大约耗费了 23 秒,正感叹 Matlab 速度快,优化作的好。。。可马上也意识到在 matlab 里写 codes 的思路竟然完全不同——根本没有去作那个 1:10^6 的 loop,而是按照习惯,一开始就生成了一个一百万行的 vector,避开了这个耗时的 loop。。。所以又参照 matlab 的 codes,重新写 R 的 codes:

   1:  exp_simv2=function(n){ 
   2:    mysample=function(vec){ 
   3:      m=length(vec) 
   4:      temp=numeric(m) 
   5:      for (i in 1:8){ 
   6:     temp=temp+(vec==i)*sample(1:8,m,prob=P[i,], replace=TRUE) 
   7:      } 
   8:      temp 
   9:      } 
  10:      
  11:      result=array(0,c(8,8)) 
  12:      for (i in 1:8) { 
  13:          t=array(0,n) 
  14:          state=i*array(1,n) 
  15:          t=t+rexp(n,rate=lam[state]) 
  16:          while (min(t)<5){ 
  17:              newstate=mysample(state) 
  18:              state=newstate*(t<=5)+state*(t>5) 
  19:              t=t+rexp(n,rate=lam[state]) 
  20:              } 
  21:              for (j in 1:8){ 
  22:                  result[i,j]=sum(state==j) 
  23:              } 
  24:          } 
  25:          result=result/n 
  26:          result 
  27:  }

像 matlab 一样思考,避开了那个一百万次的 loop,虽然写的时候有些别扭,但是运行以后发现,速度果然快了不少,效率大约提高了10倍,最后只耗时30秒左右,基本上和 matlab 的速度相仿。

习惯的力量真可怕 –_-#

P.S. 不过也发现了一个新的让人欣慰的习惯,不管是写 R 还是 matlab,已经不自觉习惯于 encapsulation,这肯定是受 C++ 的影响吧。看来习惯也是可以改的:)

Blog分类: 

利比亚的内战

image早上起来看报纸(如果用 Kindle,并且有在线订阅,顺便推荐一下 Caliber,可以自动下载新闻传到 Kindle 上,比用 Kindle 直接订阅便宜),先看国际版,扫一遍关键词,有 China先看,看完再回来看美国国内的头条,然后是欧洲和中东(包括北非,就是所谓的 Greater Middle East),最后是拉美和非洲,然后才看 Finance 和 Business 的部分。之所以关心中东,完全是因为这些年学习和研究的原因,随手翻看最新一期的 International Security (IS),虽然是关于越战的特刊,但是除了越战的三篇文章,其余两篇文章和一片 correspondence 都是关于中东的,如果中东平安无事了,不知道 IS 会不会改成半年刊 :)

三月初的时候,中东的危机蔓延到利比亚,几乎所有的媒体都在预测卡扎菲下台(其实直到上周,媒体还在预测卡扎菲下台)。但是我觉得不大可能,所以三月三日在 facebook 上留言说:

My (pure theoretical) prediction of Libya (based on my models) : Gadhafi will stay in power; the country will split; the East part will declare independence; there will be a limited civil war; a peace will be finally brokered. Light sweet crude oil will return to about $90 per barrel in 3 months. Shorted 3-month crude oil future and see whether I am right :-)
March 3 at 3:07am · · Like · Comment

不说提及的数学模型,从 intuition 的角度说,一个国家如果在文化、传统、历史、制度上越 homogeneous,公众抗议越可能得以和平的方式推翻非民选政府或者彻底被镇压(前者的例子:以前东欧的各民族国家,现在的埃及和突尼斯;后者的例子,不说了,一说又要被封几年了),至于是成功还是失败,很大程度上取决于结构上的原因(i.e. 譬如东欧诸国是因为苏联的削弱和外交政策的改变,深层次上是经济、食品危机造成的;中东也是因为经济、食品危机。note:苏联被虚弱对于东欧诸国和对于中国的效果是相反的,因为那时苏联不但不是中国的保护伞,反而是中国的威胁);一个国家如果越 heterogeneous,公众抗议越可能的演变为流血的内战——被削弱的中央政府正好给等待时机的分裂主义者以机会,他们会伺机而动,而分裂主义的叛乱也正好转移了原本的公众抗议的焦点,有利于中央政府重新动员力量(譬如以前的南斯拉夫和现在的利比亚)。利比亚与埃及、突尼斯不同,它是在1951年由三个地区拼凑起来的,分离主义在东部一直存在。

现在看来,我的预测的第一部分是正确的,卡扎菲肯定是不会下台了。

今天的 Wall Street Journal 一改口风,又开始预测东部的叛乱者要被彻底的镇压:

AJDABIYA, Libya — Col. Moammar Gadhafi's forces seized the last town standing between them and the rebel capital, raising the specter that, even if the U.S. and Europe decide to intervene on the rebels' behalf, their help may come too late.

但事实上彻底的镇压恐怕也没有这么容易,理由其实也很直白,看看南苏丹或者科索沃就明白了。

为了检验一下我的模型(也是毕业论文的主要部分之一),在预测的同时也在 paper account 上 short 了100 手的三个月到期的石油期货,因为我预计三个月后利比亚的秩序与和平可能会大致恢复,利比亚的石油生产和出口同时也会逐步恢复,卡扎菲更会努力加大石油产量来弥补战争的损伤。

然后就出门旅行了,一周多的时间,足足开车开了有两千英里:)

到家的时候,石油已经开始狂跌,到了昨天 short 的 100 手石油期货已经赚了 40% 的利润(是 paper money,没有任何真正的价值,完全是为了满足好奇),不得不平仓了。但是赚钱的原因却不是因为利比亚,—— 是因为日本地震 –_-#

之所以平仓,是因为实验已经被地震这个超大的 external shock  给毁掉了(对于这个实验而言,欧洲的债务危机,亚洲的通货膨胀的带来的噪音都是在可容忍范围内,但是日本震的冲击实在太大了。)。。。所以地震很可恶 (同时 bless 地震的遇难者)!

Blog分类: 

关于隋代学术界和明代魔幻圆周率的一点八卦

88_10083412_f0a2302c9ec0947

(因与人论及祖冲之的历法对于后世历法的(无)影响,而纯粹的八卦文字^_^)

祖冲之的历法其实对后世没有太大的影响,大明历在陈灭亡后就废止了,隋朝开始用的是北周的大象历,后来用开皇历,都和祖冲之的大明历没有什么关系,并且要比祖冲之的大明历落后很多。

北朝也有和祖冲之一样对历法比较精通的人,但是他们的历法和祖冲之在世的时候一样,没法得到官方的承认,刘孝孙抱了自己的 paper,带着棺材去向隋文帝哭诉,但是也斗不过学霸(祖冲之活着的时候也没斗过当时的学霸),后来也病死了。

刘孝孙同学病死以后,一个叫做张胄玄的同学抄袭了刘孝孙的 paper,并且最终获得了学霸们的首可,被颁行为大业历,但是因为不是他自己的 original research,所以错误多多,但是张胄玄同学和学霸们保持了非常好的关系,以至于有人(刘焯)举报张胄玄抄袭刘孝孙时,仍然遭到了张胄玄和当权学霸们的联合打压,《隋书·律历志》里还保留有这封举报信:

“胄玄后附孝孙,历术之文,又皆是孝孙所作,则元本偷窃,事甚分明。”

刘焯也没有斗得过学霸和抄袭者,也死了。。。。

直到唐高宗时期,因为历法问题多多,才又把刘孝孙、刘焯的 research 找出来,重新采纳,这就是李淳风的麟德历。

北朝自己的历法还如此之多的坎坷,更别说南朝的祖冲之了,早已湮灭了。

但是并不能以此否认祖冲之的地位和影响,欧洲数学的发展也是有断层的,也是不断的再重新发展,并且祖冲之算圆周率的方法,应该不同于刘徽的割圆术,他的算法已经失传,但是能算出 355/113 这个密率,还是很牛 X 的,这个确实领先了欧洲一千多年,这个分数绝对不是他拍脑袋猜出来的,只是算法不详。

要说拍脑袋猜圆周率,我们是在不得不提及一下明朝的数学家们。这里确实没有明黑的意思,但是中国的数学经过了宋元的 boom 之后,到了明代,突然变得 joke 起来,网上被盛赞的一位明代音律学家算出的圆周率是 sqrt(2)/0.45,而其他诸多数学家,有算出3.126 的,也有算出3.15 的,真可谓光怪陆离。

当然数学的衰落确实有更深层次的原因,林毅夫同学曾经还在某个 journal 上灌过水解释这个现象,大意是说明代的科举开始僵化,读书人为了应付考试,需要浪费大量的时间和精力来背书,就没有创造性思维的机会了,这倒也能解释元代数学的发展,因为聪明的汉人很难通过考试来进入仕途,所以就只好琢磨数学了,因此成就了很多大家,所以相较之而言,我们还是应该欣赏一下宋代的,在保持正常的科举同时还造就了大量的数学家。

所以祖冲之和他同时代的人对我们的启示是:

1)不要试图扳倒学霸;

2)有 paper 赶紧发,哪怕装孙子恭敬的review 一下学霸的 paper,因为他很可能是你的 reviewer;

3)working paper 要注意保管,不要让学霸的弟子赶在你之前发表,是在不行,就委屈一下co-author ;

4)注意身体,不要病死,切切。

所以说祖冲之对于我们的裨益还是很大的:)

Blog分类: 

博物馆·玉砚台

IMAG0428

08年的时候回国,虽然时间很紧,但是专门去了一趟中国历史博物馆(那时已经改名叫做中国国家博物馆),到了门口,发现正在闭门整修,询问一旁站岗的警卫,什么时候才能开放,原本想如果是一两天的时间,可以稍后再来,但是警卫严肃的告诉我 2011 年 –_-# 前两天看新闻,整修过后的博物馆三月一日正式开放了,以后再回国,一定要去看看。

大学四年在北京,比较自由的时候,几乎一两个星期就去一趟中国历史博物馆,半晌起床,吃罢了 “brunch”,骑着自行车到博物馆,一直逛到喇叭提示关门,才迎着夕阳骑着自行车沿着长安街回学校,高兴的时候还会吼两句“我只有一张吱吱呀呀的床”,路过西四去吃一间铺面很小的饭店的卤煮火烧,特别是秋天的时候,很是惬意,然后拐进鲁迅博物馆门前那条小巷,那有一间很正宗的“茶汤李”,算是饭后的点心,饭饱之后,慢慢腾腾的骑自行车回学校,满脑子的金石字画,背着书包正好赶上晚自习。

在芝加哥的时候经常去 The Art Institute of Chicago,周四的傍晚免费,说实话,第一次近距离看到梵高的《自画像》和莫奈的《睡莲》还是很震撼的,AIC的中国藏品不算很多,倒是南边的 Field Museum 的玉器展馆,几乎都是来自中国的古物,甚至包括为清孝庄文皇后(就是清宫剧里常出现的庄妃/孝庄太后)上谥号的玉册,估计是那个时代流出的吧。一直想去芝打的 Oriental Institute 看它的波斯宝藏,可惜总也都没有机会,直到离开芝加哥。

到了纽约,便成了 MET 的常客。MET的中国展馆很大,包括《魏孝文帝礼佛图》,说来让人感慨,这原本该是家乡石窟的浮雕,第一次看到它却是在万里之外纽约。转角上楼梯,有一个展出各种中国服饰和饰品的小展厅,在那里我看到了玉砚台。

之所以特别会注意玉砚台,是因为笃信以前一个老先生告诉我的玉不可为砚,老先生是古董的行家,他的断语自然被我奉为圭臬,但是没想到在MET竟然看到了清代的玉砚台,如果我们也信奉 Bayesian statistics,由此推断出玉砚台应该并非罕见之物,后来看到宋代米芾编撰的《砚史》,确实记录的有玉砚,也印证了这一点。

所以觉得奇怪,究竟是我记错了老先生的原话,还是他本人的疏忽,时间太久,已经不可弄个明白了。不过这也是常去博物馆的好处,至少更正一个错了很久的印象 。

P.S. 错误的印象时间越久就越难更正,譬如很小的时候读刘亚洲的《攻击,攻击,再攻击》,里面很多情节都信以为真,直到博士快毕业的时候,某一天和朋友谈及以色列的特种部队,还援引了刘亚洲的例子,只是那一瞬间觉得这样的故事讲出来自己都觉得不再可信,正好手头有1816年到2006年所有 Militarized Interstate Dispute 以及 War 的数据(著名的 COW 数据库),仔细的核对了时间,才发现刘亚洲写的是小说。

Blog分类: