期權
嘗試編寫 Haug 的 4.19.7 雙屏障二進制不對稱
下面的 Clojure 程式碼正確輸出了“期權定價公式完整指南”第 4.19.6 節中的表格,但我對 4.19.7 中的不對稱非常不滿意。
(defn double-barrier-binary [S L U T r b v asymmetric?] (let [R 1 Z (Math/log (/ U L)) v-sq (Math/pow v 2) term (- (/ (* 2 b) v-sq) 1) alpha (* -0.5 term) beta (- (* -0.25 (Math/pow term 2)) (* 2 (/ r v-sq))) N 100] (loop [i 1 result 0] (let [i-pi (* i Math/PI) i-pi-Z (/ i-pi Z) i-pi-Z-sq (Math/pow i-pi-Z 2) log-s-l (Math/log (/ S L)) sin-pi-log (Math/sin (* i-pi-Z log-s-l)) exp-term (Math/exp (* -0.5 (* (- i-pi-Z-sq beta) (* v-sq T))))] (case asymmetric? true (if (= N i) (float (* R (Math/pow (/ S L) alpha) result)) (let [i-pi-2 (/ 2 i-pi) t-top (- beta (* i-pi-Z-sq exp-term)) t-btm (- i-pi-Z-sq beta) log-Z (- 1 (/ log-s-l Z))] (recur (inc i) (+ result (* i-pi-2 (/ t-top t-btm) sin-pi-log) log-Z)))) false (if (= N i) (float result) (let [K 10 i-pi-K-Z (/ (* 2 i-pi K) (Math/pow Z 2)) sla (Math/pow (/ S L) alpha) sua (Math/pow (/ S U) alpha) neg-1-i (Math/pow -1 i) t-top (- sla (* neg-1-i sua)) t-btm (+ (Math/pow alpha 2) i-pi-Z-sq)] (recur (inc i) (+ result (* i-pi-K-Z (/ t-top t-btm) sin-pi-log exp-term)))))))))) (letfn [(nk [L H v] (double-barrier-binary 100 L H 0.25 0.05 0.03 v false))] (println (map (fn [v] (str "\n" (mapv #(nk (first v) (second v) %) [0.1 0.2 0.3 0.5]))) [[80 120] [85 115] [90 110] [95 105]])))
要嘗試上述操作,請粘貼到https://repl.it/languages/clojure的左側面板並點擊“執行”。如果有人有工作程式碼(任何語言都可以),我將不勝感激,因為我看不出我是如何錯誤地解釋了不對稱公式的。
回答我自己的問題 - 我似乎無法正確閱讀公式。決賽 $$ \left( 1 - \dfrac{ln(S/L)}{Z} \right) $$ Haug 的第 181 頁底部的術語僅在迭代結束時添加一次,而不是在每個循環中添加。惠的原作也有類似的括號。我假設方括號每次都包含它。所以回到我的數學課上。修改後的程式碼(Clojure 再次為那些(很少?)在這個領域中使用它的人,尚未完成收斂檢查):
(defn double-barrier-binary [S L U T r b v asymmetric?] (let [R 10 Z (Math/log (/ U L)) v-sq (Math/pow v 2) term (- (/ (* 2 b) v-sq) 1) alpha (* -0.5 term) beta (- (* -0.25 (Math/pow term 2)) (* 2 (/ r v-sq))) log-s-l (Math/log (/ S L)) log-Z (- 1 (/ log-s-l Z)) N 100] (loop [i 1 result 0] (let [i-pi (* i Math/PI) i-pi-Z (/ i-pi Z) i-pi-Z-sq (Math/pow i-pi-Z 2) sin-pi-log (Math/sin (* i-pi-Z log-s-l)) exp-term (Math/exp (* -0.5 (* (- i-pi-Z-sq beta) (* v-sq T))))] (case asymmetric? true (if (= N i) (float (* R (Math/pow (/ S L) alpha) (+ result log-Z))) (let [i-pi-2 (/ 2 i-pi) t-top (- beta (* i-pi-Z-sq exp-term)) t-btm (- i-pi-Z-sq beta)] (recur (inc i) (+ result (* i-pi-2 (/ t-top t-btm) sin-pi-log))))) false (if (= N i) (float result) (let [K 10 i-pi-K-Z (/ (* 2 i-pi K) (Math/pow Z 2)) sla (Math/pow (/ S L) alpha) sua (Math/pow (/ S U) alpha) neg-1-i (Math/pow -1 i) t-top (- sla (* neg-1-i sua)) t-btm (+ (Math/pow alpha 2) i-pi-Z-sq)] (recur (inc i) (+ result (* i-pi-K-Z (/ t-top t-btm) sin-pi-log exp-term))))))))))