📝

FXデータ分析:ロンドンフィックスのGBPUSDを可視化する

2023/06/03に公開

プロンプト1
ロンドンフィックスを計算します。
夏時間は、毎年3月の最終日曜日1時(UTC時間)から10月最終日曜日1時までです。
プロンプト2
このコードは値動きの特徴を可視化するものです。
現在のGMT+9を使っています。夏時間は夏時間で集計して、冬時間は冬時間で集計してください。
プロンプト3
すべてロンドンの時間基準にしてください。

import pandas as pd
import MetaTrader5 as mt5
from datetime import timedelta
import seaborn as sns
import matplotlib.pyplot as plt
from datetime import datetime
from pandas.tseries.holiday import AbstractHolidayCalendar, Holiday, nearest_workday, MO
from pandas.tseries.offsets import DateOffset, Day

# MT5への接続
if not mt5.initialize():
    print("initialize() failed, error code =",mt5.last_error())
    quit()

def high_low_ratio(df):
    return (df['high'] - df['low']) / df['low']

def close_open_ratio(df):
    return (df['close'] - df['open']) / df['open']

class BSTCalendar(AbstractHolidayCalendar):
    rules = [
        Holiday('BST Start', month=3, day=31, offset=DateOffset(weekday=MO(-1))),
        Holiday('BST End', month=10, day=31, offset=DateOffset(weekday=MO(-1))),
    ]

def bst_dates(year):
    inst = BSTCalendar()
    return inst.holidays(datetime(year-1, 12, 31), datetime(year, 12, 31))

def fetch_and_prepare(symbol, timeframe, count, ratio_calculation, column_name):
    # データの取得
    rates = mt5.copy_rates_from_pos(symbol, timeframe, 0, count)

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

    # 日時をPandasの日時形式に変換
    df['time'] = pd.to_datetime(df['time'], unit='s')

    # BSTの開始日と終了日を取得
    year = df['time'].dt.year[0]  # 始点の年を取得
    bst_start, bst_end = bst_dates(year)

    # BSTとGMTの適用
    df.loc[df['time'].between(bst_start, bst_end), 'time'] += timedelta(hours=1)
    df.loc[~df['time'].between(bst_start, bst_end), 'time'] += timedelta(hours=0)

    df[column_name] = ratio_calculation(df)

    return df

def plot_avg_return(df, column_name):
    # インデックスを日付に変換
    df.set_index('time', inplace=True)

    # 5分ごとの平均リターンを計算
    df['5min_avg_return'] = df[column_name].rolling(window=5).mean()

    # 時刻をグループ化して平均を計算
    grouped_df = df.groupby(df.index.time).mean()

    # 時刻を文字列に変換
    grouped_df.index = grouped_df.index.astype(str)

    # グラフの作成
    plt.figure(figsize=(50, 10))
    sns.barplot(x=grouped_df.index, y=grouped_df['5min_avg_return'])
    plt.xlabel('Time')
    plt.ylabel('5min Average Return')
    plt.title('5-minute Average Return (Grouped by Time)')

    # X軸のラベルを斜めに表示
    plt.xticks(rotation=90)

    plt.show()

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

df = fetch_and_prepare(symbol, timeframe, count, high_low_ratio, 'high_low_ratio')
plot_avg_return(df, 'high_low_ratio')

df = fetch_and_prepare(symbol, timeframe, count, close_open_ratio, 'close_open_ratio')
plot_avg_return(df, 'close_open_ratio')

mt5.shutdown()

プロンプト4
月末だけにしてください。

import pandas as pd
import MetaTrader5 as mt5
from datetime import timedelta
import seaborn as sns
import matplotlib.pyplot as plt
from datetime import datetime
from pandas.tseries.holiday import AbstractHolidayCalendar, Holiday, nearest_workday, MO
from pandas.tseries.offsets import DateOffset, Day

# MT5への接続
if not mt5.initialize():
    print("initialize() failed, error code =",mt5.last_error())
    quit()

def high_low_ratio(df):
    return (df['high'] - df['low']) / df['low']

def close_open_ratio(df):
    return (df['close'] - df['open']) / df['open']

class BSTCalendar(AbstractHolidayCalendar):
    rules = [
        Holiday('BST Start', month=3, day=31, offset=DateOffset(weekday=MO(-1))),
        Holiday('BST End', month=10, day=31, offset=DateOffset(weekday=MO(-1))),
    ]

def bst_dates(year):
    inst = BSTCalendar()
    return inst.holidays(datetime(year-1, 12, 31), datetime(year, 12, 31))

def fetch_and_prepare(symbol, timeframe, count, ratio_calculation, column_name):
    # データの取得
    rates = mt5.copy_rates_from_pos(symbol, timeframe, 0, count)

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

    # 日時をPandasの日時形式に変換
    df['time'] = pd.to_datetime(df['time'], unit='s')

    # BSTの開始日と終了日を取得
    year = df['time'].dt.year[0]  # 始点の年を取得
    bst_start, bst_end = bst_dates(year)

    # BSTとGMTの適用
    df.loc[df['time'].between(bst_start, bst_end), 'time'] += timedelta(hours=1)
    df.loc[~df['time'].between(bst_start, bst_end), 'time'] += timedelta(hours=0)

    # 月末のデータのみ抽出
    df = df[df['time'].dt.is_month_end]

    df[column_name] = ratio_calculation(df)

    return df

def plot_avg_return(df, column_name):
    # インデックスを日付に変換
    df.set_index('time', inplace=True)

    # 5分ごとの平均リターンを計算
    df['5min_avg_return'] = df[column_name].rolling(window=5).mean()

    # 時刻をグループ化して平均を計算
    grouped_df = df.groupby(df.index.time).mean()

    # 時刻を文字列に変換
    grouped_df.index = grouped_df.index.astype(str)

    # グラフの作成
    plt.figure(figsize=(50, 10))
    sns.barplot(x=grouped_df.index, y=grouped_df['5min_avg_return'])
    plt.xlabel('Time')
    plt.ylabel('5min Average Return')
    plt.title('5-minute Average Return (Grouped by Time)')

    # X軸のラベルを斜めに表示
    plt.xticks(rotation=90)

    plt.show()

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

df = fetch_and_prepare(symbol, timeframe, count, high_low_ratio, 'high_low_ratio')
plot_avg_return(df, 'high_low_ratio')

df = fetch_and_prepare(symbol, timeframe, count, close_open_ratio, 'close_open_ratio')
plot_avg_return(df, 'close_open_ratio')

mt5.shutdown()


Discussion