Pythonでアルティメット・オシレーターを計算してみる。アルティメット・オシレーターの計算方法や使い方まとめ。
FXのテクニカル指標「アルティメット・オシレーター」をPythonで計算する方法。アルティメット・オシレーターの計算方法や使い方をまとめました。
こんばんは、新米データサイエンティスト(@algon_fx)です。先週は本業が忙しく、おまけに週末は風邪を拗らせてしまい、ほとんど勉強をする時間が取れませんでした。。ゆっくり寝て休んて、ジムで汗を流してきたら、すっかり元気になりました!
さて、今日はあまり時間もありませんので、以前に勉強した「アルティメット・オシレーター」をPythonで処理する方法をまとめたいと思います。(参考:Pythonでテクニカル指標シリーズ)
アルティメット・オシレーターですが、何よりも名前がかっこよいですよね。アルティメット=最終兵器。私は裁量トレードで使ったことはないんですが、海外のトレードブログなどではよく登場するテクニカル指標でもあります。
【人気記事】
アルティメット・オシレーターとは?
考え方の方向性としては、「DMI(方向性指数)」と少し似ているのですが、「買われ過ぎ」や「売られ過ぎ」を示す、名前の通りオシレーター指標の一つです。
こちらの指標も例に漏れず考案されたのが1985年。テクニカル指標はどれもこれも年季が入っているのが、本当にすごいですよね。機械学習の指標やアルゴリズムは、それこそ日進月歩で進化を遂げているのに対して、FXのテクニカル指標はどれも20〜30年前の指標なのが、面白いです。
で、この「アルティメット・オシレーター」ですが、大きな特徴の一つとして「従来のオシレーターの欠点を克服するために考えられた指標」なんです。
先述した通りDMI(方向性指数)と似ていると話しましたが、その理由として、アルティメット・オシレーターも「True Range」、つまり相場の強弱に合わせて計測期間を調整する指標となっています。(だから、計算がややこしい!)
アルティメット・オシレーターの計算方法
次に、アルティメット・オシレーターの計算方法を考えてみましょう。アルティメット・オシレーターの数値を計算するにために、主に2つの要素をレートから処理しなくてはいけません。
まずは「BP=Buying Power」と呼ばれる指標です。これは直訳すると「買いの力」という意味で、要はどれくらい買いの圧力がかかっているかの数値となります。BPの求め方は下記の通りです。
BPは、当日の終値から当日の安値または前日の終値の低い方を引いたものです。
アルティメット・オシレーターを計算する上で大事な2つ目の指標が「True Rage」となります。True Rageですが、実質変動幅と訳されるます。また表記は「TR」とよく表されるみたいです。
これは(あ)当日の高値 – 当日の安値、(い)当日の高値 – 前日の終値、(う)前日の終値 – 当日の安値の3つを計算して、(あ)と(い)の比較、(あ)と(う)の比較をして、大きい方を採用します。
さて、BP(Buying Power)とTR(True Range)の2つの指標の計算がわかったところで、いよいよ次はアルティメットな奴が計算できます。計算方法は下記の通りです。
アルティメット・オシレーターですが、もともと考案されたデフォルトでは7日、14日、28日を使うのが推奨されているようです。上記のように、それぞれの期間のBPとTRの合計を加味して処理を行い「基本値」を算出します。基本値が出たら、最後に下記の計算をすることで「アルティメット・オシレーター」の最終的な値を算出することが可能です。
シリーズでテクニカル指標の計算を続けていますが、だんだん、コツというか処理が読めてきました(笑)。これは勉強の良い副産物ですね。
Pythonでアルティメット・オシレーターを処理する
では、実際にPythonを使って、この少し中二病の匂いが漂う最終兵器的なオシレーターを処理してみましょう。まずは、必要なライブラリーからインポートしましょう。
1 2 3 4 5 6 7 8 9 10 11 |
# アルティメット・オシレーターを処理するためのライブラリー import pandas as pd from datetime import datetime import matplotlib.pyplot as plt import time import numpy as np from six.moves import range %matplotlib qt |
今回使うレートですが、毎度おなじみのビットコインのスクレイピングしたレートを使いましょう。こちらですが、日足で期間は2018年1月〜現在までをスクレピングします。
1 2 3 4 5 6 |
# コインマーケットキャップからデータをスクレイピング bit = pd.read_html("https://coinmarketcap.com/currencies/bitcoin/historical-data/?start=20180101&end="+time.strftime("%Y%m%d"))[0] bit = bit.assign(Date=pd.to_datetime(bit['Date'])) bit['Volume'] = bit['Volume'].astype('int64') |
次に、こちらのビットコインのレートのデータフレームを計算しやすいように切り分けてあげましょう。計算が複雑なテクニカル指標は、切り分けて処理した方が、ミスが少ないのです。(体験談)
1 2 3 4 |
# レートのデータフレームを切り分ける date, closep, highp, lowp, openp, volume = bit['Date'], bit['Close**'], bit['High'], bit['Low'], bit['Open*'], bit['Volume'] |
では、アルティメット・インディケーターの処理に入りましょう。計算方法でも記述しましたが2つの指標を求めなくては、アルティメット・インディケーターの計算は行えません。まずは、TR(True Range)の計算をしてあげましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# True Rangeの計算 def fill_for_noncomputable_vals(input_data, result_data): non_computable_values = np.repeat( np.nan, len(input_data) - len(result_data) ) filled_result_data = np.append(non_computable_values, result_data) return filled_result_data def true_range(close_data, period): tr = [np.max([np.max(close_data[idx+1-period:idx+1]) - np.min(close_data[idx+1-period:idx+1]), abs(np.max(close_data[idx+1-period:idx+1]) - close_data[idx-1]), abs(np.min(close_data[idx+1-period:idx+1]) - close_data[idx-1])]) for idx in range(period-1, len(close_data))] tr = fill_for_noncomputable_vals(close_data, tr) return tr |
以前にDMI(方向性指数)の時にTrue Rageを算出しましたが、あえて今回は別の方法です。こちらのコードですが、Pytiというテクニカル指標のPythonライブラリを参照しました。
次はBuying Power(BP)を計算してあげましょう。こちらは、当日の終値から当日の安値または前日の終値の低い方を引いたものでしたね。
1 2 3 4 5 6 7 |
# BPを計算する def buying_pressure(close_data, low_data): bp = [close_data[idx] - np.min([low_data[idx], close_data[idx-1]]) for idx in range(1, len(close_data))] bp = fill_for_noncomputable_vals(close_data, bp) return bp |
これでアルティメット・オシレーターを為す2つの重要な指標「TR」と「BP」の計算はおっけーです。あとは、これらのBPとTRを使ってアルティメット・オシレーターの「標準値」を計算するための、異なる期間でヘルパーを書いてあげます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# Periodを指定して必要な処理を行う def avg_helper(close_data, low_data, period): bp = buying_pressure(close_data, low_data) tr = true_range(close_data, period) avg = [sum(bp[idx+1-period:idx+1]) / sum(tr[idx+1-period:idx+1]) for idx in range(period-1, len(close_data))] avg = fill_for_noncomputable_vals(close_data, avg) return avg # 7日間 def average_7(close_data, low_data, period=7): return avg_helper(close_data, low_data, period) # 14日間 def average_14(close_data, low_data, period=14): return avg_helper(close_data, low_data, period) # 28日間 def average_28(close_data, low_data, period=28): return avg_helper(close_data, low_data, period) |
いよいよ、最後は主役となるアルティメット・オシレーターの計算を行います。UO(Ultimate Oscillator)自体の計算は、さほど難しくありませんでしたね。
1 2 3 4 5 6 7 8 9 |
# アルティメット・オシレーターの計算 def ultimate_oscillator(close_data, low_data): a7 = 4 * average_7(close_data, low_data) a14 = 2 * average_14(close_data, low_data) a28 = average_28(close_data, low_data) uo = 100 * ((a7 + a14 + a28) / 7) return uo |
では、実際に先ほどスクレイピングしたビットコインの日足のレートを基に、アルティメット・オシレーターを計算してみましょう。
1 2 3 4 |
# 終値、安値を渡してアルティメット・オシレーターの計算 uo = ultimate_oscillator(closep,lowp ) |
大丈夫そうですね。では、Matpltlibを使ってビットコインの終値チャートと、下段にアルティメット・オシレーターの指標を表示して見ましょう。
1 2 3 4 5 6 7 8 9 |
# アルティメット・オシレーターをプロッティング plotDate = date fig, (ax1, ax2) = plt.subplots(2,1, gridspec_kw = {'height_ratios':[3, 1]}) ax1.plot(plotDate, bit['Close**']) ax2.plot(plotDate, uo, 'b') plt.legend() plt.show() |
大丈夫そうですね!
まとめと次の課題
今日はテクニカル指標「アルティメット・オシレーター」をPythonで計算する方法、アルティメット・オシレーターの計算方法まとめました。
基本的な超短期〜デイトレでやっていたので、実戦でアルティメット・オシレーターを使ったことはないのですが、計算の仕方的にはDMIのような考え方が取り入れらており、少し面白いなと感じました。
オシレーター系の指標は、単体で使われるよりも、他の指標や平均足などと併せて使われる方が多いと思います。今後の課題としては、オシレーター系の指標と様々な組み合わせをして、バックテスト比較をしてみたいです。
ブログ読んでいただきありがとうございます!Twitterでも色々と発信しているので、是非フォローお願いします!
ディスカッション
コメント一覧
まだ、コメントがありません