質問
誰かと一緒に働いた人はいますか DSL (ドメイン固有言語) 金融分野では?私が取り組んでいるアプリケーションに何らかの DSL サポートを導入する予定であり、いくつかのアイデアを共有したいと思います。
私は現在、最も安定したドメイン要素を特定し、DSL で実装した方がよい機能を選択する段階にあります。この最初の機能の構文はまだ定義していません。
解決
ジェイ・フィールズとオビー・フェルナンデスは、このテーマについて幅広く執筆し、講演しています。
- ジェイ・フィールズのイントロ ドメイン固有言語
- ジェイ・フィールズのシリーズ ビジネス自然言語
- オビー・フェルナンデス DSL での契約条件の表現
- とても良い プレゼンテーション infoQ による Jay Fields による
Martin Fowler の著作には、DSL の実装に関する一般的な内容も記載されています (ただし、金融に特化したものではありません)。
他のヒント
金融契約は、Simon Peyton Jones と Jean-Marc-Erby によって DSL としてエレガントにモデル化されました。Haskell に埋め込まれた彼らの DSL が論文で紹介されています 金銭契約の書き方.
ドメイン固有言語 (DSL) は、金融商品を表すために最も一般的に使用されます。正統な論文はサイモン・ペイトン・ジョーンズのものです 契約書の作成:金融工学の冒険 これは、Haskell のコンビネータ ライブラリを使用してコントラクトを表します。コンビネータ アプローチの最も顕著な使用法は次のとおりです。 LexiFi の MLFi 言語, 、これは OCaml の上に構築されています (同社の CEO である Jean-Marc Eber は、「Comusing Contracts」論文の共著者です)。バークレイズはある時点でこのアプローチをコピーし、人間が判読できる数学的な価格計算式を生成できる機能など、追加の利点を説明しました (商用利用:エキゾチックな取引を機能させる).
金融契約の DSL は通常、Haskell、Scala、OCaml などの関数型言語の埋め込みを使用して構築されます。金融業界における関数型プログラミング言語の採用により、このアプローチは今後も魅力的なものとなるでしょう。
DSL は、金融商品を表すだけでなく、金融分野でも次の目的で使用されます。
- オントロジー言語を使用した金融エンティティのモデリング (金融業界のビジネスオントロジー)
- 通常、スプレッドシートを使用して記述される計算を置き換えます (http://doi.acm.org/10.1145/1411204.1411236)
- 年金制度のモデリング (ケーススタディ:金融業務)
- 金融市場データの分析 (ハリネズミの言語)
私は財務 DSL の論文、講演、その他のリソースの完全なリストを次の場所で管理しています。 http://www.dslfin.org/resources.html.
金融システムの DSL に取り組んでいる専門家や研究者に会いたい場合は、10 月 1 日にフロリダ州マイアミで開催される MODELS 2013 カンファレンスでワークショップが開催されます。 http://www.dslfin.org/
私たちは、Fairmat と財務評価 DSL を作成するというアイデアに取り組みました ( http://www.フェアマット.com )
-DSLは、ペイオフと支払いの依存関係を表現するために使用できるDSLを公開します - 基礎となる数学ライブラリを使用して.NET/ C#を使用して、新しいタイプの分析と実装の理論的ダイナミクスの実装を作成するための拡張モデルが含まれています(オープンソースの例を参照してくださいで https://github.com/fairmat
サイモン・ペイトン・ジョーンズとジャン・マルク・エーバーの作品が最も印象深いのは、「契約の作成:金融工学の冒険」とそこから派生したすべて:」LexiFi と MLFi".
見つかった シャバズ・チョーダリーの MLFi が一般的に利用できないことを考えると (そして、関数型言語としての Scala は Haskell よりもアクセスしやすいため)、Scala の実装が最も魅力的です。
見る 「金融とソフトウェアエンジニアリングの冒険」 そしてそこから参照される他の資料。
この実装で何ができるかを理解するために、あえて一部を複製してみます。
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# については、検討する価値が非常にあります。
「DSL」パラダイムを超えて、「ビッグデータ」の現実に対応しながら、金融商品や金融契約の複雑なセマンティクスを表現する完全な方法を得るには、他の多くの強力なパラダイムからの貢献が必要であると私は提案します。
- 確率的プログラミング: フィガロ, 、スタンなど
- ビッグデータ分析:R、スパーク、 スパークR
- スケーラブルな「データ ファブリック」 (「オフ ヒープ メモリ」;コモディティハードウェア全体だけでなく、 言語を超えて): 「大規模データ サイエンスのための Spark の DataFrames」 (R、Scala/Java、Python で動作します)
- セマンティックウェブ:」金融トピックモデル」とオントロジー。
ここで言及されているいくつかの言語を確認する価値があります。 http://www.dslfin.org/resources.html