【Pine Script完全ガイド】特定パターンの抽出コード〜Larry Williamsインジケーターまで

描画ツールは様々あり、特にPythonのmatplotlibなどは描画ツールとしてとても優秀です。

Pythonだけでも描画できますが、やはり見やすさだったりはすでにしっかりと完成されたプラットフォームの方が見やすかったりします。

ここではtradingviewに搭載されている言語であるpineスクリプトを使って、付加価値をつけるコードをいくつかピックアップしてシェアしたいと思います。

各種テクニカル分析に関してはこちらの【保存版】Pythonテクニカル分析大全にてチェックしてください。

【保存版】Pythonテクニカル分析大全〜ライブラリ徹底ガイド

Trading viewとは

TradingViewは、金融市場のチャート分析、ソーシャルネットワーキング、トレーディングを一体化したプラットフォームです。

これは、個人投資家やプロのトレーダー向けに多様なチャートツール、テクニカル分析指標、実際の取引データを提供し、利用者が市場動向を分析し、投資戦略を練るのをサポートします。

TradingViewは、株式、外国為替、仮想通貨、先物など幅広い市場に対応し、リアルタイムの価格データと豊富なチャートオプションをユーザーに提供しています。

重要な特徴の一つは、強力でユーザーフレンドリーなチャート作成ツールです。

ユーザーは、さまざまなテクニカル分析ツールやチャートタイプを使って市場の動きを視覚化できます。

また、独自の「Pineスクリプト」言語により、カスタム指標やトレーディング戦略を作成し、共有することが可能です。

さらに、TradingViewはコミュニティ機能を備えており、トレーダー間でアイデアや戦略を共有し、議論することができます。

これにより、初心者から上級者まで幅広いレベルのユーザーが知識を深め、スキルを向上させることができます。

無料版と有料版の両方があり、無料版でも多くの機能を利用できますが、有料版ではより詳細な市場データや高度なチャート機能にアクセス可能。

毎年ブラックフライデーの時期にとんでもない割引率でセールスがありますので、有料版をお求めの際はよほどのことがない限りブラックフライデーを狙いましょう。

スクリプトの実行方法

このスクリプトをTradingViewのチャートに適用するには、「Pineエディタ」を開き、上記のコードをコピー&ペーストして「追加」または「保存して適用」をクリックします。

今回シェアするコードで簡単なバックテストなら視覚化できたりするので大変便利です。

キャンドルパターンの抽出

流れ星(シューティングスター)

例えば日足チャートを開いて流れ星(シューティングスター)の位置に黄色で印をつけるコードがこちら。

//@version=4
study("Shooting Star Pattern", shorttitle="Shooting Star", overlay=true)

// 流れ星の定義
isShootingStar() =>
    upperShadow = high - max(open, close)
    realBody = abs(close - open)
    lowerShadow = min(open, close) - low
    upperShadow > (2 * realBody) and realBody < (high - low) / 4 and lowerShadow < realBody

// 流れ星の検出
shootingStar = isShootingStar()

// マークのプロット(黄色の印)
plotshape(series=shootingStar, title="Shooting Star", location=location.abovebar, color=color.yellow, style=shape.triangleup, size=size.small)

ハンマーと逆ハンマー

ハンマーを青、逆ハンマーを赤で表示するコードにしています。

//@version=4
study("Hammer and Inverted Hammer Pattern", shorttitle="Hammer & Inverted Hammer", overlay=true)

// ハンマーと逆ハンマーの定義
isHammer() =>
    lowerShadow = min(open, close) - low
    upperShadow = high - max(open, close)
    realBody = abs(close - open)
    lowerShadow > (2 * realBody) and upperShadow < realBody

isInvertedHammer() =>
    lowerShadow = min(open, close) - low
    upperShadow = high - max(open, close)
    realBody = abs(close - open)
    upperShadow > (2 * realBody) and lowerShadow < realBody

// パターンの検出
hammer = isHammer()
invertedHammer = isInvertedHammer()

// マークのプロット
plotshape(series=hammer, title="Hammer", location=location.belowbar, color=color.blue, style=shape.triangleup, size=size.small)
plotshape(series=invertedHammer, title="Inverted Hammer", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)

どんな精度なのか一目でわかるのでとても便利ですよね。

エンゲルフィング

こちらは強気のエンゲルフィングを緑で、弱気のエンゲルフィングを赤で印をつけるコードです。

//@version=4
study("Engulfing Pattern", shorttitle="Engulfing", overlay=true)

// 強気のエンゲルフィング
bullishEngulfing() =>
    body1 = abs(close[1] - open[1])
    body2 = abs(close - open)
    close[1] < open[1] and close > open and open < close[1] and close > open[1] and body2 > body1 

// 弱気のエンゲルフィング
bearishEngulfing() =>
    body1 = abs(close[1] - open[1])
    body2 = abs(close - open)
    close[1] > open[1] and close < open and open > close[1] and close < open[1] and body2 > body1 

// パターンの検出
isBullishEngulfing = bullishEngulfing()
isBearishEngulfing = bearishEngulfing()

// マークのプロット
plotshape(series=isBullishEngulfing, title="Bullish Engulfing", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(series=isBearishEngulfing, title="Bearish Engulfing", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)

モーニングスター

//@version=4
study("Morning Star Pattern", shorttitle="Morning Star", overlay=true)

// モーニングスターの定義
isMorningStar() =>
    firstCandle = close[2] > open[2] and (close[2] - open[2]) > ((high[2] - low[2]) * 0.6)
    secondCandle = abs(close[1] - open[1]) < ((high[1] - low[1]) * 0.3)
    thirdCandle = close > open and (close - open) > ((high - low) * 0.6) and close[1] > open[1] and close > close[1]
    firstCandle and secondCandle and thirdCandle

// パターンの検出
morningStar = isMorningStar()

// マークのプロット
plotshape(series=morningStar, title="Morning Star", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)

イブニングスター

//@version=4
study("Evening Star Pattern", shorttitle="Evening Star", overlay=true)

// イブニングスターの定義
isEveningStar() =>
    firstCandle = close[2] < open[2] and (open[2] - close[2]) > ((high[2] - low[2]) * 0.6)
    secondCandle = abs(close[1] - open[1]) < ((high[1] - low[1]) * 0.3)
    thirdCandle = close < open and (open - close) > ((high - low) * 0.6) and close[1] < open[1] and close < close[1]
    firstCandle and secondCandle and thirdCandle

// パターンの検出
eveningStar = isEveningStar()

// マークのプロット
plotshape(series=eveningStar, title="Evening Star", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)

RSIの特定数値の抽出

次にRSIが25を下回ったときに赤い印と75を超えた時青い印をつけるコードをメモしておきます。

//@version=4
study("RSI Indicator with Signals", shorttitle="RSI Signals", overlay=true)

// RSIの計算
rsiValue = rsi(close, 14)

// RSIが25を下回った時のシグナル
rsiOversold = rsiValue < 25

// RSIが75を超えた時のシグナル
rsiOverbought = rsiValue > 75

// マークのプロット
plotshape(series=rsiOversold, title="Oversold (RSI < 25)", location=location.belowbar, color=color.red, style=shape.triangledown, size=size.small)
plotshape(series=rsiOverbought, title="Overbought (RSI > 75)", location=location.abovebar, color=color.blue, style=shape.triangleup, size=size.small)

ボリンジャーバンド

基本インジケーターとしても用意されていますが、ボリンジャーバンドのプロットコードと特定の条件抽出を考えてみます。

//@version=4
study("Bollinger Bands", shorttitle="BB", overlay=true)

// ボリンジャーバンドの設定
length = input(20, minval=1, title="Length")
src = input(close, title="Source")
mult = input(2.0, minval=0.001, maxval=50, title="Multiplier")

// ボリンジャーバンドの計算
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev

// ボリンジャーバンドのプロット
plot(basis, color=color.red, title="Middle Band")
p1 = plot(upper, color=color.green, title="Upper Band")
p2 = plot(lower, color=color.blue, title="Lower Band")

fill(p1, p2, color=color.purple, transp=90, title="Background")

ボリンジャーバンドの乖離に印をつける。

まずは乖離を定義しなければいけません。

標準偏差(シグマ)は、リターンのバラつきを示し、金融商品のリスクを表します。

一般的にボリンジャーバンドは、移動平均線からの1標準偏差を±1~3倍して表示し、株価の上昇・下落範囲を示してくれます。

±2σ範囲に株価が約95%収まるとされ、これを超えると異常とみなされます。

-2σを下回ると買い、+2σを超えると売りのタイミング。

順張りでは、バンド幅が狭い時に+2σを超えると上昇トレンドのサインとなるという考察が一般的です。

  • 株価が±1σの範囲内に収まる確率:約68%
  • 株価が±2σの範囲内に収まる確率:約95%
  • 株価が±3σの範囲内に収まる確率:約99%

この一般的な基準値、つまり-2σを下回る、+2σを超えるを異常条件として定義し、異常時に赤い印をつけるコードを書いてみましょう。

(-2σを下回る時に赤の印、+2σを超えるときに青の印としています)

//@version=4
study("Bollinger Bands with Signals", shorttitle="BB with Signals", overlay=true)

// ボリンジャーバンドの設定
length = input(20, minval=1, title="Length")
src = input(close, title="Source")
mult = input(2.0, minval=0.001, maxval=50, title="Multiplier")

// ボリンジャーバンドの計算
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev

// -2σを下回る時のシグナル
crossUnderLowerBand = close < lower

// +2σを超える時のシグナル
crossOverUpperBand = close > upper

// ボリンジャーバンドとマークのプロット
plot(basis, color=color.red, title="Middle Band")
plot(upper, color=color.green, title="Upper Band")
plot(lower, color=color.blue, title="Lower Band")
plotshape(series=crossUnderLowerBand, title="Cross Under -2σ", location=location.belowbar, color=color.red, style=shape.triangledown, size=size.small)
plotshape(series=crossOverUpperBand, title="Cross Over +2σ", location=location.abovebar, color=color.blue, style=shape.triangleup, size=size.small)

こうしてみると、例えばSP500のような潜在的な買いバイアスがある銘柄だと下落時、つまり-2σを下回る時のシグナルに対しての逆張りの有用性が高いように個人的には感じました。

Larry Williamsインジケーター

ここからはコミュニティー内で見つけた少し変わったインジケーターを解説しながらシェアしていきます。

オープンソースですので、コピペでOKだと思います。

study("CM_Williams_Vix_Fix", overlay=false)
pd = input(22, title="LookBack Period Standard Deviation High")
bbl = input(20, title="Bolinger Band Length")
mult = input(2.0    , minval=1, maxval=5, title="Bollinger Band Standard Devaition Up")
lb = input(50  , title="Look Back Period Percentile High")
ph = input(.85, title="Highest Percentile - 0.90=90%, 0.95=95%, 0.99=99%")
pl = input(1.01, title="Lowest Percentile - 1.10=90%, 1.05=95%, 1.01=99%")
hp = input(false, title="Show High Range - Based on Percentile and LookBack Period?")
sd = input(false, title="Show Standard Deviation Line?")

wvf = ((highest(close, pd)-low)/(highest(close, pd)))*100

sDev = mult * stdev(wvf, bbl)
midLine = sma(wvf, bbl)
lowerBand = midLine - sDev
upperBand = midLine + sDev

rangeHigh = (highest(wvf, lb)) * ph
rangeLow = (lowest(wvf, lb)) * pl


col = wvf >= upperBand or wvf >= rangeHigh ? lime : gray


plot(hp and rangeHigh ? rangeHigh : na, title="Range High Percentile", style=line, linewidth=4, color=orange)
plot(hp and rangeLow ? rangeLow : na, title="Range High Percentile", style=line, linewidth=4, color=orange)
plot(wvf, title="Williams Vix Fix", style=histogram, linewidth = 4, color=col)
plot(sd and upperBand ? upperBand : na, title="Upper Band", style=line, linewidth = 3, color=aqua)

このインジケーターはLarry Williamsによって開発されたもので、株式指数のVIX(ボラティリティ指数)に似た読み取りを提供するが、全ての資産クラスに適用可能なものと理解されます。

このインジケーターは、特定の「パーセンタイルベースのハイライトバー」を使用してカスタマイズされており、ユーザーは自身の資産クラスに合わせて設定を微調整する必要があるようです。

標準設定はデイリーチャート向けに設計されているものの、イントラデイチャート(日中の短い時間足)でも効果的に機能するとのことです。

具体的な機能としては、以下の点が挙げられます:

  1. Williams Vix Fix (WVF): これは、過去の一定期間の最高値から現在の安値を差し引き、その結果を最高値で割った値に基づいて計算されます。これはVIX指標に似たもので、市場の恐怖や極端な価格動きを検出するのに使われます。
  2. ボリンジャーバンド: WVFに基づいて、ボリンジャーバンドが計算されます。これには標準偏差と移動平均が使われ、市場のボラティリティの範囲を示します。
  3. パーセンタイル範囲: このインジケーターは、特定の期間におけるWVFの最高値と最低値に基づいて、パーセンタイル範囲を計算します。これは、極端な市場のピークや底を識別するのに役立ちます。
  4. カスタマイズ可能な設定: ユーザーは、ボリンジャーバンドの長さ、標準偏差の倍数、パーセンタイル計算のための期間など、様々なパラメータをカスタマイズできます。
  5. 可視化: このインジケーターは、特定の条件(例えば、WVFがボリンジャーバンドやパーセンタイル範囲を超えた場合)に基づいて、チャート上にヒストグラムやラインを描画します。

このインジケーターは、特に市場の過熱や過冷状態を検出するために有用であり、トレーダーが市場の転換点を識別するのに役立ちます。

確かにSP500を例にインジケーターをプロットするとかなり有用性が高いと個人的には感じます。

上部へスクロール