Last active
October 22, 2015 13:39
-
-
Save lildata/600624a9869665fddd95 to your computer and use it in GitHub Desktop.
As described here : https://falconair.github.io/2015/01/30/composingcontracts.html
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| def usd(amount) = Scale(Const(amount),One("USD")) | |
| def stock(symbol) = Scale(Lookup(symbol),One("USD")) | |
| def buy(contract, amount) = And(contract,Give(usd(amount))) | |
| def sell(contract, amount) = And(Give(contract),usd(amount)) | |
| def zcb(maturity, notional, currency) = When(maturity, Scale(Const(notional),One(currency))) | |
| def option(contract) = Or(contract,Zero()) | |
| def europeanCallOption(at, c1, strike) = When(at, option(buy(c1,strike))) | |
| def europeanPutOption(at, c1, strike) = When(at, option(sell(c1,strike))) | |
| def americanCallOption(at, c1, strike) = Anytime(at, option(buy(c1,strike))) | |
| def americanPutOption(at, c1, strike) = Anytime(at, option(sell(c1,strike))) | |
| package ComposingContracts { | |
| sealed trait Contract | |
| case class Zero() extends Contract | |
| case class One(currency: String) extends Contract | |
| case class Give(contract: Contract) extends Contract | |
| case class And(contract1: Contract, contract2: Contract) extends Contract | |
| case class Or(contract1: Contract, contract2: Contract) extends Contract | |
| case class Cond(cond: Obs[Boolean], contract1: Contract, contract2: Contract) extends Contract | |
| case class Scale(scale: Obs[Double], contract: Contract) extends Contract | |
| case class When(date: LocalDate, contract: Contract) extends Contract | |
| case class Anytime(date: LocalDate, contract: Contract) extends Contract | |
| abstract class Obs[A] { | |
| def +(that: Obs[A])(implicit n: Numeric[A]): Obs[A] = Lift2(n.plus, this, that) | |
| def -(that: Obs[A])(implicit n: Numeric[A]): Obs[A] = Lift2(n.minus, this, that) | |
| ... | |
| } | |
| case class Const[A](k: A) extends Obs[A] | |
| case class Lift[B, A](lifted: (B) => A, o: Obs[B]) extends Obs[A] | |
| case class Lift2[C, B, A](lifted: (C, B) => A, o1: Obs[C], o2: Obs[B]) extends Obs[A] | |
| case class DateObs() extends Obs[LocalDate] | |
| case class Lookup[A](lookup: String) extends Obs[Double] | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
