バイナリーオプションRSIだけで勝てるのか検証する
テクニカル指標。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)の判断を行います。
以下に詳細な解説をマークダウン形式で記述します。
-
import pandas as pd
- Pandasはデータ分析ライブラリで、このスクリプトでは主にデータの整形に使われます。
-
import MetaTrader5 as mt5
- MetaTrader5は外国為替取引プラットフォームで、ここではAPIを通じて取引データを取得します。
-
import talib
- TA-Lib(Technical Analysis Library)は金融市場データのテクニカル分析用ライブラリで、このスクリプトではRSIの計算に使われます。
-
mt5.initialize()
- MT5への接続を初期化します。
-
symbol = 'USDJPYm'
- 通貨ペアを指定します。ここではUSD/JPYを指定しています。
-
timeframe = mt5.TIMEFRAME_M5
- データの時間枠を指定します。ここでは5分足を指定しています。
-
count = 100000
- 取得するデータの件数を指定します。
-
rates = mt5.copy_rates_from_pos(symbol, timeframe, 0, count)
- 指定した通貨ペアと時間枠で、最新から指定した件数のデータを取得します。
-
df = pd.DataFrame(rates)
- 取得したデータをPandasのDataFrameに変換します。
-
df['time'] = pd.to_datetime(df['time'], unit='s') + timedelta(hours=9)
- 'time'列をUNIXタイムからPandasの日時形式に変換し、GMT+9に変換します。
-
df['rsi'] = talib.RSI(df['close'], timeperiod=rsi_period)
- 'close'列(終値)を元にRSIを計算し、新しい'rsi'列に代入します。
-
df['next_close'] = df['close'].shift(-1)
- 'close'列の一つ先の値を新しい'next_close'列に代入します。
-
df['next_open'] = df['open'].shift(-1)
- 'open'列の一つ先の値を新しい'next_open'列に代入します。
-
df.loc[df['next_close'] - df['next_open'] > 0, 'change'] = 'up'
- 次の足の終値が始値より高ければ、その行の'change'列に'up'を代入します。その他の条件も同様に'change'列を作成します。
-
df['action'] = None
- 初期値として空の'action'列を作成します。この列は後の条件判定に使われます。
-
df.loc[(prev_rsi < 70) & (current_rsi >= 70), 'action'] = 'BUY'
- 前のRSIが70未満で現在のRSIが70以上の場合、'action'列に'BUY'を代入します。同様に、前のRSIが30以上で現在のRSIが30以下の場合、'action'列に'SELL'を代入します。
-
filtered_df = df[(df['action'] == 'BUY') | (df['action'] == 'SELL')]
- 'action'列が'BUY'または'SELL'の行だけを抽出して新たなDataFrameを作成します。
-
buy_up_probability = len(filtered_df[(filtered_df['action'] == 'BUY') & (filtered_df['change'] == 'up')]) / len(filtered_df)
- 'BUY'の判断が出た場合に次の足で価格が上昇する確率を計算します。
-
sell_down_probability = len(filtered_df[(filtered_df['action'] == 'SELL') & (filtered_df['change'] == 'down')]) / len(filtered_df)
- 'SELL'の判断が出た場合に次の足で価格が下降する確率を計算します。
最後に全体のデータ数、判断が出た数、判断が正しかった数、及びそれらの確率を表示しています。
テクニカル指標の検証、気になる方やってみてください。
はじめてやってみたので、上記のやり方で間違ってたらごめんなさい。
その時はコメントで教えてね!
今回はこれでおわります。お疲れ様でした。
Discussion