科學家,模型,桂河大橋,mono,種族歧視

HomePage | Memberswill go by tor | RecentChanges | Join |

*科學家,模型,桂河大橋,mono,種族歧視*

歲末年終,可以趁著年假寫些我覺得如果有人google到的話會很有幫助的事,因為就如同*人類的基因和蠑螈的基因是百分之很高的數字是相同的*(去台灣科學教育館看的)一樣,專家和非專家的資訊的差別大概不會超過10 bit(因而增加1024倍的嘗試錯誤時間)。儘管這個文章標題很怪,文間或有許有很多專有領域的知識,但是呼巄讀過去應該也是大致上知道意思的。

2012年我在我工作的公司進行了一項有點大膽的專案。USDCNY這個外匯數字的某個稱為digital knockout forward的金融商品,歷來都是外商銀行才有能力賣的衍生性金融商品。什麼叫做*有能力賣*呢?首先,很多人以為搞金融商品就像賭博,銀行和客人對賭。這大錯特錯。如果銀行和客人只是對賭,就不會有最近幾年沸沸揚揚的狗們造成的金融問題和被美國政府告的故事。知道這個故事的人或許會說,"啊!我知道了,銀行不和客人對賭,但是*做莊*",這對狗們這個故事來說基本上是對的;狗們找了兩組客人,天花地墜的對一組客人說這商品的賺頭多好,也天花地墜的對另一組客人說這商品的賺頭多爛。所以有了兩組部位相反的客人,狗們賺了一個和上帝擲骰子無關的差價,不管上帝擲骰子是什麼結果,倒楣的會是某組客人而絕不是狗們;這就是所謂的back-to-back或是flow business;甚至有時候狗們如果在某個領域有影響力也可以客串上帝的角色,一下研究報告說石油會上天,過一下又說石油會下地,腦殘的只想追隨*意見領袖*的世人就瘋狂起舞了。

所以到底什麼叫做*"有能力賣"呢?就是有能力只找一組客人,但是又能不受上帝擲的骰子的影響。舉個簡單的例子,假如有個衍生性金融商品:"明天天氣晴則可以拿0元,否則拿1元",銀行和客人對做訂價在0.4元,也就是客人明天可以從銀行拿到這個機率性的錢,但是今天得先付0.4元給銀行。這個交易如果是客人和銀行對賭,等於是一個"晴天則虧0.4元,否則賺0.6元"的彩卷。但是在市場上有另外一個金融工具:"明天天氣晴可以賺1元,否則會虧2元",則銀行可以在市場上空 (short) 1/3單位的這個金融工具,如此所謂的*避險作為*後,就可以不管明天是不是晴天都穩賺1/15元。所以所謂"有能力賣"*的意思其實是:

  1. 腦筋聰明,懂得某些數量方法來降低不確定性。
  2. 關於不確定性有某個模型而且這個模型很接近實際的世界。
  3. 非常discipline地執行由1和2所產生的*"避險作為"*。

這三件事就導致這些"有能力賣"的國際銀行(如果正派的話)可以賺些普通人不能賺的錢。這種賺錢方式雖然正派但是傷腦筋,所以back-to-back的偏門方式就會在人性脆弱的時候趁虛而入了;因為back-to-back的方式其實是不需要模型的,而發展模型又不是一蹴可磯的事,所以如果我老闆的老闆的..說"hey josh,現在市場不好,我們隨便寫個模型來做back-to-back的生意好了,要不然我看今年會沒年終獎金",這需要有點科學偏執和跟自己荷包過不去的個性來加持,否則是很難全身而退的。

回到2012年,嚴格說來是2011年年底,我的modeling部門在不知道幾次的*"觀察市場/搞模型/寫程式/避險效果測試"*的cycle之後(這部分的bit屬於商業機密就不說了),在levy process的representation theory的啟發下終於找到了一個詭譎的USDCNY市場的模型;終於可以分原本外商銀行的一杯羹。為了能以最快的速度成為國際銀行,我記得一開始公司各方面幾乎都找"現成"的,回想七年前,我的同事有印度人法國人德國人加拿大人香港人,所謂experience professional。連前中後台的treasury系統都是直接買世界最貴的;這個系統叫做Murex,是個法國公司出的給號稱第一線銀行用的系統,除了頭期款和它的攤提之外,至今我們每年都還要花三千萬台幣給Murex來維護。我之前待過軟體公司,總覺得這樣買系統有點怪(越貴的不見得越好),事後證明這個奇怪是對的,這待會再說。我的modeling部門在2012的一個大專案就是把我們的USDCNY模型種到Murex裡面。我modeling這邊的工作模式是上述的*"觀察市場/搞模型/寫程式/避險效果測試"*的cycle,為此我們選的programming language不能太高階(否則跑太慢)也不能太低階(否則我們會花太多時間在太多支節末葉的技術問題)。所謂高階程式語言例如perl、VBA、PHP,針對特定目的程式碼行數不多但是程式跑很慢;我們曾經寫個VBA程式跑了兩周還沒結束。所謂低階程式語言例如C、assembly,針對特定目的程式碼行數頗多但是程式跑很快;我們曾經為了一個multithread的C程式的一個pointer error花了兩個月,雖然pointer error對尋找一個好模型這個問題一點意義也沒有。中庸之道,所以我們用的程式語言是以dotnet c#為主,在需要速度的utility上用Pinvoke的方式呼叫native library,算是個中階的程式語言,這些dotnet的byte code在windows上有Microsoft .Net可以跑,在Solaris也有mono .Net可以跑,跑的速度也還可以,而且如果已經有了模型,我們的time-to-market可以快得嚇人,遠非低階語言能及。

對某個東西投入越多,即使一開始對這個東西有點意見,但是到最後,不知道是不是因為投入過多被套牢,反而有點惺惺相惜(黏迢迢)的感覺。這邊所謂的東西可能是愛情或婚姻或股票或Murex。就像是個桂河大橋的劇情。七年前已知某些不甚完美的地方,我們的IT在周邊寫了許多程式來work around,因為足堪範例,Murex甚至還出錢請我們去新加坡的marketing event上show off來說明給它的客戶。我們很自豪能做到原本Murex做不到的事,中國人沒有比法國人笨,Murex也很高興我們幫他造了這些桂河大橋。但是俘虜畢竟是俘虜,在一個更高的戰略視野下,我們要這樣幫Murex嗎?多年後我的香港人同事去了狗們的IT部門,他說狗們有個1000 cpu的computing farm,全都是自己做的。*"Murex是第一線國際銀行首選的系統"*這句話其實只是印在DM上的,實際的情形是,真正第一線國際銀行的系統都是自己打造的決不會用買的。在我們被Murex俘虜多年後,我聽說中國信託2013年已經不打算付maintenance fee給Murex,大概都是因為已經吃到了某些苦果。七年下來每年三千萬,足夠我們自己依據自己的需求打造自己的系統,而且不用花時間來想和做work around,因為自己打造的可以一開始就要的設計。我四年前開始作亂,畢竟當時已經開始有很多新衍生性金融商品不能放進Murex或是即使能放進Murex但是Murex提供的模型一點都不符合實際的世界。我於是弄了一個code name是OffMurex的專案來放和計算這些商品;code name就已經說明了我的企圖:"關掉Murex",但是公司IT只提供很少的資源來支持,所以做得頗low end的,但是該有的設計也都還有。USDCNY digital knockout forward原本也可以在上面跑得好好的,但是因為交易台還是希望能在Murex裡面整合greek和損益,所以起了上述的把USDCNY模型種進Murex的專案。我們在2012年初concept proof的做法驗證可行後,決定在一堆Solaris機器裡用mono來和Murex整合。我們的concept proof程式是用C和embedded mono來呼叫dotnet的程式。奇怪的事發生了。雖然我們的模擬Murex的concept-proof程式跑得很順利,但是巴黎在寫完真正的code的程式卻隨機性的不穩定;程式當掉的時候,core image亂成一團,如果拿意外身亡的人來比方就像斷腳插在頭上的慘死狀。因為我們沒有Murex的source code,所以我們要求巴黎去查問題,因為mono是open source,巴黎理論上可以同時看到全部的source code。

已知的事實是這樣:

  1. 真的Murex程式跑Murex自己的模型,不會當。
  2. 真的Murex程式跑我們mono的模型,會當。
  3. 模擬的Murex程式跑我們mono的模型,不會當。

巴黎拒絕我們的要求。巴黎說:"因為1和2,所以問題出在mono,而決定使用mono是台北的決定,所以mono出問題不是巴黎該解決的事"。這是甚麼邏輯!這是典型的口語邏輯,完全不科學。我為了嗆聲,也仿照巴黎的句子說:"因為2和3,所以問題出在真的Murex程式,而台北沒有真的Murex程式的source code,所以問題是巴黎該解決的事"。我回的話真的只是嗆聲,因為我是很科學的人,知道那個說詞真的只是話術;如果你覺得這些句子make sense的話,那你一定不是腦筋清楚的科學家。這種句子和典型的種族歧視邏輯一模一樣,白人依此邏輯可以說黑人是壞人。

因為USDCNY的business有很強的seasonal性質,大概第一季甚至第一個月就完成年度volume的80%,這個專案一定要在2013一月上線,否則我們會少賺很多錢。沒人能幫我們,我們也沒時間蹉跎,我們開始漫長的*猜原因/改我們能摸到的sourcecode/看是否解決* cycle。猜了N個原因都無效。直到有一天我跑完10k後突然注意到mono的compile的configuration一定會把*"-fomit-frame-pointer"濾掉。這行為很特別,問了google大神,它說libgc一定要用frame-pointer來執行garbage collection。我又仔細想真的Murex程式和模擬的Murex程式的差別在哪,雖然沒有真的Murex程式的source code,但是由ldd會看到它用到java virtual machine的libjvm,靈光乍現,我馬上問google大神另一個問題,結果令人扼腕害我徒手打破一個桌子:"在solaris系統上,如果一個C程式要用libjvm,則必須omit frame pointer,否則會有無可預期的crash"。所以我可以高度猜測巴黎的真的Murex程式的Makefile一定有"omit-frame-pointer"*,因此在Solaris裡面,不能有C程式同時連結libgc和libjvm,否則就是這樣的random crash。我花兩天立刻把整個Murex的interface程式碼改成用sqlite來傳遞資料和呼叫外部mono程式來解決,結果就如同從來沒這些問題一樣。

Murex是java的擁護者,所以巴黎會強烈認為是mono的問題。如果Murex是用mono寫的,而我的模型是用java寫的,在Solaris上也會有一樣的問題,難道這樣就是java的錯。這真的是典型的種族歧視,先佔地為王的java族歧視後到的mono族。巴黎的反應真是讓我失望,原因有二:

  1. 巴黎號稱世界最專業的program developer但是*腦筋卻一點都不科學*。
  2. 巴黎如果願意絕對比台北更早解決這個問題,因為*巴黎能看到全部的source code和makefile*。這個問題花了我們四個月。

其實巴黎讓我失望的原因有三,第三件事如下。當我們在專案幾乎快結束的時候,發現這個昂貴的系統的另一件蠢事:這個系統除了股票和債券外沒有product的觀念。所謂product觀念就是簡單如菜籃族都可以理解:"狗們網站上說我的某個複雜連動債的價值是100 notional有1.23美金,而我的部位是200 notional,所以我的部位的目前的價值是2.46美元"。所以每天end of day的會計報表裡面的價值其實根本不用真的去計算,而只要把中台評價的結過作個簡單的四則運算甚至copy就能拿到了.因為Murex沒有product觀念,所以它每筆都跑去做個複雜的模型計算.而我們IT也腦殘:"這需要再花四百萬買個新機器來增加計算能力"。我實在看不下去了,於是說:"你們不覺得這個USDCNY專案要搞得像擴大內需專案嗎?我modeling這邊可以在model的計算前增加一段程式碼,把已經算過的market spec和product對應的pv給cache起來,來確定真正需要算的再算"。結果完美,end of day會計程式五分鐘跑完而不是七小時跑完。Murex說:"厲害";我才不希罕這個厲害,這只是應急,是我造的最後一個桂河大橋,雖然我打心裡佩服自己橋造的真是精巧,堪稱是artwork。

Murex系統爛成這樣,我們想要做什麼有益的事都遇到阻力,幹嘛還要用它?這個答案可以從幾天後的IT的一件事看出答案。cache的機制如預期中運作後數天,IT跟我說:*"為了維護方便,我們希望你們modeling把cache的資料庫從open source的postgresql改成Murex的oracle"*。我火大了,但是很平靜地回了下面這段話:

我覺得這件事有幾個面向要先知道:
1. 這個cache機制只是因為Murex handicap的應急,如果IT想要改這個cache的implement,
   既然source code是公司的,想要修改的話,modeling這邊沒理由禁止,請自行修改。
2. 這陣子以來我們已經看到太多Murex的配合程度和缺陷,IT的資源又是那麼有限,與其花精力改
   這個cache implement,倒不如花精力把自己建立的那個OffMurex給做好做對,這樣以後我
   們擁有全部的source code,trouble shooting或enhance也容易。
3. google也沒用oracle,不要以為名牌就是好貨,open source就是爛咖。很多時候IT用名牌
   是因為play career safe的考量;如果我是IT主管而且我和我的手下能力不足,我用了open
   source萬一出事求救無門,我只有被fire一途,但是我用了名牌萬一出事,我還可以對我老闆
   說:*"不能怪我呀!連廠商自己的專家都解決不了了"*來保住飯碗。

我知道現在IT的能耐,他們已經在Murex的教育訓練之後進入了一個comfort zone,要逃脫需要能力和勇氣;現在我公司的IT連寫程式都不會,只會操作系統,雖然不敢承認,所以1一定是做不到的。至於2,等於是說IT花在Murex的訓練是白花的,IT絕對不敢跟董事長說那每年三千萬是自己的愚蠢造成的。沒幾分鐘,有一個IT資深協理義正嚴詞的說我不該針對個人作人身攻擊。我覺得錯愕和好笑,因為我壓根沒想到任何IT主管(我腦中真的沒有他們位置),這位大大也太對號入座了。不過根據經驗,一定我又是講了某些不能說的秘密。我能怎麼辦呢?只好回信說:"不好意思,我作風一向對事不對人,請問您覺得我是針對某位個人呢?"。這位大大也沒回信,事情就此打住了。哀哉!這些人。我倒是已經決定叛亂革命了。

最近台灣有個22k議題,這是高還是低呢?我在IT方面見過太多的腦殘的台灣人,我會覺得22k還多給了,但是我更看過某些歐洲人,其實也是爛咖一個,如果我來決定薪資,這些歐洲爛咖一定也不到22k,但是實際上他們坐擁高薪,所以給台灣的這些腦殘IT錢22k也是公允的。

千萬不要用Murex。如果貴銀行想省事,那乾脆拿個Excel。