PythonでFXロウソク足チャートを作成!サポートラインも自動で表示
初めに
今回は、FXチャートをPythonで作成する方法を紹介するね。
今回は、FXチャートをPythonで作成する方法を紹介します。FXの予想をAIで試してみようと思い試行錯誤する中で、学習データとしてFXチャートをPythonで作成してみました。
FXチャートとは
FXチャートとは、外国為替市場(FX市場)における通貨ペアの価格変動をグラフで可視化したものです。トレーダーは、FXチャートを使って、市場のトレンド、価格の変動パターン、買いシグナルや売りシグナルを分析し、取引戦略を立てます。
FXチャートの種類
FXチャートには用途に応じて様々なものがあります。
- ローソク足チャート: 始値、高値、安値、終値をローソク足の形で表示します。
- 折れ線チャート: 過去の価格データを線で結んで表示します。
- ヒストグラムチャート: 価格の変動を棒グラフで表示します。
今回作成したチャート
今回は、以下の3種類のチャートを作成しました。
- ローソク足チャート
- サポートライン/抵抗線付きの折れ線チャート
- サポートライン/抵抗線付きのローソク足チャート
抵抗線とは
抵抗線とは、FXチャート分析において、価格が上昇しづらく、反転しやすい価格帯を示す水平線のことです。
抵抗線は、過去の高値圏で形成され、価格がそのレベルを超えることを阻害する役割を果たします。価格が抵抗線に近づくと、買い手が弱気になり、売り手が優勢になりやすい傾向があります。そのため、抵抗線は価格が反転する可能性を示す重要なシグナルになります。
サポートラインとは
サポートラインとは、FXチャート分析において、価格が下がりづらく、反転しやすい価格帯を示す水平線のことです。サポートラインは、過去の安値圏で形成され、価格がそのレベルを下回ることを支える役割を果たします。価格がサポートラインに近づくと、売り手が弱気になり、買い手が優勢になりやすい傾向があります。そのため、サポートラインは価格が反転する可能性を示す重要なシグナルになります。
FXチャートの作成
データの準備
為替データはGMOクリック証券よりダウンロードしました。GMOクリック証券は会員なら無料で1分足の為替データをダウンロードできます。為替データはGMOクリック証券以外の証券会社でも提供していますので、ご自身が利用されている証券会社などから入手して下さい。
以下の形式のデータであれば、どこから入手して頂いても問題ありません。
データ形式
CSVファイル(カンマ区切りのテキストファイル)
項目
- BaseDate : 日時
- Open : 始値
- High :高値
- Low :安値
- Close :終値
実際のデータ
今回用意したデータはこちらになります。
USDJPY_20240701.csv
FXチャート作成pythonプログラム
FXチャート作成pythonプログラムは以下になります。
# -*- coding:utf-8 -*-
import pandas as pd
import trendln
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import matplotlib
import mplfinance as mpf
from PIL import Image
import os
# メイン処理
def exec():
df = load_data()
# ② 10レコード毎にチャートを作成
for i in range(0, len(df)-40, 10):
start = i
end = i + 40
df_sliced = df.iloc[start:end]
print(f"{df_sliced.index[0].strftime('%Y/%m/%d %H:%M:%S')}のチャート作成中")
first_datetime = df_sliced.index[0].strftime('%Y%m%d%H%M%S')
# ロウソク足チャートの作成
make_candlestick_chart(df_sliced, first_datetime)
# 抵抗線付きの折れ線チャートの作成
make_line_chart(df_sliced, first_datetime)
# 抵抗線付きのロウソク足チャートの作成
mix_chart(df_sliced, first_datetime)
# ① データ準備(3分足データの取得)
def load_data():
# CSV読み込み(日時項目をdatetime型に変換してキーにする)
df = pd.read_csv('USDJPY_20240701.csv', encoding='sjis', parse_dates=['BaseDate'])
df = df.set_index('BaseDate')
# 1分足を3分足に変換
df = df.resample('3T').agg({'Open': 'first', 'High': 'max', 'Low': 'min', 'Close': 'last'})
# 読み込んだデータを表示
print(df)
return df
# ➂ ロウソク足チャートの作成
def make_candlestick_chart(df, first_datetime):
fig, ax = plt.subplots(figsize=(9, 7))
style = mpf.make_mpf_style(base_mpf_style='yahoo',
marketcolors=mpf.make_marketcolors(up='r', down='b',
base_mpf_style='yahoo'),
rc={'figure.facecolor': 'lightgray'})
mpf.plot(df, type='candle', style=style,
ylabel='価格',
volume=False, # 出来高を非表示
figscale=1.0, # 図のサイズ
xrotation=0, # x軸のラベルを回転させない
ax=ax)
plt.savefig(f'candlestick_chart/{first_datetime}.png')
plt.close(fig)
# ④ 抵抗線付きの折れ線グラフを作成
def make_line_chart(df, first_datetime):
fig = trendln.plot_support_resistance(df["Close"], accuracy=2)
plt.savefig(f'line_chart/{first_datetime}.png')
plt.close(fig)
# ⑤ 抵抗線付きのロウソク足チャートの作成
def mix_chart(df, first_datetime):
chat1_name = f'{first_datetime}_tmp_1.png'
chat2_name = f'{first_datetime}_tmp_2.png'
chat3_name = f'mix_chart/{first_datetime}.png'
# ローソク足チャート描画
fig, ax = plt.subplots(figsize=(9, 7))
style = mpf.make_mpf_style(base_mpf_style='yahoo',
marketcolors=mpf.make_marketcolors(up='r', down='b',
base_mpf_style='yahoo'),
rc={'figure.facecolor': 'lightgray'})
mpf.plot(df, type='candle', style=style,
ylabel='価格',
volume=False, # ボリュームを非表示
figscale=1.0, # 図のサイズ
xrotation=0, # x軸のラベルを回転させない
ax=ax)
plt.savefig(chat1_name)
plt.close(fig)
#トレンドラインを引く
fig = trendln.plot_support_resistance(df["Close"], accuracy=2)
for ax in fig.axes:
for artist in ax.get_children():
if 'Support' in str(artist):
pass
elif 'Resistance' in str(artist):
pass
else:
# 抵抗線以外を削除
try:
artist.remove() #削除
except:
try:
artist.set_color('white') #削除が出来な場合は色を白にする
except Exception as e:
pass
plt.savefig(chat2_name)
plt.close(fig)
#チャート合成
marge_chat(chat1_name, chat2_name, chat3_name)
# チャート画像合成
def marge_chat(chat1_name, chat2_name, chat3_name):
# 画像をロード
image1 = Image.open(chat1_name)
image2 = Image.open(chat2_name)
# image2 をアルファチャンネル付きに変換
image2 = image2.convert("RGBA")
# 白抜き部分を透過にする
# 白色のピクセルを透過にする
image2 = image2.convert("RGBA") # 既に RGBA なので再変換する
datas = image2.getdata()
newData = []
for item in datas:
if item[0] == 255 and item[1] == 255 and item[2] == 255:
newData.append((255, 255, 255, 0)) # アルファ値を 0 に設定(透明)
else:
newData.append(item)
image2.putdata(newData)
image2 = image2.resize(image1.size)
# 画像を合成
# image1 に image2 を重ね合わせる
image1.paste(image2, (0, 0), image2)
# 合成した画像を保存
image1.save(chat3_name)
os.remove(chat1_name)
os.remove(chat2_name)
exec()
作成されたFXチャート
ロウソク足チャート
抵抗線/サポートライン付きの折れ線チャート
抵抗線/サポートライン付きのロウソク足チャート
ソースの解説
① データ準備(3分足データの取得)
デイトレードの場合、3分足が良いらしいので、1分足のCSV為替データを読み込み、3分足に加工しています。
具体的にはpandasのread_csvを用いてDataFrameにCSVの中身を格納し、DataFrameのresample関数を用いて3分単位に始値、高値、安値、終値を計算します。
# ① データ準備(3分足データの取得)
def load_data():
# CSV読み込み(日時項目をdatetime型に変換してキーにする)
df = pd.read_csv('USDJPY_20240701.csv', encoding='sjis', parse_dates=['BaseDate'])
df = df.set_index('BaseDate')
# 1分足を3分足に変換
df = df.resample('3T').agg({'Open': 'first', 'High': 'max', 'Low': 'min', 'Close': 'last'})
# 読み込んだデータを表示
print(df)
return df
pandasとは
pandasとは、Pythonでデータ分析を行うための強力なライブラリです。データの読み込み、操作、分析、可視化など、データ分析に必要な機能を幅広く提供しています。pandasは、2次元のデータをDataFrameという構造に格納し、簡単に高速な集計処理などが行えます。
出力結果
上記ソースの出力結果は以下になります。
Open High Low Close
BaseDate
2024-08-02 00:00:00 161.655 161.721 161.652 161.683
2024-08-02 00:03:00 161.683 161.708 161.680 161.703
2024-08-02 00:06:00 161.703 161.729 161.644 161.655
2024-08-02 00:09:00 161.655 161.687 161.637 161.637
2024-08-02 00:12:00 161.637 161.643 161.614 161.622
... ... ... ... ...
2024-08-02 23:45:00 161.554 161.576 161.517 161.556
2024-08-02 23:48:00 161.556 161.633 161.556 161.621
2024-08-02 23:51:00 161.621 161.629 161.591 161.615
2024-08-02 23:54:00 161.615 161.667 161.597 161.647
2024-08-02 23:57:00 161.647 161.663 161.631 161.655
[480 rows x 4 columns]
② 10レコード毎にチャートを作成
今回用意した為替レートのCSVファイルは1日分あります。
1日分のレコードを全部一つの3分足にしたら、横に物凄く長いグラフになってしまい分析に使えませんので、適切な範囲に分割します。
今回はX軸は40レコード(3分×40レコード = 120分)として、開始時刻を30分ごとずらして複数のチャートを作成しました。
# メイン処理
def exec():
df = load_data()
# ② 10レコード毎にチャートを作成
for i in range(0, len(df)-40, 10):
start = i
end = i + 40
df_sliced = df.iloc[start:end]
print(f"{df_sliced.index[0].strftime('%Y/%m/%d %H:%M:%S')}のチャート作成中")
first_datetime = df_sliced.index[0].strftime('%Y%m%d%H%M%S')
# ロウソク足チャートの作成
make_candlestick_chart(df_sliced, first_datetime)
# 抵抗線付きの折れ線チャートの作成
make_line_chart(df_sliced, first_datetime)
# 抵抗線付きのロウソク足チャートの作成
mix_chart(df_sliced, first_datetime)
➂ ロウソク足チャートの作成
ソース
mplfinanceライブラリでロウソク足チャートを作成します。
ライブラリを実行するだけなので簡単です。
# ➂ ロウソク足チャートの作成
def make_candlestick_chart(df, first_datetime):
fig, ax = plt.subplots(figsize=(9, 7))
style = mpf.make_mpf_style(base_mpf_style='yahoo',
marketcolors=mpf.make_marketcolors(up='r', down='b',
base_mpf_style='yahoo'),
rc={'figure.facecolor': 'lightgray'})
mpf.plot(df, type='candle', style=style,
ylabel='価格',
volume=False, # 出来高を非表示
figscale=1.0, # 図のサイズ
xrotation=0, # x軸のラベルを回転させない
ax=ax)
plt.savefig(f'candlestick_chart/{first_datetime}.png')
plt.close(fig)
mplfinanceとは
mplfinanceは、matplotlibをベースにした、金融データの可視化に特化したPythonライブラリです。matplotlibの機能を活用し、ローソク足チャート、OHLCチャート、ボリュームチャートなど、金融データ分析でよく使われるチャートを簡単に作成することができます。またチャートの色、線の太さ、スタイル、チャートの背景色など、様々な要素を容易にカスタマイズできます。
mplfinanceはmatplotlibのpyplotモジュールを使ってチャートを描画するため、matplotlibの機能を使って、チャートをさらにカスタマイズできます。
matplotlibとは
matplotlibは、Pythonでグラフや図を作成するための強力なライブラリです。データの可視化に広く使われており、折れ線グラフ、散布図、ヒストグラム、棒グラフ、円グラフ、3Dグラフなど、様々な種類のグラフを作成できます。
④ 抵抗線付きの折れ線グラフを作成
ソース
抵抗線付きの折れ線グラフはtrendlnライブラリで簡単に作成出来ます。
ライブラリを実行するだけなので簡単です。
def make_line_chart(df, first_datetime):
fig = trendln.plot_support_resistance(df["Close"], accuracy=2)
plt.savefig(f'line_chart/{first_datetime}.png')
plt.close(fig)
trendlnとは
trendlnは、Pythonのライブラリで、金融データのチャートにトレンドライン(トレンドライン、サポートライン、レジスタンスライン)を自動で描画する機能を提供します。trendlnはmatplotlibのpyplotモジュールを使ってチャートを描画するため、matplotlibの機能を使って、チャートをさらにカスタマイズできます。
⑤ 抵抗線付きのロウソク足チャートの作成
ソース
抵抗線付きのロウソク足チャートを作成出来るライブラリは無いので、強引に作成しました。
具体的には前述のロウソク足チャートのグラフと、抵抗線付きの折れ線グラフをPILライブラリで合成しました。
# ⑤ 抵抗線付きのロウソク足チャートの作成
def mix_chart(df, first_datetime):
chat1_name = f'{first_datetime}_tmp_1.png'
chat2_name = f'{first_datetime}_tmp_2.png'
chat3_name = f'mix_chart/{first_datetime}.png'
# ローソク足チャート描画
fig, ax = plt.subplots(figsize=(9, 7))
style = mpf.make_mpf_style(base_mpf_style='yahoo',
marketcolors=mpf.make_marketcolors(up='r', down='b',
base_mpf_style='yahoo'),
rc={'figure.facecolor': 'lightgray'})
mpf.plot(df, type='candle', style=style,
ylabel='価格',
volume=False, # ボリュームを非表示
figscale=1.0, # 図のサイズ
xrotation=0, # x軸のラベルを回転させない
ax=ax)
plt.savefig(chat1_name)
plt.close(fig)
#トレンドラインを引く
fig = trendln.plot_support_resistance(df["Close"], accuracy=2)
for ax in fig.axes:
for artist in ax.get_children():
if 'Support' in str(artist):
pass
elif 'Resistance' in str(artist):
pass
else:
# 抵抗線以外を削除
try:
artist.remove() #削除
except:
try:
artist.set_color('white') #削除が出来な場合は色を白にする
except Exception as e:
pass
plt.savefig(chat2_name)
plt.close(fig)
#チャート合成
marge_chat(chat1_name, chat2_name, chat3_name)
# チャート画像合成
def marge_chat(chat1_name, chat2_name, chat3_name):
# 画像をロード
image1 = Image.open(chat1_name)
image2 = Image.open(chat2_name)
# image2 をアルファチャンネル付きに変換
image2 = image2.convert("RGBA")
# 白抜き部分を透過にする
# 白色のピクセルを透過にする
image2 = image2.convert("RGBA") # 既に RGBA なので再変換する
datas = image2.getdata()
newData = []
for item in datas:
if item[0] == 255 and item[1] == 255 and item[2] == 255:
newData.append((255, 255, 255, 0)) # アルファ値を 0 に設定(透明)
else:
newData.append(item)
image2.putdata(newData)
image2 = image2.resize(image1.size)
# 画像を合成
# image1 に image2 を重ね合わせる
image1.paste(image2, (0, 0), image2)
# 合成した画像を保存
image1.save(chat3_name)
os.remove(chat1_name)
os.remove(chat2_name)
ソースの説明
mplfinanceとtrendlnはどちらもpyplotモジュールを使っているので、チャートの合成が可能なはずなのですが、なかなかうまくいかず、画像の重ね合わせで合成しちゃいました(;^_^A
具体的にはロウソク足チャートの画像はmplfinanceで普通に生成し、抵抗線/サポートラインはtrendlnで生成したグラフから抵抗線/サポートライン以外のオブジェクトを除去し透過画像にし、ロウソク足チャートの上に重ね合わせました。ちょっとずれていますが、分析する上では問題無い範囲のチャートが作れたと思います。
生成されたチャート一式
ロウソク足チャート
抵抗線/サポートライン付きの折れ線チャート
抵抗線/サポートライン付きのロウソク足チャート
最後に
本記事は、Pythonを用いたFXチャート作成の技術的な解説を目的としており、投資を推奨するものではありません。FX取引は価格変動のリスクを伴うため、投資の最終決定は、ご自身の判断と責任で行ってください。