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