PythonでFXロウソク足チャートを作成!サポートラインも自動で表示

2024年8月15日

抵抗線付きのロウソク足チャート

初めに

今回は、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のライブラリで、金融データのチャートにトレンドライン(トレンドライン、サポートライン、レジスタンスライン)を自動で描画する機能を提供します。trendlnmatplotlibの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)

ソースの説明

mplfinancetrendlnはどちらもpyplotモジュールを使っているので、チャートの合成が可能なはずなのですが、なかなかうまくいかず、画像の重ね合わせで合成しちゃいました(;^_^A
具体的にはロウソク足チャートの画像はmplfinanceで普通に生成し、抵抗線/サポートラインはtrendlnで生成したグラフから抵抗線/サポートライン以外のオブジェクトを除去し透過画像にし、ロウソク足チャートの上に重ね合わせました。ちょっとずれていますが、分析する上では問題無い範囲のチャートが作れたと思います。

生成されたチャート一式

ロウソク足チャート

ロウソク足チャート

抵抗線/サポートライン付きの折れ線チャート

折れ線チャート

抵抗線/サポートライン付きのロウソク足チャート

抵抗線付きのロウソク足チャート

最後に

本記事は、Pythonを用いたFXチャート作成の技術的な解説を目的としており、投資を推奨するものではありません。FX取引は価格変動のリスクを伴うため、投資の最終決定は、ご自身の判断と責任で行ってください。