金融商品を記述するためのDSL(Domain Specific Language, ドメイン特化言語)っぽいもんをC++でやってみた(※元ネタ『Composing Contracts: An Adventure in Financial Engineering』)
これは一体何?
金融商品を記述するためのDSL(Domain Specific Language, ドメイン特化言語)を作って、それを実際評価(evaluation)して金融商品のお値段を計算してみましょうという枠組み?のお話。元の本とかだとHaskellなんかで実装するのがセオリーっぽい。自分の呟きでアレですが、Bloombergも既にOCamlで実装した模様。
前々から噂はあったOCamlライクに金融商品を書いて評価できるのブルームバーグのデリバティブライブラリ出てたのか!Excelからも叩ける見たいだしDLIB <GO>するっきゃねぇ! RT BLOOMBERG(PDF) http://t.co/12qXtpG2sK #メモランダム
— 第三使徒テラモナギエル (@teramonagi) 2014, 10月 15
オレオレ実装
割引債とヨーロピアンで力尽きました。C++辛い、lazyないの辛い、いちいちsmart pointer辛い、全体的に辛い。main部分は以下。それっぽくは見えるし、ここまでの答えは合ってるようだ。その他の実装について正しいかはわからん。わからんが、Githubにはアップしておいた。
int main() { //One unit { ContractPtr c = one(JPY); eval_and_show(c); } //Zero Coupon bond { ContractPtr c = zcb(mkDate(365), 10.0, JPY); eval_and_show(c); } //Zero Coupon bond(port) { ContractPtr c1 = zcb(mkDate(365), 10.0, JPY); ContractPtr c2 = zcb(mkDate(365 * 2), 10.0, JPY); eval_and_show(and(c1, c2)); } //European option { ContractPtr c = european(mkDate(365), zcb(mkDate(365 * 2), 10.0, JPY)); eval_and_show(c); } return 0; }
参考
- http://contracts.scheming.org/
- Lexifiの元の論文
- Lexifiの奴のパワポ解説ぽいもの1
- Lexifiの奴のパワポ解説ぽいもの2
- この話を元にしたD論 on GPU実装
- GitHub - channingwalton/scala-contracts: A port of http://web.archive.org/web/20130326233424/http://contracts.scheming.org/- an implementation of Composing contracts: an adventure in financial engineering, by Simon Peyton Jones
- F# Code: Composing Contracts Part 1: Data Types
*1:当記事下部、参考を参照