DSL (Языки, специфичные для конкретной предметной области) в сфере финансов
Вопрос
Кто-нибудь работал с DSL (Языки, специфичные для конкретной области) в области финансов?Я планирую внедрить некоторую поддержку DSL в приложение, над которым я работаю, и хотел бы поделиться некоторыми идеями.
Я нахожусь на стадии определения наиболее стабильных элементов домена и выбора функций, которые были бы лучше реализованы с DSL.Я еще не определил синтаксис для этой первой функции.
Решение
Джей Филдс и Оби Фернандес много писали и обсуждали эту тему.
- Вступление Джея Филдса к Языки, специфичные для конкретной предметной области
- Серия статей Джея Филдса о Естественный деловой язык
- Obie Fernandez Выражение Условий Контракта в DSL
- Очень хороший презентация по информации Джея Филдса
Вы также найдете общие сведения о внедрении DSL в работах Мартина Фаулера (но не относящиеся конкретно к финансам).
Другие советы
Саймон Пейтон Джонс и Жан-Марк Эрби элегантно смоделировали финансовые контракты в виде DSL.Их DSL, встроенный в Haskell, представлен в статье Как составить финансовый контракт.
Языки, зависящие от предметной области (DSL), чаще всего используются для представления финансовых инструментов.Каноническая статья Саймона Пейтона Джонса Составление Контрактов:приключение в финансовой инженерии который представляет контракты с использованием библиотеки комбинаторов в Haskell.Наиболее заметным применением комбинаторного подхода является Язык MLFi от LexiFi, который построен поверх OCaml (их генеральный директор Жан-Марк Эбер является соавтором документа Composing Contracts).В какой-то момент Barclay's скопировал этот подход и описал некоторые дополнительные преимущества, такие как возможность генерировать понятные человеку математические формулы ценообразования (Коммерческое использование:Становление функциональным на Экзотических торгах).
DSL для финансовых контрактов обычно создаются с использованием встраивания в функциональный язык, такой как Haskell, Scala или OCaml.Внедрение функциональных языков программирования в финансовую индустрию будет продолжать делать этот подход привлекательным.
В дополнение к представлению финансовых инструментов, DSL также используются в финансах для:
- Моделирование финансовых объектов с помощью языков онтологий (Бизнес-онтология Финансовой индустрии)
- Замена вычислений, обычно описываемых с использованием электронных таблиц (http://doi.acm.org/10.1145/1411204.1411236)
- Моделирование пенсионных планов (Тематическое исследование:Финансовые услуги)
- Анализ данных финансового рынка (Язык Ежа)
Я веду полный список финансовых документов DSLS, докладов и других ресурсов по адресу http://www.dslfin.org/resources.html.
Если вы хотите встретиться с профессионалами и исследователями, работающими с DSL для финансовых систем, 1 октября на конференции MODELS 2013 в Майами, штат Флорида, состоится предстоящий семинар: http://www.dslfin.org/
Мы работали над идеей создания DSL для финансовой оценки совместно с Fairmat ( http://www.fairmat.com )
- он предоставляет DSL, который может быть использован для выражения выплат и платежных зависимостей -он содержит модель расширения для создания новых типов аналитики и реализаций теоретической динамики с использованием .NET / C # с нашей базовой математической библиотекой (см. Некоторые примеры с открытым исходным кодом На https://github.com/fairmat
Я думаю, что работа Саймона Пейтона Джонса и Жан-Марка Эбера наиболее впечатляет из-за "Составления контрактов:приключение в финансовой инженерии" и все, что вытекает из этого:"LexiFi и MLFi".
Найденный Шахбаз Чаудхари Реализация Scala наиболее привлекательна, учитывая, что 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", я полагаю, нам понадобился бы вклад ряда других мощных парадигм, чтобы иметь полный способ представления сложной семантики финансовых инструментов и финансовых контрактов, отвечающий реалиям "больших данных".
- Вероятностное программирование: Figaro, Стэн и т. д
- Аналитика больших данных:R, Искра, ИскраР
- Масштабируемая "структура данных" ("вне кучи памяти";по всему товарному оборудованию, но также на разных языках): "Фреймы данных в Spark для крупномасштабной обработки данных" (работает с R, Scala / Java и Python)
- Семантическая паутина:"Модели финансовой тематики- и онтологии.
Стоит ознакомиться с некоторыми языками, упомянутыми здесь: http://www.dslfin.org/resources.html