🐡

バイナリーオプションRSIだけで勝てるのか検証する

2023/05/27に公開

テクニカル指標。RSIでバイナリーオプションをしたらどうなる?勝てるのか検証する。

方法

RSIを計算してPythonで勝率をだす。

始まりはいつもこのコードです。

import pandas as pd
import MetaTrader5 as mt5
from datetime import timedelta

# MT5への接続
mt5.initialize()

# 読み込む通貨ペアと時間枠、データの件数を指定
symbol = 'USDJPYm'
timeframe = mt5.TIMEFRAME_M5
count = 100000

# データの取得
rates = mt5.copy_rates_from_pos(symbol, timeframe, 0, count)

# DataFrameに変換
df = pd.DataFrame(rates)

# 日時をPandasの日時形式に変換し、GMT+9に変換
df['time'] = pd.to_datetime(df['time'], unit='s') + timedelta(hours=9)

print(df)

ChatGPTに上記のコードをコピペして読んでもらう

ChatGPTにテクニカル指標のRSIの計算のコードを書いてもらう


プロンプト1

  • talibでRSIを計算して同じテーブルのカラムに追加せよ
  • timeのカラムを主キーにしてもう一度書いてください

1個先をつくるとバイナリーオプションのバックテストに使えるよ。1個先なら5分後ですね。

70ならSELL
30ならBUY
の逆張りしてみます。

プロンプト2

next_close - next_open > 0 なら 値"up"を、
next_close - next_open < 0 なら 値"down"を、
next_close - next_open == 0 なら 値"zero"を

入れる新しいカラムを追加してください

1個前のRSI < 70 and 現在ののRSI >= 70 なら"BUY"
1個前のRSI > 30 and 現在ののRSI <= 30 なら"SELL"
それ以外はNaNの列を追加してください

プロンプト3

  • rsi next_close next_open change actionを追加するコードを全文でください

プロンプト4

まずは
action ==BUYとaction ==SELL以外を抽出して新しいデータフレームを作成してください。
同じ行の
(action == 'BUY') and (change == 'up')
の確率と、
(action == 'SELL') and (change == 'down')
の確率を表示してください

コード全文

import pandas as pd
import MetaTrader5 as mt5
import talib
from datetime import timedelta

# MT5への接続
mt5.initialize()

# 読み込む通貨ペアと時間枠、データの件数を指定
symbol = 'USDJPYm'
timeframe = mt5.TIMEFRAME_M5
count = 100000

# データの取得
rates = mt5.copy_rates_from_pos(symbol, timeframe, 0, count)

# DataFrameに変換
df = pd.DataFrame(rates)

# 日時をPandasの日時形式に変換し、GMT+9に変換
df['time'] = pd.to_datetime(df['time'], unit='s') + timedelta(hours=9)

# RSIの計算と列の追加
rsi_period = 14
df['rsi'] = talib.RSI(df['close'], timeperiod=rsi_period)

# close列の一つ先の値を新しいカラムに追加
df['next_close'] = df['close'].shift(-1)

# open列の一つ先の値を新しいカラムに追加
df['next_open'] = df['open'].shift(-1)

# 条件に応じて新しいカラムを追加
df.loc[df['next_close'] - df['next_open'] > 0, 'change'] = 'up'
df.loc[df['next_close'] - df['next_open'] < 0, 'change'] = 'down'
df.loc[df['next_close'] - df['next_open'] == 0, 'change'] = 'zero'

# 前のRSIと現在のRSIを比較して条件判定
df['action'] = None  # 初期値として空の列を追加

prev_rsi = df['rsi'].shift(1)  # 1つ前のRSI
current_rsi = df['rsi']  # 現在のRSI

df.loc[(prev_rsi < 70) & (current_rsi >= 70), 'action'] = 'SELL'
df.loc[(prev_rsi > 30) & (current_rsi <= 30), 'action'] = 'BUY'

print(df)

# 条件に合致する行の抽出
filtered_df = df[(df['action'] == 'BUY') | (df['action'] == 'SELL')]

# 条件に合致する行の確率を計算
buy_up_probability = len(filtered_df[(filtered_df['action'] == 'BUY') & (filtered_df['change'] == 'up')]) / len(filtered_df[(filtered_df['action'] == 'BUY')])
sell_down_probability = len(filtered_df[(filtered_df['action'] == 'SELL') & (filtered_df['change'] == 'down')]) / len(filtered_df[(filtered_df['action'] == 'SELL')])
print("----------------------------------------------------------------------------")
print("BUY & up probability:", buy_up_probability)
print("SELL & down probability:", sell_down_probability)
print("----------------------------------------------------------------------------")
print("全数",len(df))
print("BUY判定数",len(filtered_df[(filtered_df['action'] == 'BUY')]))
print("BUY正解数",len(filtered_df[(filtered_df['action'] == 'BUY') & (filtered_df['change'] == 'up')]) )
print("BUY & up probability: {:.2f}%".format(buy_up_probability * 100))
print("----------------------------------------------------------------------------")
print("全数:", len(df))
print("SELL判定数:", len(filtered_df[(filtered_df['action'] == 'SELL')]))
print("SELL正解数:", len(filtered_df[(filtered_df['action'] == 'SELL') & (filtered_df['change'] == 'down')]))
print("SELL & down probability: {:.2f}%".format(sell_down_probability * 100))


プロンプト5

解説してください。
マークダウン形式でください。

このPythonスクリプトは、MetaTrader5 (MT5)という外国為替取引プラットフォームからデータを取得し、そのデータを用いてテクニカル分析を行うものです。具体的には、Relative Strength Index (RSI)を計算し、それを基に買い(BUY)や売り(SELL)の判断を行います。

以下に詳細な解説をマークダウン形式で記述します。

  1. import pandas as pd

    • Pandasはデータ分析ライブラリで、このスクリプトでは主にデータの整形に使われます。
  2. import MetaTrader5 as mt5

    • MetaTrader5は外国為替取引プラットフォームで、ここではAPIを通じて取引データを取得します。
  3. import talib

    • TA-Lib(Technical Analysis Library)は金融市場データのテクニカル分析用ライブラリで、このスクリプトではRSIの計算に使われます。
  4. mt5.initialize()

    • MT5への接続を初期化します。
  5. symbol = 'USDJPYm'

    • 通貨ペアを指定します。ここではUSD/JPYを指定しています。
  6. timeframe = mt5.TIMEFRAME_M5

    • データの時間枠を指定します。ここでは5分足を指定しています。
  7. count = 100000

    • 取得するデータの件数を指定します。
  8. rates = mt5.copy_rates_from_pos(symbol, timeframe, 0, count)

    • 指定した通貨ペアと時間枠で、最新から指定した件数のデータを取得します。
  9. df = pd.DataFrame(rates)

    • 取得したデータをPandasのDataFrameに変換します。
  10. df['time'] = pd.to_datetime(df['time'], unit='s') + timedelta(hours=9)

    • 'time'列をUNIXタイムからPandasの日時形式に変換し、GMT+9に変換します。
  11. df['rsi'] = talib.RSI(df['close'], timeperiod=rsi_period)

    • 'close'列(終値)を元にRSIを計算し、新しい'rsi'列に代入します。
  12. df['next_close'] = df['close'].shift(-1)

    • 'close'列の一つ先の値を新しい'next_close'列に代入します。
  13. df['next_open'] = df['open'].shift(-1)

    • 'open'列の一つ先の値を新しい'next_open'列に代入します。
  14. df.loc[df['next_close'] - df['next_open'] > 0, 'change'] = 'up'

    • 次の足の終値が始値より高ければ、その行の'change'列に'up'を代入します。その他の条件も同様に'change'列を作成します。
  15. df['action'] = None

    • 初期値として空の'action'列を作成します。この列は後の条件判定に使われます。
  16. df.loc[(prev_rsi < 70) & (current_rsi >= 70), 'action'] = 'BUY'

    • 前のRSIが70未満で現在のRSIが70以上の場合、'action'列に'BUY'を代入します。同様に、前のRSIが30以上で現在のRSIが30以下の場合、'action'列に'SELL'を代入します。
  17. filtered_df = df[(df['action'] == 'BUY') | (df['action'] == 'SELL')]

    • 'action'列が'BUY'または'SELL'の行だけを抽出して新たなDataFrameを作成します。
  18. buy_up_probability = len(filtered_df[(filtered_df['action'] == 'BUY') & (filtered_df['change'] == 'up')]) / len(filtered_df)

    • 'BUY'の判断が出た場合に次の足で価格が上昇する確率を計算します。
  19. sell_down_probability = len(filtered_df[(filtered_df['action'] == 'SELL') & (filtered_df['change'] == 'down')]) / len(filtered_df)

    • 'SELL'の判断が出た場合に次の足で価格が下降する確率を計算します。

最後に全体のデータ数、判断が出た数、判断が正しかった数、及びそれらの確率を表示しています。

テクニカル指標の検証、気になる方やってみてください。

はじめてやってみたので、上記のやり方で間違ってたらごめんなさい。

その時はコメントで教えてね!

今回はこれでおわります。お疲れ様でした。

Discussion