forked from evdubs/renegade-way
-
Notifications
You must be signed in to change notification settings - Fork 0
/
pricing-risk.rkt
46 lines (38 loc) · 1.9 KB
/
pricing-risk.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#lang racket/base
(require math/distributions)
(provide black-scholes
black-scholes-delta
black-scholes-gamma
black-scholes-theta
black-scholes-vega
black-scholes-rho)
(define (black-scholes price years-left strike call-put rate vol)
(let* ([d-1 (* (/ 1 (* vol (sqrt years-left)))
(+ (log (/ price strike))
(* (+ rate (/ (* vol vol) 2))
years-left)))]
[d-2 (- d-1 (* vol (sqrt years-left)))]
[pv (* strike (exp (* -1 rate years-left)))])
(cond [(equal? call-put 'Call)
(- (* (cdf (normal-dist) d-1) price)
(* (cdf (normal-dist) d-2) pv))]
[(equal? call-put 'Put)
(- (* (cdf (normal-dist) (* d-2 -1)) pv)
(* (cdf (normal-dist) (* d-1 -1)) price))])))
(define (black-scholes-delta price years-left strike call-put rate vol)
(* (- (black-scholes (+ price 1/100) years-left strike call-put rate vol)
(black-scholes price years-left strike call-put rate vol))
100))
(define (black-scholes-gamma price years-left strike call-put rate vol)
(* (- (black-scholes-delta (+ price 1/100) years-left strike call-put rate vol)
(black-scholes-delta price years-left strike call-put rate vol))
100))
(define (black-scholes-theta price years-left strike call-put rate vol)
(- (black-scholes price (max (+ years-left 1/365) 0) strike call-put rate vol)
(black-scholes price years-left strike call-put rate vol)))
(define (black-scholes-vega price years-left strike call-put rate vol)
(- (black-scholes price years-left strike call-put rate (+ vol 1/100))
(black-scholes price years-left strike call-put rate vol)))
(define (black-scholes-rho price years-left strike call-put rate vol)
(- (black-scholes price years-left strike call-put (+ rate 1/100) vol)
(black-scholes price years-left strike call-put rate vol)))