module Q.Payoff where
import Q.Types
import Q.Time
class Payoff a where
payoff :: (Obs1 b) => a
-> b
-> Cash
data StrikedPayoff =
PlainVanillaPayoff
OptionType
Strike
| PercentagePayoff
OptionType
Strike
| AssetOrNothingPayoff
OptionType
Strike
| CashOrNothingPayoff
OptionType
Strike
Cash
instance Payoff StrikedPayoff where
payoff :: StrikedPayoff -> b -> Cash
payoff (PlainVanillaPayoff OptionType
cp (Strike Double
k)) b
obs = Double -> Cash
Cash (Double -> Cash) -> Double -> Cash
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Double
forall a. Ord a => a -> a -> a
max ((OptionType -> Double
forall p. Num p => OptionType -> p
cpi OptionType
cp) Double -> Double -> Double
forall a. Num a => a -> a -> a
* (Double
s Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
k)) Double
0 where
s :: Double
s = b -> Double
forall a. Obs1 a => a -> Double
get1 b
obs
payoff (PercentagePayoff OptionType
cp (Strike Double
k)) b
_ = Double -> Cash
Cash (Double -> Cash) -> Double -> Cash
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Double
forall a. Ord a => a -> a -> a
max ((OptionType -> Double
forall p. Num p => OptionType -> p
cpi OptionType
cp) Double -> Double -> Double
forall a. Num a => a -> a -> a
* (Double
1 Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
k)) Double
0
payoff (AssetOrNothingPayoff OptionType
cp (Strike Double
k)) b
obs
| (OptionType -> Double
forall p. Num p => OptionType -> p
cpi OptionType
cp) Double -> Double -> Double
forall a. Num a => a -> a -> a
* (Double
s Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
k) Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
> Double
0 = Double -> Cash
Cash (Double -> Cash) -> Double -> Cash
forall a b. (a -> b) -> a -> b
$ Double
s
| Bool
otherwise = Double -> Cash
Cash (Double -> Cash) -> Double -> Cash
forall a b. (a -> b) -> a -> b
$ Double
0
where s :: Double
s = b -> Double
forall a. Obs1 a => a -> Double
get1 b
obs
payoff (CashOrNothingPayoff OptionType
cp (Strike Double
k) (Cash Double
amount)) b
obs
| (OptionType -> Double
forall p. Num p => OptionType -> p
cpi OptionType
cp) Double -> Double -> Double
forall a. Num a => a -> a -> a
* (Double
s Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
k) Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
> Double
0 = Double -> Cash
Cash (Double -> Cash) -> Double -> Cash
forall a b. (a -> b) -> a -> b
$ Double
amount
| Bool
otherwise = Cash
0
where s :: Double
s = b -> Double
forall a. Obs1 a => a -> Double
get1 b
obs