金融商品を記述するためのDSL(Domain Specific Language, ドメイン特化言語)っぽいもんをC++でやってみた(※元ネタ『Composing Contracts: An Adventure in Financial Engineering』)

はじめに


の6章「金融取引契約の書き方」をC++でオレオレ実装するとどうなるのか?って話をしましょうという話を某氏としたのでやってみんとす。C++辛い、F#とかがよかった。

これは一体何?

金融商品を記述するためのDSL(Domain Specific Language, ドメイン特化言語)を作って、それを実際評価(evaluation)して金融商品のお値段を計算してみましょうという枠組み?のお話。元の本とかだとHaskellなんかで実装するのがセオリーっぽい。自分の呟きでアレですが、Bloombergも既にOCamlで実装した模様。

あと、Githubの方にScala実装を上げてくれてた方がいた*1

オレオレ実装

割引債とヨーロピアンで力尽きました。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;
}

*1:当記事下部、参考を参照