金融と OCaml

関数型言語というと金融で流行っている、特に OCaml と言えば金融御用達関数型言語として語られることも多い。金融業界に関数型言語を持ち込み成功した最初の二社 LexiFi とJane Street Capital は共に OCaml を採用し、そして二社とも今日成功しているからだ。

今回はそのうち LexiFi について話したい。私が Ph.D を取った後、一年間、産業ポスドクとしてお世話になった会社である。

金融派生商品(デリヴァティブ)は様々な日時や条件、依存する別の商品価格によって価値が変化する。デリヴァティブは先物やオプションなどのような一般市場でも流通している簡単な派生商品だけでなく、会社間でだけで取引される非常に複雑な物もある。これらの商品にはそれぞれ業界内で通用する名前が付けられ取引、評価、管理が行われてきた。そしてこれらを扱うプログラムもまた、それぞれの商品ごとに別個の機能として実装されてきた。結果としてプログラムやデータ種は膨大なものとなり、その開発やメンテナンスは非常に煩雑なものとなった。例えば金融機関間でこれらの商品のデータをやり取りする規格であるFpML(http://www.fpml.org)はこの実情に合わせた非常に大きなものになっている。

(もちろん FpML に意味がないわけではない…会社間での商品情報の交換には良いだろう。だがモデリングとしては完全に誤ったアプローチである。新しい商品を作ったとして、それが現行の FpML で記述できなければ、FpML 改訂を働きかけなければならないわけだ。そして改定されれば FpML は更に巨大になる。)

これらの金融派生商品一つ一つを見ると様々であり、その仕様も複雑なものもあるが、実はその全ては簡単な人工言語で記述できる。そのことに気付いた LexiFi(http://www.lexifi.com)の Jean Mark Eber は世の中に出回っている金融派生商品のほぼ全てが時期選択や条件分岐などの単純な15個ほどのプリミティブの組み合わせで記述できることを示した。

複雑な数多くの商品を数少ないプリミティブに還元できる、これは大変に強力である。各プリミティブはとても簡単なので、それらの意味や、評価方法は簡単に書くことができ、複雑な商品はこれらの組み合わせから自然に演繹できる。もはやそれぞれの商品ごとに面倒な実装をし直す必要はなくなったのだ。

LexiFi はこの商品記述言語システムを関数型言語 OCaml で実装した。これはまったく自然な選択だった。 http://d.hatena.ne.jp/camlspotter/20131105/1383619506 (そうです。これはこの記事を書くための前座だったのです)でも書いたように、言語を代数的に扱うならばオブジェクト指向言語よりも代数的データ型を持つ関数型言語が適しているし、構成されるプリミティブに第一級関数が使われていたからでもある。

もう少し詳しく話すと、商品記述言語自体は、 OCaml言語ではない。もっと単純なものだ。これは OCaml の代数的データ型として表される。これを組み合わせたり、分解するための操作言語として OCaml を使う。つまり、今流行りの EDSL である。そのころ私達はそんな単語も知らなかったのだが… この EDSL を使って商品記述を解析し、適正な値段をモンテカルロ法でシミュレートしたり、次回支払いの期日を管理したり…様々なアプリケーションがこの OCaml 上の DSL を使ってどんどん書くことができる。

事実、この言語化によるパワー、金融商品の代数的表現を使って LexiFi はデリバティブのモデル化、評価、マネージメントなどの高度なシステムを少人数、短期間で開発し、現在に至っている。

この関数型言語による金融派生商品のモデル化は LexiFi だけでなく現在では複数の大手の金融機関でも採用されている。その一つが今私が働いている銀行である。この仕事場も元を辿れば LexiFi のメンバーからの紹介によるもので私は LexiFi には感謝しきれない。

数多くの対象を一つ一つ個別に扱うのではなく、それらを記述できる単純な言葉を見つけ出し、その言葉の構成子に対して分析やプログラミングを行う…無論これは多くのプログラマー、特に代数的データ型に慣れた関数型言語プログラマーには当然の事なのだが、金融界ではそれ以前にはぜんぜん知られていなかったんだよ、と彼は私に語っている。

問題を上手く言語化できれば問題の九割は解けたようなものだ、と私は考えるようになった。ただしそのためには問題への深い理解が不可欠なのだが…