ピボットをPythonで書いてみる。ピボットプライスの使い方や計算式のまとめ。
こんばんは、新米データサイエンティスト(@algon_fx)です。私生活がドタバタしていて、なかなか勉強をする時間が割けないのが辛いところですが、仕事の方は比較的少しづつ前向きに進み出しており、嬉しいです。
今日もあまり時間が無く、本当は先日に口座開設したOANDA API v20を触りたいところではありますが、諦めていつものPytghon テクニカル指標シリーズを進めます。
今回はピボットの基本的な使い方や計算式、さらにPythonでピボット・プライスとそれに付随するサポートとレジスタンスの計算をしてみます。
【人気記事】
ピボットとは?
ピボットと聞くとエクセルのアレや、Pandasのアレを思い浮かべてしまうのは職業柄ですが、FXのテクニカル指標で使われる「ピボット」は過去の値動きが現在の為替レートへ与える影響を示す指標となっています。
ピボットの指標は前日の「高値」「安値」「終値」を使って、現在のサポートやレジスタンスを算出します。
また、特徴の一つとしてピボットは主に短期売買向けの指標です。
ピボットの計算方法
次はピボットの計算方法を見てみましょう。前述した通り、基本的には前の期間の「高値」「安値」「終値」を用います。
また、ピボットですが「ピボット・ポイント」と呼ばれる中心の指標を求めて、さらにサポート(支持線)の「S1」「S2」「S3」、レジスタンス(抵抗線)の「R1」「R2」「R3」と、全部で7種類の指標の計算を行います。
計算式は下記の通りで特に複雑な処理はありません。
PP(ピボット・ポイント)=(前日高値+安値+終値)÷3S1 = PP – (前日高値 – PP)
S2 = PP – (前日高値 – 前日安値)
S3 = S1 – (前日高値 – 前日安値)
R1 = PP + (PP – 前日高値)
R2 = PP + (前日高値 – 前日安値)
R3 = R1 + (前日高値 – 前日安値)
また、S3とR3は別の呼び方があり、S3をLow Break Out Price(LBOP)と呼び、R3はHigh Break Out Price(HBOP)と呼ばれます。
ピボットの使い方
上のピボットの計算式を見て分かりますが、基本として「前日(または一つ前の期間)」の指標となりますが、短期的なトレードの際に利用されます。
ピボットの使い方ですが、「逆張り」と「順張り」の2つに分けて簡単に見ていきましょう。
逆張りでピボットを使う
- サポート(S1&S2)で買い、S3を下抜けしたら損切り
- レジスタンス(R1&R2)で売り、R3を上抜けしたら損切り
順張りでピボットを使う
- レジスタンスの外枠R3で買いシグナル=上昇トレンドが始まったと想定
- サポートの外枠S3で売り=下降トレンドが始まったと想定
ちなみに一般的には前述した通りで期間は1ですが、期間を5や10など調整してピボットを使う方もいるみたいです。これも過去レートデータを使ってバックテスト行ってみたいですね。
ピボットをPythonで書いてみる(Pandas使用)
いよいよ本題、ピボットをPythonで書いて見ましょう。計算式は非常に単純ですが、ピボットプライスを本軸として、サポートを3つ、レジスタンスを3つと計算をする回数は多いです。
ちなみに今回は期間を1として計算をしてみました。
では、まずはおきまりの必要なライブラリをインポートしてあげましょう。
1 2 3 4 5 6 7 8 9 |
#ピボット指標を計算するためのライブラリ読み込み import pandas as pd import numpy as np import time import matplotlib.pyplot as plt import datetime %matplotlib qt |
次はいつものおきまりのドル円1分足のデータです。こちらで使っているCSVファイルですが、こちらの記事をご参考ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# ピボットの練習計算をするためのドル円データ # 1分足へ変換 & 200分へ切り分け df = pd.read_csv('USD_JPY_Week2.csv', index_col='DateTime', names=['Tid', 'Dealable', 'Pair', 'DateTime', 'Buy', 'Sell'], skiprows=1) df.index = pd.to_datetime(df.index) del df['Tid'] del df['Dealable'] del df['Pair'] min_1 = df.resample('1Min', how='ohlc') bmin = min_1.xs('Buy', axis=1, drop_level=True) bmin = bmin[0:200] bmin = bmin.fillna(method='ffill') |
上のコードを見ると分かりますが、このデータ…欠損値が多いです。あんまり良い練習データではないので、近日中に指標計算用のデータ取得の記事を書きます。とりあえず、今日は時間がないのでこのままピボットの処理をPandasで進めます。
さて、次はいよいよピボットの処理です。前述した通り、今回は期間を1として計算をしますので、 shift(1) で終値をずらしてあげて、PP、3つのサポート、3つのレジスタンスの計算をしてあげます。
1 2 3 4 5 6 7 8 9 10 11 12 |
# テクニカル指標「ピボット」をPython + Pandasで計算 pivot = pd.DataFrame() pivot['close'] = bmin['close'].shift(1) pivot['PP'] = ((bmin['high'] + bmin['low'] + bmin['close']) / 3) pivot['R1'] = (2 * pivot['PP'] - bmin['low']) pivot['S1'] = (2 * pivot['PP'] - bmin['high']) pivot['R2'] = (pivot['PP'] + bmin['high'] - bmin['low']) pivot['S2'] = (pivot['PP'] - bmin['high'] + bmin['low']) pivot['R3'] = (bmin['high'] + 2 * (pivot['PP'] -bmin['low'])) pivot['S3'] = (bmin['low'] - 2 * (bmin['high'] - pivot['PP'])) |
最後に、元データフレームのbminの close を入れて終値を戻してあげましょう。これで処理は大丈夫なはずなので、最後にpivotの最初の五行を表示させてあげます。
1 2 3 4 5 6 7 |
# もっとましな方法がありそうですがひとまずこれで… pivot['close'] = bmin['close'] # ではピボットのデータフレームを確認して見ましょう pivot.head() |
全くもってエレガントなコードではありませんが、まぁとりあえず計算はできたのでOKとしましょう。では、実際にplot()を使って終値とピボットの全ての7つの指標でチャートを作って見ます。
1 2 3 4 |
# ピボット(PP / S1-S3 / R1-R3)と終値を表示 pivot.plot() |
あぁ、前半の欠損値が多い部分は、ぜんぜん指標として役に立ってなさそうですね(笑)。やっぱり、早々にまともな別の練習用データを作ってあげなきゃです(笑)
まとめと次への課題
今回は短期トレードで役に立つテクニカル指標「ピボット」をPythonとPandasを使って計算をしてみました。
直前の期間の高値、安値、終値を指標としてもつピボットですが、短期的かつ一定の条件下であればうまく機能しような予感です。
次への課題としては。今回、計算をした通り基本的な期間「1」ですが、「5」や「10」など、様々な期間のピボットを計算して、検証してみたいですね。
以上です!ブログ読んでいただきありがとうございます!Twitterでも色々と発信しているので、是非フォローお願いします!
ディスカッション
コメント一覧
まだ、コメントがありません