特定の時間から売買を判定する時間アノマリー【TradingView】

はじめまして、ヒサギ(@phasespacegate)といいます。
自己紹介については、こちらをどーぞ。
またアノマリーについての検証などをつぶやいている垢「あのまりー(@iofluxtube)」がありますので、そちらもどーぞ。

参考資料

 時間系アノマリーについては、たくさんの方々が検証やbotの開発などを行っていますので、そちらも参考にしていただけると、より時間に対する興味や知識が深まるかと思います。

概要

 自分は、高頻度での取引を苦手としており、1日1回の取引をベースに利益が出せないか をアノマリーから検証してきました。そのためチャートを見る際も、基本的には時間足、主に1時間足を見ることにしています。
 今回の発端にもなったのが、「特定の時間での値動きはブラフ、またはその値動きから逆行することが多いのでは」と思い始めたことでした。そこで作成したのが、以下の載せますTradingViewで作成しましたソースコードになります。

ソースコード

 ソースコードについては、「設定」画面(歯車マーク)の直感性をあげているため、本職の方々からすれば不自然な書き方になっているかと思いますので、ご了承下さい。もっと勉強します...。
 またソースコードについては、TradingViewで用いる「Pine Script」の最新バージョン「Version5(v5)」ではなく、「Version4 (v4)」 を使用していますので、ご注意下さい。
 またnote記事とTradingViewを見比べるのが大変かと思いましたので、設定内容や動作については、ソースコード内のコメントに含めました。

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © hisagi19

//@version=4
strategy(title="時間アノマリー ストラテジー 01", overlay=false, initial_capital=100, currency="USD", default_qty_type=strategy.cash, default_qty_value=100, pyramiding=0, slippage=0, commission_type=strategy.commission.percent, commission_value=0.075)

// テスト対象範囲のFrom, To
// テスト開始日:初期値 2021/01/01 / テスト終了日:2021/12/31
from_time = input(title="テスト開始日", type=input.time, defval=timestamp("01 01 2021 00:00 +0900"))
to_time = input(title="テスト終了日", type=input.time, defval=timestamp("12 31 2021 00:00 +0900"))

// エントリー時間:初期値 0 / チェック開始時間:初期値 0 / 評価時間:初期値 1
entry = input(title="エントリー時間", type=input.integer, minval=0, maxval=23, defval=0)
check_hour = input(title="チェック開始時間", type=input.integer, minval=0, maxval=23, defval=0)
check_count = input(title="評価時間", type=input.integer, minval=1, maxval=23, defval=1)

// -------------------------------------
// 時間管理
hour_time = hour(time)
entry_time = (entry + 14) % 24
check_time = (check_hour + 15) % 24

// -------------------------------------
// ロジック
// チェック開始時間から評価時間の価格差(*1)
// チェック開始時間[0]とは「xx月oo日の00:00 の終値」
// 評価時間[1]とは「チェック開始時間から評価時間[1]前の1時間足の終値」
// 例:チェック開始時間:13 / 評価時間:3 の設定では「10月10日 13:00 の終値」から「10月10日 10:00」の価格差
diff_hour_price = if (hour_time == check_time)
   diff_price = close[0] - close[check_count]

// -------------------------------------
// エントリー
// エントリー時間の際、(*1)が 0より小さければならロング、それ以外ならショート
// エントリー時間[0]とは「xx月oo日の00:00 にエントリー」
// ただし過去の価格差を基本にしているため、エントリー時間 ≠ チェック開始時間 でなければいけない
if (time > from_time) and (time <= to_time)
   if (hour_time == entry_time)
       if (diff_hour_price[1] < 0)
           strategy.entry("long", strategy.long)
       else
           strategy.entry("short", strategy.short)

// -------------------------------------
// プロット
// 青の折れ線:チェック開始時間から評価時間の価格差(*1)
// 緑のBG:ロングエントリー
// 赤のBG:ショートエントリー
// グレーのBG:チェック開始時間
// 白の破線:ゼロライン
bg_entry = (entry + 15) % 24
bg_color = if (hour_time == bg_entry) and (diff_hour_price[1] > 0)
   color = color.red
else if (hour_time == bg_entry) and (diff_hour_price[1] < 0)
   color = color.lime
else if (hour_time == check_time)
   color = #4C4C4C
bgcolor(bg_color)
plot(diff_hour_price)
hline(0, title="Zero Line", color=#999999)

*注意*
 noteのソースコードの記載上、インデントが3スペースになっていますので、コピペを行う際には「4スペース」にして下さい。
 初期プロパティは、以下のようになっています。

スクリーンショット 2021-10-31 005303

検証内容

 この検証を行う上で必要なのは、
 1. エントリーする時間
 2. 特定の時間の値動き (チェック開始時間 と 評価時間 間の価格差)

 2021/01/01~2021/07/01

スクリーンショット 2021-10-31 005110

 自分がはじめに思っていたのは、
2. 特定の時間の値動きから逆行することが多いのでは」というところから始まりましたので、「日本時間 の日中の値動き」を疑っていました。ある程度の予測はありましたので、そこから
1. エントリーする時間は、日本時間 09:00~14:00の間」でエントリーをすることで、損益を右肩上がりにすることは容易でした。
 ただこちらのパラメータをそのまま運用していきますと、以下のようになります。

  2021/01/01~2021/11/01

スクリーンショット 2021-10-31 011819

 トレード回数120回 (07/16~) を越えたあたりから、成績が悪くなってきます。
 実際のパラメータにつきましては、ぜひ皆さん自身で見つけてみて下さい!新しい何かを発見できるかも知れません。

まとめ

 表題に「特定の時間から売買を判定する時間アノマリー」と過大広告のようにしてしまいましたが、このnote記事を読んで利益をすぐに出そうというのは難しいです。
 ただ自分が作成したソースコードを使って、
TradingViewでこんなことができるんだ」とか、
自分もエントリー時間や評価時間の結果が知りたかった」など、
遊んで頂けたら幸いと思い、この本記事を作成しました。

 自分自身、現在これとは別のアノマリーを使ったbotを運用している最中です。そちらに関しても、もっともっと強いbotterになれたら記事にしたいと思っています。

最後に

 本記事は、無料で読むことが出来ます。
もし「面白かった」「ソースコードありがとう」と思って投げ銭を頂けたら、次のbot開発への意欲やお昼代にしたいと思います。

 最後まで読んで頂き、ありがとうございました。

ここから先は

0字

¥ 100

もし宜しければサポートをお願い致します。 検証・bot開発意欲・bot運用費として利用させて頂きたいと思います。