문제
같이 일한 사람 있어? DSL(도메인 특정 언어) 금융 분야에서요?제가 작업 중인 애플리케이션에 일종의 DSL 지원을 도입할 계획이며 몇 가지 아이디어를 공유하고 싶습니다.
나는 가장 안정적인 도메인 요소가 무엇인지 식별하고 DSL로 더 잘 구현될 기능을 선택하는 단계에 있습니다.아직 이 첫 번째 기능에 대한 구문을 정의하지 않았습니다.
해결책
Jay Fields와 Obie Fernandez는 이 주제에 대해 광범위하게 글을 쓰고 이야기했습니다.
- Jay Fields 소개 도메인별 언어
- Jay Fields의 시리즈 비즈니스 자연어
- 오비 페르난데스 DSL로 계약 조건 표현
- 아주 좋은 프레젠테이션 Jay Fields의 infoQ에서
또한 Martin Fowler의 글에서 DSL 구현에 대한 일반적인 내용을 찾을 수 있습니다(그러나 금융에 국한된 내용은 아닙니다).
다른 팁
금융 계약은 Simon Peyton Jones와 Jean-Marc-Erby에 의해 DSL로 우아하게 모델링되었습니다.Haskell에 내장된 DSL이 논문에 나와 있습니다. 금융 계약서 작성 방법.
도메인 특정 언어(DSL)는 금융 상품을 나타내는 데 가장 일반적으로 사용됩니다.정식 논문은 Simon Peyton Jones의 논문입니다. 계약 작성:금융 공학의 모험 Haskell에서 결합자 라이브러리를 사용하는 계약을 나타냅니다.결합자 접근 방식의 가장 두드러진 용도는 다음과 같습니다. LexiFi의 MLFi 언어, 는 OCaml을 기반으로 구축되었습니다(CEO인 Jean-Marc Eber는 Composing Contracts 논문의 공동 저자입니다).Barclay's는 한때 이 접근 방식을 복사하고 사람이 읽을 수 있는 수학적 가격 공식을 생성하는 기능과 같은 몇 가지 추가 이점을 설명했습니다(상업적 용도:이국적인 거래에서 기능적으로 활용).
금융 계약을 위한 DSL은 일반적으로 Haskell, Scala 또는 OCaml과 같은 기능적 언어에 임베딩을 사용하여 구축됩니다.금융 산업에서 함수형 프로그래밍 언어의 활용은 이러한 접근 방식을 계속해서 매력적으로 만들 것입니다.
DSL은 금융 상품을 나타내는 것 외에도 다음과 같은 금융 분야에도 사용됩니다.
- 온톨로지 언어를 사용하여 금융 실체 모델링(금융산업 비즈니스 온톨로지)
- 일반적으로 스프레드시트를 사용하여 설명되는 계산 대체(http://doi.acm.org/10.1145/1411204.1411236)
- 연금 계획 모델링(사례 연구:금융 서비스)
- 금융시장 데이터 분석(고슴도치 언어)
나는 금융 DSL 문서, 강연, 기타 리소스의 전체 목록을 다음 사이트에서 관리하고 있습니다. http://www.dslfin.org/resources.html.
금융 시스템용 DSL을 다루는 전문가 및 연구원을 만나고 싶다면 플로리다주 마이애미에서 열리는 MODELS 2013 컨퍼런스에서 10월 1일 워크숍이 예정되어 있습니다. http://www.dslfin.org/
우리는 Fairmat( http://www.fairmat.com )
-지불금 및 지불 종속성을 표현하는 데 사용할 수있는 DSL을 노출시킵니다. 기본 수학 라이브러리와 함께 .NET/ C#을 사용하여 새로운 유형의 분석 및 이론적 역학 구현을위한 확장 모델이 포함되어 있습니다 (일부 오픈 소스 예제 참조. ~에 https://github.com/fairmat
Simon Peyton Jones와 Jean Marc Eber의 작업이 "계약 작성:금융 공학의 모험'과 그로부터 파생된 모든 것:"LexiFi 및 MLFi".
설립하다 샤바즈 초드하리(Shahbaz Chaudhary) 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)
}
}
그만큼 토마스 페트리체크의 훌륭한 작품 F#에서는 탐색할 가치가 매우 높습니다.
"DSL" 패러다임을 넘어 "빅 데이터" 현실을 충족시키면서 금융 상품과 금융 계약의 복잡한 의미를 표현하는 완전한 방법을 갖기 위해서는 여러 가지 강력한 패러다임의 기여가 필요하다고 제안합니다.
- 확률적 프로그래밍: 피가로, 스탠 등
- 빅데이터 분석:R, 스파크, 스파크R
- 확장 가능한 "데이터 패브릭"("오프 힙 메모리";상용 하드웨어 전반에 걸쳐 뿐만 아니라 여러 언어에 걸쳐): "대규모 데이터 과학을 위한 Spark의 DataFrames" (R, Scala/Java 및 Python에서 작동)
- 시맨틱 웹:"금융 주제 모델" 그리고 온톨로지.
여기에 언급된 일부 언어를 검토해 볼 가치가 있습니다. http://www.dslfin.org/resources.html