金融领域的 DSL(领域特定语言)
Posted
技术标签:
【中文标题】金融领域的 DSL(领域特定语言)【英文标题】:DSLs (Domain Specific Languages) in Finance 【发布时间】:2010-09-06 14:39:53 【问题描述】:有没有人在金融领域与DSLs (Domain Specific Languages) 合作过?我计划在我正在开发的应用程序中引入某种 DSL 支持,并希望分享一些想法。
我正处于确定哪些是最稳定的领域元素并选择可以通过 DSL 更好地实现的功能的阶段。我还没有定义第一个特性的语法。
【问题讨论】:
【参考方案1】:Jay Fields 和 Obie Fernandez 就该主题进行了广泛的写作和讨论。
Jay Fields 简介 Domain Specific Languages Jay Fields 在Business Natural Language 上的系列 奥比·费尔南德斯Expressing Contract Terms in a DSL Jay Fields 在 infoQ 上的一个非常好的 presentation您还可以在 Martin Fowler 的著作中找到有关实施 DSL 的一般内容(但不是专门针对金融的)。
DSL【讨论】:
【参考方案2】:Simon Peyton Jones 和 Jean-Marc-Erby 将财务合同优雅地建模为 DSL。他们嵌入在 Haskell 中的 DSL 在论文How to write a financial contract 中进行了介绍。
【讨论】:
【参考方案3】:我们提出了与 Fairmat (http://www.fairmat.com) 一起创建财务估值 DSL 的想法
-它公开了一个 DSL,可以用来表达支付和支付依赖 - 它包含一个扩展模型,用于使用 .NET/C# 和我们的基础数学库创建新类型的分析和理论动力学实现(请参阅https://github.com/fairmat 上的一些开源示例
【讨论】:
【参考方案4】:领域特定语言 (DSL) 最常用于表示金融工具。规范论文是 Simon Peyton Jones 的 Composing Contracts: an Adventure in Financial Engineering,它代表使用 Haskell 中的组合库的合约。组合器方法最突出的用途是LexiFi's MLFi language,它建立在 OCaml 之上(他们的首席执行官 Jean-Marc Eber 是撰写合同论文的合著者)。巴克莱一度复制了这种方法并描述了一些额外的好处,例如生成人类可读的数学定价公式的能力 (Commercial Uses: Going Functional on Exotic Trades)。
金融合约的 DSL 通常是使用嵌入在 Haskell、Scala 或 OCaml 等函数式语言中的。金融行业对函数式编程语言的采用将继续使这种方法具有吸引力。
除了代表金融工具外,DSL 还用于金融领域:
使用本体语言为金融实体建模 (Financial Industry Business Ontology) 替换通常使用电子表格描述的计算 (http://doi.acm.org/10.1145/1411204.1411236) 为养老金计划建模 (Case Study: Financial Services) 分析金融市场数据 (The Hedgehog Language)我在http://www.dslfin.org/resources.html 维护着一份完整的金融 DSL 论文、演讲和其他资源列表。
如果您想结识为金融系统使用 DSL 的专业人士和研究人员,10 月 1 日将在佛罗里达州迈阿密举行的 2013 年 MODELS 会议上举办研讨会:http://www.dslfin.org/
【讨论】:
【参考方案5】:我认为 Simon Peyton Jones 和 Jean Marc Eber 的作品最令人印象深刻,因为“撰写合同:金融工程历险记”以及由此衍生的所有内容:“LexiFi and MLFi”。
发现 Shahbaz Chaudhary's 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# 中的excellent work of Tomas Petricek 非常值得探索。
我建议,除了“DSL”范式之外,我们还需要许多其他强大范式的贡献,以拥有一种完整的方式来表示金融工具和金融合约的复杂语义,同时满足“大数据”现实。
概率编程:Figaro、Stan 等 大数据分析:R、Spark、SparkR 可扩展的“数据结构”(“堆外内存”;跨商品硬件但也适用于 across languages):"DataFrames in Spark for Large Scale Data Science"(适用于 R、Scala/Java 和 Python) 语义网:“Financial Topic Models”和本体。这里提到的一些语言值得回顾:http://www.dslfin.org/resources.html
【讨论】:
以上是关于金融领域的 DSL(领域特定语言)的主要内容,如果未能解决你的问题,请参考以下文章
ElasticSearch02_DSL特定语言matchbooltermtermsaggsfromsizerangesort排序查询
ElasticSearch02_DSL特定语言matchbooltermtermsaggsfromsizerangesort排序查询高亮显示
ElasticSearch02_DSL特定语言matchbooltermtermsaggsfromsizerangesort排序查询高亮显示