Avalie as opções de Monte Carlo Clojure

Olá! Meu nome é Roma, trabalho como desenvolvedor iOS na Exness. Além disso, escrevo em Clojure e invisto.


Hoje vou falar sobre como avaliar opções. Este é um artigo introdutório e é improvável que você possa ganhar um milhão usando o método proposto. No entanto, essa é uma boa base para entender métodos de avaliação mais complexos.



Clojure


Clojure?


, , .


, Clojure JVM, , , Java.


, REPL. Clojure, Jupyter Notebook . IDE .



, , – . , - :


(defn call-option-value [security-price strike-price]
    (Math/max (- security-price strike-price) 0))

;; examples
(call-option-value 360.0 280.0) 
=> 80.0
(call-option-value 10.0 280.0) 
=> 0.0

, . , - .


: , , , .


Clojure :


(-> (get-possible-outcomes) mean present-value))

-, :


(-> (repeatedly n simulate-outcome) mean present-value)))

-


, . .


, :


(defn gbm-step [price dt rate volatility]
  (let [drift (* price rate dt)
        shock (* price volatility (Math/sqrt dt) (gaussian))
        change (+ drift shock)]
    (+ price change)))

;; next day price    
(gbm-step 1200 1/365 0.01 0.15)
=> 1207.554940519062

, , . .


, iterate .


Apple ($257) 100 :


(take 100 (iterate #(gbm-step % 1/365 0.01 0.15) 257))
=>
(257
 258.6727911540819
 256.91541924148663
 252.98034966342195
 251.1008036685261
 ...

10 , :



, , :


(defn simulate-outcome [price strike rate volatility expiration]
  (let [steps 100
        dt (/ expiration steps)
        prices (iterate #(gbm-step % dt rate volatility) price)
        price-at-expiration (last (take steps prices))]
    (call-option-value price-at-expiration strike)))

;; simulate 5 outcomes for one option
(repeatedly 5 #(simulate-outcome 1924 1925 0.01 0.45 0.5))
=> (0.0 730.6715047778875 329.1915857113486 0.0 0.0)

. , , , 1.


, :


(defn evaluate-call-option [& {:keys [security-price strike-price risk-free-rate volatility expiration]}]
  (let [expiration (year-fraction-until expiration)
        simulate-fn (partial simulate-outcome security-price strike-price risk-free-rate volatility expiration)
        n 1000]
    (-> (repeatedly n simulate-fn) mean (present-value risk-free-rate expiration))))

;; example    
(evaluate-call-option
  :security-price 1924
  :strike-price 1925
  :risk-free-rate 0.01
  :volatility 0.45
  :expiration (LocalDate/of 2020 4 17))
=> 74.66533445636996

Amazon 2100 2140 17 :


(for [strike (range 2100 2150 10)]
  (evaluate-call-option
     :security-price 1987
     :strike-price strike
     :risk-free-rate 0.01
     :volatility 0.35
     :expiration (LocalDate/of 2020 4 17)))
=> (23.9 21.1 16.4 15.5 15.3)

:


=> (22.9 20.6 18.35 16.4 14.6 13.6)

, .



. . , - cljfx .




All Articles