18

有没有人在金融领域使用过DSL(领域特定语言) ?我计划在我正在开发的应用程序中引入某种 DSL 支持,并希望分享一些想法。

我正处于确定哪些是最稳定的领域元素并选择可以通过 DSL 更好地实现的功能的阶段。我还没有定义第一个特性的语法。

4

5 回答 5

13

Simon Peyton Jones 和 Jean-Marc-Erby 将金融合约优雅地建模为 DSL。他们嵌入在 Haskell 中的 DSL 在论文How to write a financial contract中进行了介绍。

于 2008-11-12T04:05:03.143 回答
9

Jay Fields 和 Obie Fernandez 就这一主题进行了广泛的写作和讨论。

您还可以在 Martin Fowler 的著作中找到有关实施 DSL 的一般内容(但并非专门针对金融)。

于 2008-08-23T12:04:32.493 回答
6

领域特定语言 (DSL) 最常用于表示金融工具。规范论文是 Simon Peyton Jones 的撰写合同:金融工程冒险,它使用 Haskell 中的组合库表示合同。组合器方法最突出的用途是LexiFi 的 MLFi 语言,它建立在 OCaml 之上(他们的首席执行官 Jean-Marc Eber 是撰写合同论文的合著者)。巴克莱一度复制了这种方法并描述了一些额外的好处,例如生成人类可读的数学定价公式的能力(商业用途:在异国贸易中发挥作用)。

金融合约的 DSL 通常是使用嵌入在 Haskell、Scala 或 OCaml 等函数式语言中的。金融行业对函数式编程语言的采用将继续使这种方法具有吸引力。

除了代表金融工具外,DSL 还用于金融领域:

我在http://www.dslfin.org/resources.html上维护了一份完整的金融 DSL 论文、演讲和其他资源列表。

如果您想结识在金融系统中使用 DSL 的专业人士和研究人员,10 月 1 日在佛罗里达州迈阿密举行的 2013 年 MODELS 会议即将举行研讨会:http ://www.dslfin.org/

于 2013-04-13T01:21:15.390 回答
1

我们致力于与 Fairmat ( http://www.fairmat.com )一起创建财务估值 DSL

- 它公开了一个 DSL,可用于表达支付和支付依赖关系 - 它包含一个扩展模型,用于使用 .NET/C# 和我们的底层数学库创建新的分析类型和理论动力学实现(参见一些开源示例在https://github.com/fairmat

于 2013-01-05T10:21:53.697 回答
1

我认为 Simon Peyton Jones 和 Jean Marc Eber 的作品最令人印象深刻,因为“撰写合同:金融工程冒险”以及由此衍生的所有内容:“ LexiFi 和 MLFi ”。

鉴于 MLFi 不普遍可用(并且因为 Scala 作为函数式语言比 Haskell 更易于访问),发现Shahbaz Chaudhary 的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)
  }

}

Tomas Petricek 在 F# 中的出色工作非常值得探索。

除了“DSL”范式之外,我建议我们需要来自许多其他强大范式的贡献,以便拥有一种完整的方式来表示金融工具和金融合约的复杂语义,同时满足“大数据”现实。

值得回顾这里提到的一些语言:http ://www.dslfin.org/resources.html

于 2015-08-02T10:18:39.367 回答