有没有人在财务领域与DSLs (Domain Specific Languages)合作过?我打算在我正在开发的应用程序中引入某种DSL支持,并希望分享一些想法。
我正处于识别哪些是最稳定的域元素并选择可以通过DSL更好地实现的功能的阶段。我还没有定义第一个功能的语法。
答案 0 :(得分:13)
Simon Peyton Jones和Jean-Marc-Erby将金融合约优雅地模仿为DSL。嵌入在Haskell中的DSL显示在文章How to write a financial contract中。
答案 1 :(得分:8)
您还可以在Martin Fowler的着作中找到有关实施DSL的一般内容(但不是专门针对融资)。
答案 2 :(得分:4)
域特定语言(DSL)最常用于表示金融工具。规范性论文是Simon Peyton Jones'Composing Contracts: an Adventure in Financial Engineering,它代表了在Haskell中使用组合子库的合同。组合方法最突出的用途是LexiFi's MLFi language,它建立在OCaml之上(他们的首席执行官Jean-Marc Eber是撰写合同文件的共同作者)。 Barclay一度抄袭了这种方法并描述了一些额外的好处,例如能够生成人类可读的数学定价公式(Commercial Uses: Going Functional on Exotic Trades)。
用于金融合同的DSL通常使用嵌入在诸如Haskell,Scala或OCaml之类的功能语言中构建。在金融行业中使用函数式编程语言将继续使这种方法具有吸引力。
除了代表金融工具外,DSL还用于金融业:
我在http://www.dslfin.org/resources.html维护了完整的金融DSL论文,演讲和其他资源清单。
如果您想与专业人士和研究金融系统DSL的研究人员会面,10月1日即将在佛罗里达州迈阿密举行的MODELS 2013会议上召开研讨会:http://www.dslfin.org/
答案 3 :(得分:0)
我们致力于使用Fairmat(http://www.fairmat.com)
创建财务评估DSL- 暴露了可用于表达支付和支付依赖关系的DSL -it包含一个扩展模型,用于使用.NET / C#和我们的基础数学库创建新类型的分析和理论动态实现(请参阅https://github.com/fairmat上的一些开源示例
答案 4 :(得分:0)
我认为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非常值得探索。
超越&#34; DSL&#34;范式我建议我们需要来自其他一些强有力范例的贡献,以便在满足“大数据”的同时,有一个完整的方式来表示金融工具和金融合约的复杂语义。现实。
值得回顾一下这里提到的一些语言:http://www.dslfin.org/resources.html