首页 / 知识

金融领域的DSL(特定领域语言)

2023-04-12 23:05:00

金融领域的DSL(特定领域语言)

DSLs (Domain Specific Languages) in Finance

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

我正处于确定哪些是最稳定的域元素并选择可以通过DSL更好实现的功能的阶段。 我尚未定义此第一个功能的语法。


Simon Peyton Jones和Jean-Marc-Erby将金融合同优雅地建模为DSL。如何编写金融合同中介绍了嵌入在Haskell中的他们的DSL。


杰伊·菲尔德斯(Jay Fields)和奥比·费尔南德斯(Obie Fernandez)对此主题进行了广泛的写作和讨论。

  • Jay Fields介绍领域特定语言
  • Jay Fields的商务自然语言系列
  • Obie Fernandez在DSL中表达合同条款
  • Jay Fields在infoQ上的非常好的演讲

您还可以在Martin Fowler的著作中找到有关实现DSL的一般知识(但并不专门针对金融)。

  • DSL

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

通常使用诸如Haskell,Scala或OCaml之类的功能语言嵌入来构建用于金融合同的DSL。金融业对功能编程语言的采用将继续使这种方法具有吸引力。

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

  • 使用本体语言对金融实体进行建模(金融业业务本体)
  • 替换通常使用电子表格描述的计算(http://doi.acm.org/10.1145/1411204.1411236)
  • 养老金计划建模(案例研究:金融服务)
  • 分析金融市场数据(刺猬语言)

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

如果您想与在金融系统上使用DSL的专业人士和研究人员见面,那么10月1日在佛罗里达州迈阿密举行的MODELS 2013大会上将有一个即将举行的研讨会:http://www.dslfin.org/


我认为西蒙·佩顿·琼斯(Simon Peyton Jones)和让·马克·埃伯(Jean Marc Eber)的工作最令人印象深刻,因为"撰写合同:金融工程历险记"以及由此衍生的一切:" LexiFi和MLFi"。

鉴于MLFi并不普遍可用,并且发现Shahbaz Chaudhary的Scala实现最吸引人(并且因为Scala作为功能语言比Haskell更易于访问)。

请参阅"金融和软件工程冒险"以及从中引用的其他材料。

我将敢于复制此实现的功能的摘要。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
  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: \
"+rp)
  }

}

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

除了" DSL"范式之外,我建议我们还需要许多其他强大范式的贡献,以便在满足"大数据"现实的同时,完整地表示金融工具和金融合同的复杂语义。

  • 概率编程:Figaro,Stan等
  • 大数据分析:R,Spark,SparkR
  • 可扩展的"数据结构"("堆外内存";跨商品硬件但也跨语言):" Spark中的DataFrames用于大规模数据科学"(与R,Scala / Java和Python配合使用)
  • 语义网:"财务主题模型"和本体。

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


我们致力于通过Fairmat(http://www.fairmat.com)创建财务评估DSL的想法。

-它公开了一个DSL,可用于表示收益和支付依赖性
-它包含一个扩展模型,该扩展模型用于使用.NET / C#和我们的基础数学库来创建新型的理论分析和理论动力学实现(请参阅https://github.com/fairmat上的一些开放源代码示例)


语言应用程序分享支持

最新内容

相关内容

热门文章

推荐文章

标签云

猜你喜欢