Bewerten Sie die Optionen von Monte Carlo Clojure

Hallo! Mein Name ist Roma, ich arbeite als iOS-Entwickler bei Exness. Außerdem schreibe ich in Clojure und investiere.


Heute werde ich darüber sprechen, wie Optionen bewertet werden können. Dies ist ein Einführungsartikel und es ist unwahrscheinlich, dass Sie mit der vorgeschlagenen Methode eine Million verdienen können. Dies ist jedoch eine gute Grundlage für das Verständnis komplexerer Bewertungsmethoden.



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