문제

같이 일한 사람 있어? DSL(도메인 특정 언어) 금융 분야에서요?제가 작업 중인 애플리케이션에 일종의 DSL 지원을 도입할 계획이며 몇 가지 아이디어를 공유하고 싶습니다.

나는 가장 안정적인 도메인 요소가 무엇인지 식별하고 DSL로 더 잘 구현될 기능을 선택하는 단계에 있습니다.아직 이 첫 번째 기능에 대한 구문을 정의하지 않았습니다.

도움이 되었습니까?

해결책

Jay Fields와 Obie Fernandez는 이 주제에 대해 광범위하게 글을 쓰고 이야기했습니다.

또한 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은 금융 상품을 나타내는 것 외에도 다음과 같은 금융 분야에도 사용됩니다.

나는 금융 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" 패러다임을 넘어 "빅 데이터" 현실을 충족시키면서 금융 상품과 금융 계약의 복잡한 의미를 표현하는 완전한 방법을 갖기 위해서는 여러 가지 강력한 패러다임의 기여가 필요하다고 제안합니다.

여기에 언급된 일부 언어를 검토해 볼 가치가 있습니다. http://www.dslfin.org/resources.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top