0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【技術解説】ビットコイン分析 Pythonライブラリで急変動を見逃すな!ボリンジャーバンドのスクイズ検知法

0
Posted at

ビットコイン分析: Pythonライブラリによるボリンジャーバンドのスクイズ検知法

本記事では、ビットコインのような高ボラティリティな資産の急激な価格変動を監視するために、ボリンジャーバンドのスクイズを用いた分析手法をPythonで実装する方法を解説します。このアプローチにより、エントリーやエグジットのタイミングを捉えやすくなります。

ボリンジャーバンドの基礎知識

ボリンジャーバンドは、単純移動平均(SMA)に基づいて計算され、以下の2つのバンドを持っています:

  1. 中心線(SMA)
  2. 上下のバンド(標準偏差を用いた計算)

ボリンジャーバンドは価格の変化を視覚化し、高値と安値を示すため、トレンドの逆転やボラティリティの収束・拡散を示唆します。

ボリンジャーバンドの計算

ボリンジャーバンドの計算は以下のように行います:

  • 中心線(SMA) = 過去n日間の終値の平均
  • 上バンド = SMA + (標準偏差 * 倍数)
  • 下バンド = SMA - (標準偏差 * 倍数)

これをPythonで実装すると、次のようになります。

import pandas as pd
import yfinance as yf

# データの取得
symbol = 'BTC-USD'
data = yf.download(symbol, period='1y')

# ボリンジャーバンドの計算
def calculate_bollinger_bands(data, window=20, num_sd=2):
    data['SMA'] = data['Close'].rolling(window=window).mean()  # SMAの計算
    data['STD'] = data['Close'].rolling(window=window).std()    # 標準偏差の計算
    data['Upper Band'] = data['SMA'] + (data['STD'] * num_sd)  # 上バンドの計算
    data['Lower Band'] = data['SMA'] - (data['STD'] * num_sd)  # 下バンドの計算
    return data

data = calculate_bollinger_bands(data)

これで市場の動向を視覚化する準備が整いました。

スクイズの発見

ボリンジャーバンドのスクイズを検出するためには、バンドの幅が狭くなることを確認する必要があります。これは、次のような条件で検出できます:

  1. 上バンドと下バンドの幅が過去一定期間の最小値以下になった場合。
  2. バンドの収束期間中に価格が上昇または下降する。

次のコードは、スクイズを検出するための条件を実装しています。

# スクイズ検出
def detect_squeeze(data, min_bband_width=0.02):
    data['BandWidth'] = data['Upper Band'] - data['Lower Band']  # バンド幅の計算
    data['Squeeze'] = data['BandWidth'] < min_bband_width  # スクイズの検出
    return data

data = detect_squeeze(data)

このコードでは、ボリンジャーバンドの幅(上バンドと下バンドの差)が最小値よりも小さければ、スクイズが発生していると判断します。

スクイズ後のトレードアプローチ

スクイズが発生した後は、価格が上昇または下降する可能性があるため、トレードのエントリーポイントを決定する必要があります。このポイントを見極めるためには、スクイズの発生から価格がバンドを抜けるタイミングを確認します。

以下は、このロジックを基にしたトレード戦略の実装コードです:

def trade_signal(data):
    signals = []
    for i in range(len(data)-1):
        if data['Squeeze'].iloc[i] and data['Close'].iloc[i] > data['Upper Band'].iloc[i]:
            signals.append("Buy")  # 上バンドを超えたら「Buy」
        elif data['Squeeze'].iloc[i] and data['Close'].iloc[i] < data['Lower Band'].iloc[i]:
            signals.append("Sell")  # 下バンドを下回ったら「Sell」
        else:
            signals.append("Hold")  # その他は「Hold」
    data['Signal'] = signals
    return data

data = trade_signal(data)

この関数は、スクイズが発生した状態で価格が上バンドを超えれば「Buy」、下バンドを下回れば「Sell」、それ以外は「Hold」といったトレードシグナルを生成します。

データの可視化

スクイズの検出やトレードシグナルを確認するために、データを可視化することは非常に重要です。以下のコードを使って、matplotlibで結果を可視化します。

import matplotlib.pyplot as plt

def plot_bollinger_bands(data):
    plt.figure(figsize=(12,6))
    plt.plot(data['Close'], label='Close Price', color='blue')  # 終値のプロット
    plt.plot(data['SMA'], label='SMA', color='orange')  # SMAのプロット
    plt.plot(data['Upper Band'], label='Upper Band', color='green')  # 上バンドのプロット
    plt.plot(data['Lower Band'], label='Lower Band', color='red')  # 下バンドのプロット

    buy_signals = data[data['Signal'] == 'Buy']  # Buyシグナルのデータ
    sell_signals = data[data['Signal'] == 'Sell']  # Sellシグナルのデータ

    plt.scatter(buy_signals.index, buy_signals['Close'], marker='^', color='green', label='Buy Signal', s=100)  # Buyシグナルの散布図
    plt.scatter(sell_signals.index, sell_signals['Close'], marker='v', color='red', label='Sell Signal', s=100)  # Sellシグナルの散布図

    plt.title(f'Bollinger Bands and Trading Signals for {symbol}')
    plt.legend()
    plt.show()

plot_bollinger_bands(data)

このコードを実行することで、ビットコインの価格、ボリンジャーバンド、およびトレードシグナルを視覚化できます。

まとめ

ボリンジャーバンドを使用したスクイズの検出は、ビットコイン取引において非常に有効な手法です。Pythonを使用することで、データの取得、分析、可視化を一貫して行うことができ、わかりやすい形でトレードシグナルを引き出せます。この手法をマスターすることで、取引戦略を一段と高めることができるでしょう。是非、自身のトレードに役立ててみてください。


【お知らせ】
システム全体のインフラ構成や、より詳細な統計検証データについては、プロフィール欄に記載のリンク先(技術メディア)にて随時公開しています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?