ボリンジャーバンド戦略は、1980年代初頭にジョン・ボリンジャーによって開発されました。これは、資産の価格レベルとボラティリティを評価するために使用される非常に人気のあるテクニカル分析ツールです。ボリンジャーバンドは、3本の線で構成されており、中央の線はn期間の移動平均(通常は20日間の単純移動平均)で、上部バンドと下部バンドは通常、中央の線の上と下で2つの標準偏差に設定されます。

戦略の説明

  • 中央バンド: 資産のn期間の移動平均で、中央値の市場トレンドを表します。
  • 上部バンド: 中央バンドの2標準偏差上にあり、高ボラティリティの価格ゾーンを示します。
  • 下部バンド: 中央バンドの2標準偏差下にあり、低ボラティリティの価格ゾーンを示します。

取引シグナル

  • 買いシグナル: 価格が下部バンドに触れるか、それを下回る場合、資産が過小評価されている可能性があり、買いのチャンスを示唆します。これはしばしば市場の売り過ぎのシグナルと見なされます。
  • 売りシグナル: 価格が上部バンドに触れるか、それを上回る場合、資産が過大評価されている可能性があり、売りのチャンスを示唆します。これはしばしば市場の買い過ぎのシグナルと見なされます。

ボラティリティの変化
バンドの幅の変化は、市場のボラティリティの変化を反映しています。バンドが広がるとボラティリティが増加し、バンドが狭まるとボラティリティが減少していることを示します。

戦略の利点

  • 広い適用範囲: ボリンジャーバンド戦略は、株式、外国為替、商品など、さまざまな市場と時間枠に適用できます。
  • 視覚的な明瞭さ: ボリンジャーバンドの視覚的な性質により、市場での買われ過ぎや売られ過ぎの状態を簡単に識別できます。
  • 柔軟性: トレーダーは、移動平均期間や標準偏差の乗数を調整して、異なる市場の状況や取引スタイルに適応できます。

戦略の欠点

  • 遅行性: ボリンジャーバンドは過去のデータに基づくツールであるため、市場の動きに遅れる可能性があり、シグナルが遅れることがあります。
  • 誤ったシグナル: 範囲取引やトレンドのない市場では、ボリンジャーバンドは誤解を招くシグナルを生成することがあり、頻繁に誤った取引が発生することがあります。
  • 確認が必要: 取引の精度を向上させるためには、ボリンジャーバンドを相対力指数(RSI)やMACDなどの他の指標や分析ツールと組み合わせてシグナルを確認することが推奨されます。

実施の提案

ボリンジャーバンド戦略を使用する際、投資家はバックテストを行い、自分の取引スタイルに最適なパラメーター設定を決定するべきです。また、広範な市場環境を観察し、他のテクニカル指標からのシグナルを考慮して、誤ったシグナルを避け、エントリーとエグジットポイントを最適化することが重要です。

Javaコード例

import java.util.List;

public class BollingerBandsStrategy {
    public static void main(String[] args) {
        List<Double> prices = 
        int windowSize = 20; 
        double numStdDeviations = 2.0; 
        double upperBand;
        double lowerBand;

        for (int i = windowSize; i < prices.size(); i++) {
            List<Double> window = prices.subList(i - windowSize, i);
            double mean = calculateMean(window);
            double stdDev = calculateStandardDeviation(window, mean);

            upperBand = mean + numStdDeviations * stdDev;
            lowerBand = mean - numStdDeviations * stdDev;

            double currentPrice = prices.get(i);
            if (currentPrice > upperBand) {

            } else if (currentPrice < lowerBand) {

            }
        }
    }

    private static double calculateMean(List<Double> values) {
        double sum = 0.0;
        for (double value : values) {
            sum += value;
        }
        return sum / values.size();
    }

    private static double calculateStandardDeviation(List<Double> values, double mean) {
        double sumSquaredDiff = 0.0;
        for (double value : values) {
            double diff = value - mean;
            sumSquaredDiff += diff * diff;
        }
        double variance = sumSquaredDiff / values.size();
        return Math.sqrt(variance);
    }
}

Pythonコード例

import numpy as np
import pandas as pd

def bollinger_bands_strategy(prices, window_size=20, num_std_deviations=2):
    df = pd.DataFrame(prices, columns=['Close'])
    df['Mean'] = df['Close'].rolling(window=window_size).mean()
    df['Std'] = df['Close'].rolling(window=window_size).std()
    df['UpperBand'] = df['Mean'] + num_std_deviations * df['Std']
    df['LowerBand'] = df['Mean'] - num_std_deviations * df['Std']

    df['Signal'] = 0
    df.loc[df['Close'] > df['UpperBand'], 'Signal'] = -1  
    df.loc[df['Close'] < df['LowerBand'], 'Signal'] = 1  

    df['Position'] = df['Signal'].diff()

    return df

prices = [10.2, 11.4, 10.8, 12.1, 11.7, 10.9, 12.5, 11.8, 12.6, 13.2]
result = bollinger_bands_strategy(prices)

print(result)