题
有没有人一起工作过 DSL(领域特定语言) 在金融领域?我计划在我正在开发的应用程序中引入某种 DSL 支持,并想分享一些想法。
我正处于确定哪些是最稳定的领域元素并选择哪些功能可以通过 DSL 更好地实现的阶段。我还没有定义第一个功能的语法。
解决方案
杰·菲尔兹 (Jay Fields) 和奥比·费尔南德斯 (Obie Fernandez) 就该主题撰写了大量文章并进行了广泛讨论。
- 杰·菲尔兹简介 领域特定语言
- 杰·菲尔兹的系列 商业自然语言
- 奥比·费尔南德斯 在 DSL 中表达合同条款
- 一个十分好的 推介会 来自 Jay Fields 的 infoQ
您还可以在 Martin Fowler 的著作中找到有关实现 DSL 的一般内容(但不是专门针对金融的)。
其他提示
Simon Peyton Jones 和 Jean-Marc-Erby 将金融合约优雅地建模为 DSL。论文中介绍了他们嵌入 Haskell 的 DSL 财务合同如何写.
领域特定语言 (DSL) 最常用于表示金融工具。规范论文是 Simon Peyton Jones 的 撰写合同:金融工程的冒险 它代表使用 Haskell 中的组合器库的合约。组合器方法最突出的用途是 LexiFi 的 MLFi 语言, ,它构建在 OCaml 之上(他们的首席执行官 Jean-Marc Eber 是撰写合同论文的合著者)。巴克莱曾一度复制了该方法并描述了一些额外的好处,例如生成人类可读的数学定价公式的能力(商业用途:在奇异交易中发挥作用).
金融合约的 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.fairmat.com )
- 它公开了一个DSL,可用于表达报酬和付款依赖项 - 它包含一个扩展模型,用于使用.NET/ C#与我们的基础数学库创建新型的理论动力学分析和实现(请参阅一些开源源示例)在 https://github.com/fairmat
我认为 Simon Peyton Jones 和 Jean Marc Eber 的作品最令人印象深刻,因为“撰写合同:金融工程历险记”以及由此衍生的一切:”LexiFi 和 MLFi".
成立 沙巴兹·乔杜里的 鉴于 MLFi 并不普遍可用,Scala 实现最具吸引力(而且因为 Scala 作为函数式语言比 Haskell 更容易访问)。
看 “金融和软件工程的冒险” 以及从那里引用的其他材料。
我将敢于复制一个片段来了解这个实现可以做什么。
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)
}
}
这 托马斯·彼得里切克 (Tomas Petricek) 的出色作品 F# 中的内容非常值得探索。
除了“DSL”范式之外,我建议我们需要许多其他强大范式的贡献,才能有一个完整的方法来表示金融工具和金融合同的复杂语义,同时满足“大数据”现实。
- 概率规划: 费加罗, 、斯坦等
- 大数据分析:R、火花、 火花R
- 可扩展的“数据结构”(“堆外内存”;跨商品硬件,而且 跨语言): “Spark 中的数据帧用于大规模数据科学” (适用于 R、Scala/Java 和 Python)
- 语义网:”金融主题模型”和本体论。
值得回顾一下这里提到的一些语言: http://www.dslfin.org/resources.html