search
LoginSignup
0

posted at

updated at

【v10】auカブコム証券のチャートデータの日付を調整する

はじめに

過去記事は「auカブコム証券のkabuステーションREST APIに関する記事一覧」。

なんでこんなことになるのか。。。

いきさつ

メニューからチャートデータの出力ができるので、過去データを使って、テクニカル指標のテストに使うことにした。

4/29に日足のファイルを保存したら、

2022/04/25,27075,27230,26475,26540,1273387
2022/04/26,26600,26850,26400,26650,1349144
2022/04/27,26540,26630,25965,26390,1308090
2022/04/28,26235,26880,26185,26860,1357538
2022/05/02,26995,27380,26890,27200,730935

なんで、5/2???

30分足を保存したら、

2022/04/28 14:15:00,26790,26840,26735,26835,51907
2022/04/28 14:45:00,26835,26880,26800,26860,75336
2022/04/28 15:15:00,26860,26860,26860,26860,5929
2022/05/02 16:30:00,26995,27055,26995,27020,37978
2022/05/02 17:00:00,27015,27090,27010,27090,24274
2022/05/02 17:30:00,27090,27160,27070,27155,29526
2022/05/02 18:00:00,27160,27210,27090,27095,40404
:
2022/05/02 22:30:00,27060,27070,26935,26965,64994
2022/05/02 23:00:00,26960,27025,26910,26925,52201
2022/05/02 23:30:00,26920,26970,26890,26965,36710
2022/05/02 00:00:00,26965,27030,26950,27005,31174
2022/05/02 00:30:00,27010,27050,26955,27000,27645
2022/05/02 01:00:00,27000,27135,26970,27130,25347

どうやら、夜間は翌営業日扱いとなるらしい。

対応案1 何もしない

うっかりソートすると、順番が変わってしまうので、その状態で移動平均なんか計算したら実際の値と異なるのでNGだが、ソートしなければ別に問題はないのかも。。。
リアルな時間経過が考慮するのなら別ですが、過去何本分のデータで計算するものばかりなので。

対応案2 前日の日付に調整する

要は2022/05/02を2022/04/28にしたいので、翌営業日は祝日を考慮すると面倒だが、前営業日なら過去データから、まず営業日カレンダーを作成して、検索すれば1つ前の日付ならすぐに取れそう。

	public static String searchCalendar(String date) {
		int idx = Collections.binarySearch(calendarList, date);
		if (idx > 0) {
			return calendarList.get(idx - 1);
		}
		return null;
	}

日足なら常に前営業日、分足ならhhが16時から23時まで前営業日に変更する。

これでOKかと思ったら、
2022/05/02 00:00:00
がそのまま残ってしまう。
実際の日付は
2022/04/29 00:00:00
で4/29は休日。

対応案3 16時から23時は前営業日、00時から06時は23時の日付の翌日

2022/04/27 15:15:00 -> 2022/04/27 15:15:00 そのまま
2022/04/28 16:30:00 -> 2022/04/27 16:30:00 4/28の前営業日
2022/04/28 23:30:00 -> 2022/04/27 23:30:00 4/28の前営業日
2022/04/28 00:00:00 -> 2022/04/28 00:00:00 4/28の前営業日の翌日(案2と変わらない)
2022/04/28 06:00:00 -> 2022/04/28 06:00:00 4/28の前営業日の翌日(案2と変わらない)
2022/04/28 08:45:00 -> 2022/04/28 08:45:00 そのまま
2022/04/28 15:15:00 -> 2022/04/28 15:15:00 そのまま
2022/05/02 16:30:00 -> 2022/04/28 16:30:00 5/2の前営業日
2022/05/02 23:30:00 -> 2022/04/28 23:30:00 5/2の前営業日
2022/05/02 00:00:00 -> 2022/04/29 00:00:00 5/2の前営業日の翌日(案2だと5/2)
2022/05/02 06:00:00 -> 2022/04/29 06:00:00 5/2の前営業日の翌日(案2だと5/2)

対応案4 独自のインデックス番号をつける

そのままだと誤解するので、連番でも振れば・・・
と思ったが、ザラ場でチャートデータを保存すると、出来高が少ないデータが保存され、後日のデータと比較すると、出来高の多い方を採用したいので、この日付からインデックス番号に変換する関数が必要なのだが、結局、最低でも案2の日付でソートできるようになっていないと、インデックスも昇順にならない。
ただし、昇順になればいいので、16時から23時を前日にする(営業日でなくてよい)。

関数は、日足ならyyyy * (12 * 31) + mm * 31 + ddのように毎月31日にする。

2022/04/27 15:15:00 -> 2022/04/27 15:15:00 そのまま
2022/04/28 16:30:00 -> 2022/04/27 16:30:00 4/28の前日
2022/04/28 23:30:00 -> 2022/04/27 23:30:00 4/28の前日
2022/04/28 00:00:00 -> 2022/04/28 00:00:00 そのまま
2022/04/28 06:00:00 -> 2022/04/28 06:00:00 そのまま
2022/04/28 08:45:00 -> 2022/04/28 08:45:00 そのまま
2022/04/28 15:15:00 -> 2022/04/28 15:15:00 そのまま
2022/05/02 16:30:00 -> 2022/05/01 16:30:00 5/2の前日
2022/05/02 23:30:00 -> 2022/05/01 23:30:00 5/2の前日
2022/05/02 00:00:00 -> 2022/05/02 00:00:00 そのまま
2022/05/02 06:00:00 -> 2022/05/02 06:00:00 そのまま

余談

そもそもチャートを表示するときに面倒だろう・・・と思って、ちゃんと日付を見たら、5/2になっていた。
きっと何度も1日勘違いしていた気がする。はっはっは。

結果

いろいろ考えたところ、過去データの検証なら、なんでもよいが、
過去データと、ザラ場の価格をマージして、指標を計算しようとすると、リアルな日時でないと面倒。

例:4/28 22:00からAPIで価格を取得し続けて、23:00に手動でチャートデータをダウンロードした場合、23:00までがチャートデータを使い、23:00以降をAPIのデータにしたい。
チャートデータ 4/28 23:00 -> 5/2 23:00
APIデータ 4/28 23:00

追記:案3で実装してみた

いつか役に立つ日が来るだろうということで、案3で実装した。

入力ディレクトリ:\tmp\chart
出力ディレクトリ:\tmp

MainChartCalendar

出力ファイル名:ChartCalendar.db

各種チャートデータを読み込んで、営業日のカレンダー(ChartCalendar.db)を作成する。
毎日チャートデータを取り込めば、常に翌営業日を取り込むので、カレンダーの保守は不要。
最も古い日付の前営業日は不明なので、手動で過去のカレンダーを調べて1件登録しておけばよい。

MainChartDataDaily

出力ファイル名:ChartData1d.db

日足用変換ツール。
1カラム目がyyyy/MM/ddを対象にする。
ファイル名でフィルターをかけているので、他の期間を対象にするには、chartType="1d"以外の条件分岐を追加する。

MainChartDataHourly

出力ファイル名:ChartData5m.db ChartData30m.db

時間足用変換ツール。
1カラム目がyyyy/MM/dd HH: mm:ssを対象とする。
ファイル名でフィルターをかけているので、5分足と30分足以外を対象にするには、chartType="5m","30m"以外の条件分岐を追加する。

追記:1分足を追加する。

MainChartDataHourlyの処理対象として、1分足(1m)を追加する。

追記:日足は終値を基準日にする。

日足の日付を前営業日に修正していたが、計算期間が前営業日の夜間の16:30~当日の昼間の15:15のため、日付を修正しない。

追記:ソースをarchiveブランチへ移動

最新版に移行し、もう使われることはないので、アーカイブする。

githubソース

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0