オプションのバックテストをPythonでしよう!

オプション戦略は、多様すぎるし、やはりバックテストで、どのような市場でどのような挙動になるかを確認しておきたいですよね。有料サービスを使うとなかなか高価ですし、フレキシビリティが少なくて、なかなか難しいものです。

OptionsDXというサイトで、2010-2023年までのSPXやSPYなどの一日の最後のオプションの値段が無料で公開されていることが、わかりました。しかも多少の料金を払えば、分足や30分足のデータも買えるようです。今日は、これを使って、オプションのバックテストをするプログラムを作ってみましょう。

Free Historical Options Trading Data - optionsDX

まずは、ダウンロードしてください。1年ごとにデータを0ドルで購入していきます。ダウンロードしたファイルは、SPXやVIXなど、ティッカーの名前のついたフォルダにいれましょう。

次に、下のプログラムを動かすと、すべてのファイルを読み取って1つのファイルにしてセーブします。プログラムは、SPXのフォルダがおいてあるフォルダにおいてください。SPXのフォルダの中に入ったすべてのファイルを読み込んで、spx_filesというフォルダにテンポラリーファイルを作り、最後に、spx_all_data.csvというエクセルフォーマットにしてセーブします。特殊ライブラリとして、解凍用プログラムのpy7zrがいるので、pipを使ってインストールしてください。

pip install py7zr

以下がデータ解凍+成形プログラムです。SPXフォルダのあるフォルダに入れてください。このプログラムは、extract_spx_file.pyという名前にしておきます。最初のバージョンから改良してかなり早くなりました。

# -*- coding: utf-8 -*-
"""
Created on Sun Aug 25 08:20:20 2024

@author: Lune2121

options/extract_spx_file.py
"""
import pandas as pd
import os
import py7zr

ticker_name = 'SPX'
dir_name = f'./{ticker_name}/'
extracted_files_folder = f'./{ticker_name.lower()}_files/'
final_filename = f'./{ticker_name.lower()}_all_data.csv'
data_files = os.listdir(dir_name)
#%%

for data_file in data_files:
    with py7zr.SevenZipFile(dir_name+data_file, mode='r') as archive:
        file_list = archive.getnames()
        print(file_list)
        archive.extractall(path = extracted_files_folder)
        

#%%
dir_name = extracted_files_folder
files = os.listdir(dir_name)

all_text = ''
for i, file in enumerate(files):
    file_name = dir_name + file
    print(file_name)
    with open(file_name, 'r') as f:
        text1 = f.read()
    n1 = text1.find('\n')
    rest1 = text1[n1+1:]
    if i == 0:
        l1 = text1[:n1].replace('[', '').replace(']', '').replace(' ', '').lower()
        with open(final_filename, 'w') as f2:
            f2.write(l1 + '\n' + rest1)
    else:
        with open(final_filename, 'a') as f2:
            f2.write(rest1)


プログラムの使い方

ファイルの置いてあるフォルダから、コマンドラインを立ち上げ、下のようにタイプすると、プログラムが走ります。

python extract_spx_file.py

同じフォルダに、spx_all_data.csvというファイルができているのを確認してください。

ちなみに、私はSpyderという無料のIDE(統合開発環境)が気に入っています。ファイルを開いて、グリーンの三角のボタンを押すと、プログラムが走ります。VS_Codeでも同じようにできると思います。

バックテストのプログラム

次に、バックテストのプログラムを書きます。プログラムでは、コールスプレッド戦略の例を出していますが、最初の設定を書き換えれば、基本的にはどんな戦略でもバックテストできると思います。いまのところ、ポジションを1セットのみをオープンし、クローズした段階で次のポジションをいれる”Sequential”な戦略のみとなっています。現実的にはほとんどの人はこの方法でいくのではないでしょうか。終日データだけですが、満期までの期間が30日などの戦略では、これで十分だと思います。

デルタ50-15のロングコールスプレッド戦略の例
期間: 2010-01-04 - 2023-12-29
勝率:67.8%
183勝87負 勝平均 $2153.9 負平均 $-2999.0
プロフィットファクター 1.51
最終利益: $133246.5
最大ドローダウン 24.6% (SPX: 33.9%)
デルタ30-15-5のロングコールバタフライ戦略の例
期間: 2010-01-04 - 2023-12-29
勝率:72.5% 208勝79負
勝平均 $425.9 負平均 $-652.8
プロフィットファクター 1.72
最終利益: $37025.0
最大ドローダウン 16.8% (SPX: 33.9%)
デルタ30-15-のロングコールバタフライで、3番目のストライクは左右の幅が同じになるように選んだ場合。
期間: 2010-01-04 - 2023-12-29
勝率:69.4% 193勝85負 勝平均 $451.7 負平均 $-651.5
プロフィットファクター 1.57
最終利益: $31809.5
最大ドローダウン 26.8% (SPX: 33.9%)
デルタ25‐5のショートプットスプレッド戦略の例
期間: 2010-01-04 - 2023-12-29
勝率:59.3% 143勝98負
勝平均 $1851.8 負平均 $-1828.5
プロフィットファクター 1.48
最終利益: $85613.5
最大ドローダウン 35.8% (SPX: 33.9%)

ヤフーファイナンスからもデータを取得しているので、インストールしてください。

pip install yfinance

バックテスト用Pythonコード

下のような出だしになっています。上で作ったプログラムと同じフォルダにいれてください。

すみませんけど、実際のプログラムは有料とさせていただきます。


ここから先は

9,659字

¥ 4,900

この記事が気に入ったらチップで応援してみませんか?