カップウィズハンドルとは?Pythonでパターン検索する方法を紹介

この記事には広告を含む場合があります。

記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

株式投資やFXなどのチャート分析において、「カップウィズハンドル(Cup with Handle)」は強力なトレンド転換パターンの一つです。
特に、上昇トレンドの中で現れる「押し目買い」の絶好のポイントとして、多くのトレーダーに活用されています。

本記事では、カップウィズハンドルの概要の解説とPythonでのパターン検索する方法について紹介します。

カップウィズハンドルとは

カップウィズハンドルとは、価格チャートが「カップ(カップ型の底)」と「ハンドル(小さな押し目)」の形を形成するチャートパターンです。
このパターンが完成すると、価格が上昇しやすい傾向があります。

アメリカ屈指の投資家であるウィリアム・J・オニール氏の著書「オニールの成長株発掘法」で、最も重要な株価パターンとして紹介されています。
この本は、CAN-SLIM投資法などの投資家にとって有益な情報がたくさん書かれているので一読の価値ありです。

カップウィズハンドルの形状

カップウィズハンドルは、カップを横からカップを横から見たような形状をしています。

カップウィズハンドルの形状には次のような特徴があります。

  • カップ部分:価格がゆるやかに下落し、底を形成した後、再び上昇してカップの右端まで戻る。
  • ハンドル部分:カップの右端付近で小さな調整(押し目)が発生する。
  • ブレイクアウト:ハンドルの高値を超えると強い上昇トレンドが発生することが多い。

カップウィズハンドルの条件

カップウィズハンドルの成立には次のような条件があります。

カップの部分の条件

カップの部分の条件として次のようなものがあります。

  1. カップの部分が形成される前に少なくとも30%以上の上昇トレンドである。
  2. カップの部分の形成期間が3~6ヶ月である。
  3. カップの深さは12〜33%である。
  4. カップの底は丸いU字型がよい。

取っ手の部分の条件

取っ手の部分の条件として次のようなものがあります。

  1. 取っ手の部分の形成期間は1~2周間以上である。
  2. 取っ手はカップの半分より上に形成される。
  3. 取っ手の下落幅は8〜12%以内である。

なぜカップウィズハンドルが形成されるのか

カップウィズハンドルが形成される理由として、個人投資家の心理や機関投資家の動向が関係していると言われています。

まず、株価が上昇トレンドで30%以上の値上がりをした後に値下がりすると、利益の確定売で投資家は株を手放していきます。

株価が12〜33%値下がりしたところで機関投資家が株を買い集めます。
3~6ヶ月かけて買い集めることで、握力の弱い投資家はふるい落とされ、カップの底は丸いU字となります。

機関投資家の買い集めが完了して、価格が上昇に転じ始めると、個人投資家も乗り遅れまいと参入をして価格の上昇が加速します。

しかし、直近の高値に近づくと、利益確定をする投資家が増えて価格は下落に転じます。
ここでカップウィズハンドルの取手の部分が形成されます。

株は機関投資家が買い集めているので、8〜12%下落すると利益確定をする投資家がいなくなり、再び上昇に転じます。

そして、直近の高値を更新すると、上昇トレンドが発生してると判断され、更に価格は上昇していきます。

よって、取っ手の高値を更新するタイミングが買いポイントになるのです。

Pythonでカップウィズハンドルのパターン検索する方法

続いてPythonでカップウィズハンドルのパターン検索する方法を紹介します。

カップウィズハンドルのパターン検索は、相関関数をもとにカップウィズハンドルを探します。

相関係数とは、2つのデータの間にある関係の強弱を測る指標です。
-1から1までの値を取り、相関係数が1に近いほど正の相関、-1に近いほど負の相関、0に近いほど相関がないことを意味します。

つまり、カップウィズハンドルの形状と株価の日足の形状を比較して、1に近いものを抽出します。

証券コードのリストの用意

まずは、証券コードのリストを用意します。

おすすめの方法は、SBI証券の銘柄スクリーニングでCSVをダウンロードする方法です。

今回は日経225の銘柄からチャート形状検索をしたいと思うので、採用指数の日経225にチェックをします。

そして、CSVダウンロードをクリックするとscreener_result.csvというファイル名のデータが手に入ります。

ダウンロードしたscreener_result.csvをPythonの作業ディレクトリに移動させておきます。

ライブラリのインストール

今回は、以下のライブラリを使用します。pipでインストールしておいてください。

  • numpy: 数値計算を効率的に行うためのライブラリ。
  • pandas: 時系列データを処理するためのライブラリ。
  • yfinance: 価格データを取得するためのライブラリ。
  • mplfinance: グラフの描画に使用します。
Bash
pip install numpy pandas yfinance mplfinance

チャート形状銘柄検索をするサンプルコード

Python
import numpy as np
import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt

# 期間の設定 '3mo','6mo'から選択
period = '6mo'


# 株価を取得する関数
def get_data():
    df = pd.DataFrame(columns=['code'])
    csv_df = pd.read_csv('screener_result.csv', header=None, skiprows=1, usecols=[0, 1])
    df['code'] = csv_df[0]
    ticker_symbol_dr = []

    for i in range(len(df)):
        ticker_symbol_dr.append((str(df.iloc[i, 0])) + ".T")

    symbol_data = yf.download(ticker_symbol_dr, period=period, threads=False)
    df = pd.DataFrame(symbol_data['Close'])
    df = df.dropna(axis=1)

    return df


data = get_data()
term = len(data)

# 株価データの正規化
normalization_df = (data - data.min(axis=0)) / (data.max(axis=0) - data.min(axis=0))

# X軸の正規化
x = list(map(lambda v: v / float(term - 1), range(0, term)))

# 4次多項式でカップウィズハンドルの形状を再現
cup_with_handle = list(map(lambda v: (-39.50813 * (v / float(term - 1)) ** 4) + (86.90238 * (v / float(term - 1)) ** 3) -
                                     (59.7321 * (v / float(term - 1)) ** 2) + (13.13785 * (v / float(term - 1))), range(0, term)))

# 4次多項式を描写
plt.plot(x, cup_with_handle)
plt.show()

# 相関関数を計算してカップウィズハンドルのパターンを検索
for i in range(len(normalization_df.columns)):
    a = normalization_df.iloc[:, i].tolist()
    corr = np.corrcoef(a, cup_with_handle)[1, 0]

    if corr > 0.5:
        print(f"{normalization_df.columns[i]} 相関係数:{corr}")

これを実行すると、4次多項式で再現したカップウィズハンドルの形状のグラフと、相関関係が強い銘柄が出力されます。

上記のグラフの0の形状と日足の形状を比較します。

記事を執筆時の相関関係が高い銘柄は、次の3銘柄でした。

4507
7269
9434

おおむねカップウィズハンドルに似た形状を抽出できたと思います。

ポイントの解説

株価データの取得

Python
# 期間の設定 '3mo','6mo'から選択
period = '6mo'


# 株価を取得する関数
def get_data():
    df = pd.DataFrame(columns=['code'])
    csv_df = pd.read_csv('screener_result.csv', header=None, skiprows=1, usecols=[0, 1])
    df['code'] = csv_df[0]
    ticker_symbol_dr = []

    for i in range(len(df)):
        ticker_symbol_dr.append((str(df.iloc[i, 0])) + ".T")

    symbol_data = yf.download(ticker_symbol_dr, period=period)
    df = pd.DataFrame(symbol_data['Close'])
    df = df.dropna(axis=1)

    return df

まず、株価を取得する期間を設定します、3ヶ月、6ヶ月から選択します。

csv_df = pd.read_csv('screener_result.csv', header=None, skiprows=1, usecols=[0, 1])でSBI証券からダウンロードしたscreener_result.csvを読み込みます。

yfinanceで各銘柄の株価を取得する場合は、末尾に".T"が必要なので、ticker_symbol_dr.append((str(df.iloc[i, 0])) + ".T")".T"を付け加えながらticker_symbol_drに加えています。

symbol_data = yf.download(ticker_symbol_dr, period=period, threads=False)で株価を取得して、df = pd.DataFrame(symbol_data['Close'])で終値のみを使用するようにしています。

また、欠損値がある場合はdf = df.dropna(axis=1)で除外します。

正規化

Python
# 株価データの正規化
normalization_df = (data - data.min(axis=0)) / (data.max(axis=0) - data.min(axis=0))

# X軸の正規化
x = list(map(lambda v: v / float(term - 1), range(0, term)))

正規化とは、データを一定の規則に基づいて変形し、比較や分析を容易にする処理のことです。

今回の場合はMin-Max正規化という手法で、各銘柄の最小値が0、最大値が1になるように株価の値を正規化します。

また、ラムダ式を用いて、二次関数で使用するX軸の正規化もします。

4次多項式でカップウィズハンドルの形状を再現

Python
# 4次多項式でカップウィズハンドルの形状を再現
cup_with_handle = list(map(lambda v: (-39.50813 * (v / float(term - 1)) ** 4) + (86.90238 * (v / float(term - 1)) ** 3) -
                                     (59.7321 * (v / float(term - 1)) ** 2) + (13.13785 * (v / float(term - 1))), range(0, term)))

Desmosというサイトのグラフ計算機を用いて4次多項式でカップウィズハンドルの形状を再現します。
5箇所のオレンジ色の点を調整して、下記のようなグラフを作成しました。

このグラフの4次多項式は次のようになります。

この値をPythonで計算することで、カップウィズハンドルの形状を再現しました。

相関関数を計算してカップウィズハンドルのパターンを検索

Python
# 相関関数を計算してカップウィズハンドルのパターンを検索
for i in range(len(normalization_df.columns)):
    a = normalization_df.iloc[:, i].tolist()
    corr = np.corrcoef(a, cup_with_handle)[1, 0]

    if corr > 0.5:
        print(f"{normalization_df.columns[i]} 相関係数:{corr}")
        

NumPyの相関係数を求めるnp.corrcoef関数で相関係数を求めます。

corr = np.corrcoef(a, pattern)[1, 0]で株価の終値と4次多項式との相関係数を求めて、0.5以上の銘柄を出力します。

おわりに

以上、カップウィズハンドルの概要の解説とPythonでのパターン検索する方法について紹介しました。

カップウィズハンドルは、強い上昇トレンドのシグナルとなる重要なチャートパターンです。
大量にある銘柄からこのパターンを見つけるのは大変な作業ですが、Pythonを使うことで数分で候補の銘柄を検索することができます。

投資銘柄の選定に、ぜひ活用してみてください。