📝
FXデータ分析:ロンドンフィックスのGBPUSDを可視化する
プロンプト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