財務の基本 (3): オプション

1. コールオプションとプットオプション

コール オプションとプット オプションはどちらも取引所で一般的なオプション契約です。

コールオプション(Call Option)とは、将来の一定の時点、または特定のイベントが発生したときに、保有者に原資産を購入する権利を与える権利です。満期日(Expiration Date)に、コールオプションの保有者は、オプションで合意された価格(行使価格、行使価格とも呼ばれます)で原資産を購入するか、オプションを行使しないことを選択できます。

プットオプション(Put Option)とは、将来の特定の時点、または特定のイベントが発生したときに、保有者に原資産を売却する権利を与える権利です。プットオプションを保有している人は、権利行使日にオプションで合意された価格で原資産を売却することも、オプションを行使しないことを選択することもできます。

コール オプションとプット オプションの違いは、行使されたときの動作にあります。コールオプション保有者は、権利行使日に権利行使価格で原資産を購入でき、プットオプション保有者は、権利行使日に権利行使価格で原資産を売却できます。

オプション取引では、コールオプションを保有する人の利益は原資産の価格の上昇に関係し、プットオプションを保有する人の利益は原資産の価格の下落に関係します。コールおよびプット オプションの価格は、通常、権利行使価格、有効期限、ボラティリティ、原資産の価格など、多くの要因の影響を受けます。

オプション取引は、投資家に市場に参加し、リスクを軽減し、利益を確保するための柔軟な方法を提供するため、投資家の間で非常に人気があります。ただし、コールとプットは実際には非常に複雑になる可能性があり、高度な技術的な分析と意思決定が必要になります。投資家はオプション取引の際に慎重な分析と評価を行い、それに伴うすべてのリスクとコストを確実に理解する必要があります。

2. ヨーロッパのオプションとアメリカのオプション

欧州オプションとは、保有者が有効期限(または事前に合意した特定の日)にのみオプションを行使できる権利を指します。つまり、欧州オプションは満期日にのみ行使できます。それまでは、保有者はオプションを行使したり売却したりすることはできません。

対照的に、アメリカンオプションは保有者に大きな柔軟性を与えます。保有者は、有効期限の前後を問わず、いつでもオプションを行使することを選択できます。これは、アメリカンスタイルのオプションの保有者が、市場の状況や個人の利益に基づいてオプションをいつ行使するかを決定できることを意味します。

米国のオプションは柔軟性があるため、一般に欧州のオプションと比較して価値が高くなります。したがって、同じ他の条件の下では、通常、米国のオプションの価格は欧州のオプションの価格よりも高くなります。

ヨーロピアンスタイルのオプションであってもアメリカンスタイルのオプションであっても、その価格設定は原資産価格、権利行使価格、有効期限、ボラティリティ、金利などの多くの要因の影響を受けます。オプショントレーダーと投資家にとって、ニーズとリスク選好度に基づいて正しい意思決定を行うためには、これらのさまざまなオプションタイプの特性と価格設定要因を理解することが重要です。

3. 欧州オプションのレバレッジ比率を計算する

まず、欧州オプションの価格計算式を以下に紹介します。

 

他の記号については次のように説明します。

C : コールオプションの価格

P: プットオプションの価格

S: 対象物の現在の価格

K: 権利行使価格

r:リスクフリーレート

T: 有効期限

\シグマ: 原資産のボラティリティ

N(): 正規分布変数の累積分布関数

上記に基づいて、コールオプションを例にとると、オプション契約のレバレッジ比率を計算できます。

オプション契約を例にとると、オプション価格 C=0.3528、現在価格 S=3.459、行使価格 K=3.3、現在の金利 r=0.022284、契約満了日 t=0.5、ボラティリティ sigma=0.2563 、レバレッジ比率が計算されます。Python コードは次のとおりです。

import numpy as np
from scipy.stats import norm

def call_option_d(s,k,r,t,sigma):
    d1 = (np.log(s / k) + (r + 0.5 * sigma * sigma) * t) / (sigma * np.sqrt(t))
    d2 = d1 - sigma * np.sqrt(t)
    return d1, d2

def call_option_lambda(s,k,r,t,sigma):
    d1, d2 = call_option_d(s,k,r,t,sigma)
    c = s * norm.cdf(d1) - np.exp(-r * t) * k * norm.cdf(d2)
    lamb = norm.cdf(d1) * s / c
    return lamb

sigma = 0.2563
t = 0.5
r = 0.022284
k = 3.3
s = 3.459
c = 0.3528

lamb = call_option_lambda(s,k,r,t,sigma)
print(lamb)

 計算されたレバレッジ比率は 6.4676 です。オプションのレバレッジ比率はさまざまな要因によって影響されますが、制御変数法を使用してレバレッジ比率の変化を体験できます。1 か月、2 か月、3 か月、6 か月を例として、さまざまな満期時点での原資産の現在価格によるレバレッジ比率の変化を計算し、次のように変化グラフを作成します。

図に示すように、満期時間が増加するにつれてレバレッジ比率が徐々に低下していることがわかります。コール オプションの場合、原価が上昇するにつれて、レバレッジ比率は 1 に収束するまで徐々に減少します。逆に、基礎となるオブジェクトの価格が下がると、レバレッジ比率は徐々に増加し、理論的には無限大に達します。ただし、小さな単位が存在するため、無限にはならないもののかなり大きな数になるため、オプション取引の際には注意が必要であり、リスクをコントロールするために契約のレバレッジ比率を把握する必要があります。 。
 

4. 欧州オプションのインプライド・ボラティリティを計算する

実際、ボラティリティは統計的手法によって取得されるのではなく、オプションの価格計算式を現在の価格に代入することによって逆転されるインプライド ボラティリティです。インプライド ボラティリティを求めることは、方程式の解を求めることと同じです。問題は、この方程式には単純な解析解が存在せず、数値的手法を使用するしか解決できないことですが、ここでは二分法を使用してこれを解きます。

まず、仮想通話オプションが作成されます。このうち、現在の原株価と約定価格はともに 10、金利は 2%、満期は 1 年、ボラティリティは 20% です。前のセクションの式を使用すると、理論価格は 0.8916037278572535 と計算できます。

import numpy as np
from scipy.stats import norm

def bs(S, K, T, r, vol,c_p):
    d1 = (np.log(S/K) + (r + 0.5*vol**2)*T) / (vol*np.sqrt(T))
    d2 = d1 - vol * np.sqrt(T)
    if c_p in ['C','c','Call','call','CALL']:
        pv = S * norm.cdf(d1) - np.exp(-r * T) * K * norm.cdf(d2)
        return pv
    elif c_p in ['P','p','Put','put','PUT']:
        pv = np.exp(-r * T) * K * norm.cdf(-d2) - S * norm.cdf(-d1)
        return pv
    else:
        print('Wrong option type!')
        return -1
    
S, K, T, r, vol, c_p = 10,10,1,0.02,0.2,'c'
pv = bs(S, K, T, r, vol,c_p)
print(pv)

次に、変動スペースを設定します。たとえば、次のセッションでは 0.1%、前のセッションでは 1000% を設定し、それぞれ式に代入して、対応するオプション価格を -0.6935904609248063 および 9.108390596166512 として取得します。

vol_0 = 0.001
vol_1 = 10

pv_0 = bs(S, K, T, r, vol_0,c_p)
print(pv_0 - pv)

pv_1 = bs(S, K, T, r, vol_1,c_p)
print(pv_1 - pv)

 最後に二分法で解き、得られたオプション価格と理論価格の差の閾値を0.0001に設定し、両者の差がこの値未満になった時点で反復を終了し、結果を出力します。

vol_0 = 0.001
vol_1 = 10
vol_x = (vol_0+vol_1)/2.0
pv_x = bs(S, K, T, r, vol_x,c_p)
tol = 0.0001
nn = 0
while (np.abs(pv_x - pv)>tol) and (nn<1000):
    pv_x = bs(S, K, T, r, vol_x,c_p)
    if pv_x < pv:
        vol_0 = vol_x
        vol_x = (vol_0+vol_1)/2.0
    else:
        vol_1 = vol_x
        vol_x = (vol_0+vol_1)/2.0
    nn += 1
    print(nn,vol_x)

出力は次のとおりです。

1 2.50075
2 1.250875
3 0.6259374999999999 
4 0.31346874999999996
5 0.15723437499999998
6 0.23535156249999997
7 0.19629296874999996
8 0.21582226562499995
9 0.20605761718749996
10 0.20117529296874997
11 0.19873413085937497
12 0.19995471191406247
13 0.20056500244140624
14 0.20025985717773437
15 0.20010728454589843
16 0.20003099822998044
17 0.19999285507202147
18 0.20001192665100095

18 回の反復後の最終結果は 20.012% となり、真の値 20% に非常に近づきます。

おすすめ

転載: blog.csdn.net/m0_64087341/article/details/131403326