contents

10.3 part 7

2023-01-14

解法の説明

4月末、7月末、9月末、12月末の先渡価格の理論値と実値との差の二乗の和を 関数 g(s, r)で表す。ただし、s は4月初めの現物価格(spot price)、r は金利である。

関数 g を最小とする s、r を Julia のパッケージ Optim を用いて求め、金利 r を推定する。

パッケージ Optim を使用して得られた解を次に示す。rの値は、10.3 で求めた解と上から 5 桁まで一致した。

  s = 403.143573
  r = 0.05002219

code


# 10.3.jl
# 2023-01-14
   
using Optim
using Printf
   
function  g(s, r)
  m = 12
  d1 = 1 / (1 + r / m)
  d2 = 1 / (1 + r / m) ^ 2
  d3 = 1 / (1 + r / m) ^ 3
  d4 = 1 / (1 + r / m) ^ 4
  d5 = 1 / (1 + r / m) ^ 5
  d6 = 1 / (1 + r / m) ^ 6
  d7 = 1 / (1 + r / m) ^ 7
  d8 = 1 / (1 + r / m) ^ 8
  d9 = 1 / (1 + r / m) ^ 9
  f4  = s / d1 + c /d1
  f7  = s / d4 + c * sum([1/d4, 1/d3, 1/d2, 1/d1])
  f9  = s / d6 + c * sum([1/d6, 1/d5, 1/d4, 1/d3, 1/d2, 1/d1])
  f12 = s / d9 + c * sum([1/d9, 1/d8, 1/d7, 1/d6, 1/d5, 1/d4, 1/d3, 1/d2, 1/d1])
  a = [f4 - fapr, f7 - fjul, f9 - fsep, f12 - fdec]
  g = sum(map(x -> x ^ 2, a))
  return g
end
   
#input
c = 20 / 12
fapr = 406.50
fjul = 416.64
fsep = 423.48
fdec = 433.84
   
f(x) = g(x[1], x[2])
x0   = [403, 0.05]
res  = optimize(f, x0)
   
println("手法   ",        Optim.summary(res))
println("最小値g(S, r) ", Optim.minimum(res))
println("最小点[S, r] ",  Optim.minimizer(res))
# eof

output


手法   Nelder-Mead
最小値g(S, r) 2.4590690519382888e-5
最小点[S, r] [403.143573414589, 0.050022193925619796]

Optimを使用するときに参照したWebページ
https://zenn.dev/ohno/articles/2a1dc7d609e5bc

history

2023-01-14 create.