金融分野でDSL (ドメイン固有言語)を使用したことのある人はいますか? 私が取り組んでいるアプリケーションにある種の DSL サポートを導入することを計画しており、いくつかのアイデアを共有したいと思います。
私は、どのドメイン要素が最も安定しているかを特定し、DSL でより適切に実装される機能を選択する段階にあります。この最初の機能の構文はまだ定義していません。
金融分野でDSL (ドメイン固有言語)を使用したことのある人はいますか? 私が取り組んでいるアプリケーションにある種の DSL サポートを導入することを計画しており、いくつかのアイデアを共有したいと思います。
私は、どのドメイン要素が最も安定しているかを特定し、DSL でより適切に実装される機能を選択する段階にあります。この最初の機能の構文はまだ定義していません。
金融契約は、Simon Peyton Jones と Jean-Marc-Erby によって DSL としてエレガントにモデル化されています。Haskell に埋め込まれた彼らの DSL は、論文How to write a Financial contractで紹介されています。
Jay Fields と Obie Fernandez は、このテーマについて幅広く執筆し、講演しています。
Martin Fowler の著書には、DSL の実装に関する一般的な内容も記載されています (ただし、金融に特化したものではありません)。
Simon Peyton Jones と Jean Marc Eber の作品は、「コントラクトの作成: 金融工学の冒険」とそこから派生したすべての「LexiFi と MLFi」のおかげで、最も印象的だと思います。
Shahbaz Chaudhary のScala 実装は、 MLFiが一般に利用可能ではないことを考えると (関数型言語としての Scala は Haskell よりもアクセスしやすいため)、最も魅力的であることがわかりました。
「Adventures in Financial and Software Engineering」およびそこから参照されているその他の資料を参照してください。
この実装で何ができるかを理解するために、切り取ったものをあえて複製します。
object Main extends App {
//Required for doing LocalDate comparisons...a scalaism
implicit val LocalDateOrdering = scala.math.Ordering.fromLessThan[java.time.LocalDate]{case (a,b) => (a compareTo b) < 0}
//custom contract
def usd(amount:Double) = Scale(Const(amount),One("USD"))
def buy(contract:Contract, amount:Double) = And(contract,Give(usd(amount)))
def sell(contract:Contract, amount:Double) = And(Give(contract),usd(amount))
def zcb(maturity:LocalDate, notional:Double, currency:String) = When(maturity, Scale(Const(notional),One(currency)))
def option(contract:Contract) = Or(contract,Zero())
def europeanCallOption(at:LocalDate, c1:Contract, strike:Double) = When(at, option(buy(c1,strike)))
def europeanPutOption(at:LocalDate, c1:Contract, strike:Double) = When(at, option(sell(c1,strike)))
def americanCallOption(at:LocalDate, c1:Contract, strike:Double) = Anytime(at, option(buy(c1,strike)))
def americanPutOption(at:LocalDate, c1:Contract, strike:Double) = Anytime(at, option(sell(c1,strike)))
//custom observable
def stock(symbol:String) = Scale(Lookup(symbol),One("USD"))
val msft = stock("MSFT")
//Tests
val exchangeRates = collection.mutable.Map(
"USD" -> LatticeImplementation.binomialPriceTree(365,1,0),
"GBP" -> LatticeImplementation.binomialPriceTree(365,1.55,.0467),
"EUR" -> LatticeImplementation.binomialPriceTree(365,1.21,.0515)
)
val lookup = collection.mutable.Map(
"MSFT" -> LatticeImplementation.binomialPriceTree(365,45.48,.220),
"ORCL" -> LatticeImplementation.binomialPriceTree(365,42.63,.1048),
"EBAY" -> LatticeImplementation.binomialPriceTree(365,53.01,.205)
)
val marketData = Environment(
LatticeImplementation.binomialPriceTree(365,.15,.05), //interest rate (use a universal rate for now)
exchangeRates, //exchange rates
lookup
)
//portfolio test
val portfolio = Array(
One("USD")
,stock("MSFT")
,buy(stock("MSFT"),45)
,option(buy(stock("MSFT"),45))
,americanCallOption(LocalDate.now().plusDays(5),stock("MSFT"),45)
)
for(contract <- portfolio){
println("===========")
val propt = LatticeImplementation.contractToPROpt(contract)
val rp = LatticeImplementation.binomialValuation(propt, marketData)
println("Contract: "+contract)
println("Random Process(for optimization): "+propt)
println("Present val: "+rp.startVal())
println("Random Process: \n"+rp)
}
}
F#における Tomas Petricekの優れた成果は、検討する価値があります。
「DSL」パラダイムを超えて、「ビッグデータ」の現実を満たしながら、金融商品や金融契約の複雑なセマンティクスを表現する完全な方法を得るには、他の多くの強力なパラダイムからの貢献が必要になると思います。
ここで言及されているいくつかの言語を確認する価値があります: http://www.dslfin.org/resources.html
私たちは、Fairmat ( http://www.fairmat.com )を使用して財務評価 DSL を作成するというアイデアに取り組みました。
-ペイオフと支払いの依存関係を表現するために使用できる DSL を公開します -基盤となる数学ライブラリで .NET/C# を使用して新しいタイプの分析と理論的ダイナミクスの実装を作成するための拡張モデルが含まれています (いくつかのオープン ソースの例を参照してください) https://github.com/fairmatで