オプション両側売りを自動売買で(デルタニュートラル目標)

岡三RSSで完全自動売買エクセルシートを作成して、オプション両側売りを継続します。バックテスト結果に基づき、デルタが概ねニュートラルになるポジションを維持します。売り枚数はコール、プットともに一枚。証拠金は100万円程度で、月3万円の収益を目指します。

バックテスト1(オプション両側売り、ATMからいくら離れた権利行使価格を売る。)

トレードを開始するにあたり、簡単なバックテストを実施。

結論としては、1日あたりの平均損益は、2514円。もっとイン側を両建てすれば、1日あたり平均損益を向上させることは可能だが、まずは保守的に、、

日経平均の8/1終値から8/6終値まで一気に1000円下げたところも入っているので、まあ、きわめて短い期間のバックテストではあるものの、ストレスかかった局面も入っているので、これで自分を納得させる。

ただ、このバックテストとは別に、極端な暴落は怖いので、実トレードでは、下がった局面ではガンマはロングになるようにプットのDOTMを定期的に仕込むことも平行して行う。

 

<バックテストルール>

トレード対象:201909限のコール、プット

権利行使価格の選択:

コールは、cATM+1500円

プットは、pATM-3000円

ただし、各ATMは、日経平均終値を250円刻みで、コール側は上に丸めて、プット側は下に丸めている。

ポジションのロール方法:毎営業日の大引け時点で、上記のルールに従ったポジションを作成、次の大引けまで維持、を繰り返す。

 

<バックテスト結果>

1日あたりの平均損益は、2514円。日経平均が下落しているが、これと関係なく、損益はなんとか右肩上がりに。途中の日経暴落局面では損益は悪化。

f:id:opdelta:20190821190913p:plain

デルタは、0~-0.14と、若干ショート気味の結果。日経平均が下落しているので、このデルタだとバックテストは良好に作用するのだが、まあ良しとする。

 

デルタ計算方法:過去のオプションプレミアムはRSSより取得できるので、各営業日の残存日数、IVをもとめて、デルタを計算。 

f:id:opdelta:20190821190950p:plain

IVとデルタの計算仕様は以下の通り。 


IV計算式(コール):

Function callIV(原資産価格, 権利行使価格, 残存日数, 金利, 配当, プレミアム As Double) As Double
年率日数 = 残存日数 / 365
金利割引率 = Exp(-金利 * 年率日数)
配当割引率 = Exp(-配当 * 年率日数)
仮ボラ = Application.Max(Sqr(Abs(2 * Application.Ln(原資産価格 / 権利行使価格) / 年率日数 + 金利 - 配当)), 0.1)
i = 0
Do
If i >= 10 Then Exit Do
ループボラ = 仮ボラ
i = i + 1
d1 = (Application.Ln(原資産価格 / 権利行使価格) + (金利 - 配当 + 仮ボラ ^ 2 / 2) * 年率日数) / (仮ボラ * 年率日数 ^ 0.5)
d2 = d1 - 仮ボラ * 年率日数 ^ 0.5
nd1 = Application.NormSDist(d1)
nd2 = Application.NormSDist(d2)
コール理論価格 = (原資産価格 * nd1 * 配当割引率 - 権利行使価格 * nd2 * 金利割引率)
ベガ = (年率日数 / (2 * Application.Pi())) ^ (1 / 2) * 配当割引率 * 原資産価格 * Exp(-0.5 * d1 ^ 2)
仮ボラ = ループボラ - (コール理論価格 - プレミアム) / ベガ
Loop While Abs(仮ボラ - ループボラ) > 0.000001
callIV = 仮ボラ
End Function

 

IV計算式(プット):

Function putIV(原資産価格, 権利行使価格, 残存日数, 金利, 配当, プレミアム As Double) As Double
年率日数 = 残存日数 / 365
金利割引率 = Exp(-金利 * 年率日数)
配当割引率 = Exp(-配当 * 年率日数)
仮ボラ = Application.Max(Sqr(Abs(2 * Application.Ln(原資産価格 / 権利行使価格) / 年率日数 + 金利 - 配当)), 0.1)
i = 0
Do
If i >= 10 Then Exit Do
ループボラ = 仮ボラ
i = i + 1
d1 = (Application.Ln(原資産価格 / 権利行使価格) + (金利 - 配当 + 仮ボラ ^ 2 / 2) * 年率日数) / (仮ボラ * 年率日数 ^ 0.5)
d2 = d1 - 仮ボラ * 年率日数 ^ 0.5
nd1 = Application.NormSDist(d1)
nd2 = Application.NormSDist(d2)
プット理論価格 = -原資産価格 * (1 - nd1) * 配当割引率 + 権利行使価格 * (1 - nd2) * 金利割引率
ベガ = (年率日数 / (2 * Application.Pi())) ^ (1 / 2) * 配当割引率 * 原資産価格 * Exp(-0.5 * d1 ^ 2)
仮ボラ = ループボラ - (プット理論価格 - プレミアム) / ベガ
Loop While Abs(仮ボラ - ループボラ) > 0.000001
putIV = 仮ボラ
End Function

  

デルタ計算式(コール側):

Function DCALL(原資産価格, 権利行使価格, 残存日数, ボラ, 金利, 配当 As Double) As Double
年率日数 = 残存日数 / 365
金利割引率 = Exp(-金利 * 年率日数)
配当割引率 = Exp(-配当 * 年率日数)
d1 = (Application.Ln(原資産価格 / 権利行使価格) + (金利 - 配当 + ボラ ^ 2 / 2) * 年率日数) / (ボラ * 年率日数 ^ 0.5)
d2 = d1 - ボラ * 年率日数 ^ 0.5
nd1 = Application.NormSDist(d1)
nd2 = Application.NormSDist(d2)
DCALL = 配当割引率 * nd1
End Function

 

デルタ計算式(プット側):

Function DPUT(原資産価格, 権利行使価格, 残存日数, ボラ, 金利, 配当 As Double) As Double
年率日数 = 残存日数 / 365
金利割引率 = Exp(-金利 * 年率日数)
配当割引率 = Exp(-配当 * 年率日数)
d1 = (Application.Ln(原資産価格 / 権利行使価格) + (金利 - 配当 + ボラ ^ 2 / 2) * 年率日数) / (ボラ * 年率日数 ^ 0.5)
d2 = d1 - ボラ * 年率日数 ^ 0.5
nd1 = Application.NormSDist(d1)
nd2 = Application.NormSDist(d2)
DPUT = 配当割引率 * (nd1 - 1)
End Function