DSL в Финансах

Кто-нибудь из вас когда-либо работал с DSL (Domain Specific Languages) в области финансов? Я планирую представить какую-то поддержку DSL в приложении, над которым я работаю, и хотел бы поделиться некоторыми идеями.

Я нахожусь в стадии определения наиболее стабильных элементов домена и выбора функции, которая будет лучше реализована с помощью dsl. Я еще не определил синтаксис этой первой функции.

Я ценю любые советы

Густаво

Ответ 1

Джей Филдс и Оби Фернандес написали и много говорили об этом.

Вы также найдете общие сведения о внедрении DSL в работах Мартина Фаулера (но не для финансирования).

Ответ 2

Финансовые контракты элегантно моделировались как DSL Саймон Пейтон Джонс и Жан-Марк-Эрби. Их DSL, встроенный в Haskell, представлен в статье Как написать финансовый контракт.

Ответ 3

Языки, специфичные для домена (DSL), чаще всего используются для представления финансовых инструментов. Каноническая статья - Саймон Пейтон Джонс "Составление контрактов: приключение в финансовой инженерии" , в котором представлены контракты с использованием библиотеки комбинаторов в Haskell. Наиболее заметным использованием подхода combinator является LexiFi MLFi language, который построен на вершине OCaml (их генеральный директор, Жан-Марк Эбер, является соавтором статьи "Составляющие контракты" ). Barclay в какой-то момент скопировал подход и описал некоторые дополнительные преимущества, такие как способность генерировать удобочитаемые математические формулы ценообразования (Коммерческое использование: Функционирование на экзотических сделках).

DSL для финансовых контрактов обычно строятся с использованием встраивания в функциональный язык, такой как Haskell, Scala или OCaml. Поглощение языков функционального программирования в финансовой отрасли будет по-прежнему привлекать этот подход.

Помимо представления финансовых инструментов, DSL также используются в финансах для:

Я поддерживаю полный список финансовых документов DSL, переговоров и других ресурсов на http://www.dslfin.org/resources.html.

Если вы хотите встретиться с профессионалами и исследователями, работающими с DSL для финансовых систем, состоится 1-й семинар, который состоится 1 октября на конференции MODELS 2013 в Майами, штат Флорида: http://www.dslfin.org/

Ответ 4

Мы работали над идеей создания финансовой оценки DSL с Fairmat (http://www.fairmat.com)

-it предоставляет DSL, который может использоваться для выражения выигрышей и зависимостей платежей -it содержит модель расширения для создания новых типов аналитических и реализаций теоретической динамики с использованием .NET/С# с нашей базовой математической библиотекой (см. некоторые примеры с открытым исходным кодом в https://github.com/fairmat

Ответ 5

Я думаю, что работа Саймона Пейтона Джонса и Жан Марка Эбера является самой впечатляющей из-за "Сочетания контрактов: приключение в финансовой инженерии" и все, что вытекает из этого: " LexiFi и MLFi".

Найдено реализация Scala Shahbaz Chaudhary, наиболее привлекательная, учитывая, что MLFi обычно недоступен (а поскольку 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