DSLs (اللغات الخاصة بالمجال) في مجال التمويل
سؤال
وقد عملت مع أي شخص DSL (اللغات الخاصة بالمجال) في المجال المالي؟أخطط لتقديم نوع ما من دعم DSL في التطبيق الذي أعمل عليه وأرغب في مشاركة بعض الأفكار.
أنا في مرحلة تحديد عناصر النطاق الأكثر استقرارًا واختيار الميزات التي يمكن تنفيذها بشكل أفضل باستخدام خط المشترك الرقمي (DSL).لم أقم بعد بتعريف بناء الجملة لهذه الميزة الأولى.
المحلول
لقد كتب جاي فيلدز وأوبي فرنانديز وتحدثا بشكل موسع حول هذا الموضوع.
- مقدمة جاي فيلدز اللغات الخاصة بالمجال
- سلسلة جاي فيلدز على اللغة الطبيعية للأعمال
- أوبي فرنانديز التعبير عن شروط العقد في DSL
- جيد جدا عرض تقديمي على infoQ بواسطة جاي فيلدز
ستجد أيضًا أشياء عامة حول تنفيذ DSL في كتابات مارتن فاولر (ولكنها ليست خاصة بالتمويل).
نصائح أخرى
تم تصميم العقود المالية بشكل أنيق على أنها DSL بواسطة سيمون بيتون جونز وجان مارك إربي.يتم عرض DSL الخاص بهم، المضمن في Haskell، في الورقة كيفية كتابة عقد مالي.
تُستخدم اللغات الخاصة بالمجال (DSL) بشكل شائع لتمثيل الأدوات المالية.الورقة الأساسية هي ورقة سيمون بيتون جونز تأليف العقود:مغامرة في الهندسة المالية والذي يمثل العقود باستخدام مكتبة مجمعة في هاسكل.الاستخدام الأبرز لنهج المجمّع هو لغة MLFi الخاصة بـ LexiFi, ، والتي تم بناؤها على رأس OCaml (رئيسها التنفيذي، جان مارك إيبر، هو مؤلف مشارك في ورقة Composition Contracts).وقد قامت شركة باركليز في وقت ما بنسخ هذا النهج ووصفت بعض الفوائد الإضافية، مثل القدرة على توليد صيغ تسعير رياضية يمكن قراءتها بواسطة الإنسان (الاستخدامات التجارية:العمل على الصفقات الغريبة).
عادةً ما يتم إنشاء DSLs للعقود المالية باستخدام التضمين في لغة وظيفية مثل Haskell أو Scala أو OCaml.وسيستمر استيعاب لغات البرمجة الوظيفية في الصناعة المالية في جعل هذا النهج جذابًا.
بالإضافة إلى تمثيل الأدوات المالية، تُستخدم DSLs أيضًا في التمويل من أجل:
- نمذجة الكيانات المالية باللغات الأنطولوجية (الصناعة المالية الأعمال الوجودية)
- استبدال الحسابات الموصوفة عادةً باستخدام جداول البيانات (http://doi.acm.org/10.1145/1411204.1411236)
- نمذجة خطط التقاعد (دراسة الحالة:الخدمات المالية)
- تحليل بيانات السوق المالية (لغة القنفذ)
أحتفظ بقائمة كاملة من أوراق DSL المالية والمحادثات والموارد الأخرى في http://www.dslfin.org/resources.html.
إذا كنت ترغب في مقابلة محترفين وباحثين يعملون مع DSLs للأنظمة المالية، فهناك ورشة عمل قادمة في الأول من أكتوبر في مؤتمر MODELS 2013 في ميامي، فلوريدا: http://www.dslfin.org/
لقد عملنا على فكرة إنشاء DSL للتقييم المالي مع Fairmat ( http://www.fairmat.com )
-يكشف DSL يمكن استخدامه للتعبير عن عمليات الدفع وتبعيات الدفع -يحتوي على نموذج تمديد لإنشاء أنواع جديدة من التحليلات وتطبيقات الديناميات النظرية باستخدام .NET/ C# مع مكتبة الرياضيات الأساسية لدينا (انظر بعض أمثلة المصدر المفتوح في https://github.com/fairmat
أعتقد أن عمل سيمون بيتون جونز وجان مارك إيبر هو الأكثر إثارة للإعجاب بسبب "تأليف العقود:مغامرة في الهندسة المالية" وكل ما يشتق منها:"ليكسي فاي و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"، أقترح أننا سنحتاج إلى مساهمات من عدد من النماذج القوية الأخرى للحصول على طريقة كاملة لتمثيل الدلالات المعقدة للأدوات المالية والعقود المالية مع تلبية حقائق "البيانات الضخمة".
- البرمجة الاحتمالية: فيجارو, ، ستان، الخ
- تحليلات البيانات الضخمة:آر، سبارك، سبارك آر
- "نسيج بيانات" قابل للتطوير ("ذاكرة خارج الكومة")؛عبر الأجهزة السلعية ولكن أيضًا عبر اللغات): "إطارات البيانات في Spark لعلوم البيانات واسعة النطاق" (يعمل مع R وScala/Java وPython)
- الويب الدلالي:"نماذج المواضيع المالية"والأنطولوجيات.
يستحق مراجعة بعض اللغات المذكورة هنا: http://www.dslfin.org/resources.html