0
Help us understand the problem. What are the problem?

posted at

updated at

マージしたチャートデータからテクニカル指標を計算する(HV編)

はじめに

前記事

  1. auカブコム証券のkabuステーションREST APIをcurlで叩く
  2. auカブコム証券のkabuステーションREST APIをjava(generated by the swagger code generator)で叩く
  3. auカブコム証券のkabuステーションREST APIの残高照会をcurlとjavaで叩く
  4. auカブコム証券のkabuステーションREST APIの残高照会から先物OPのdeltaを計算する
  5. auカブコム証券のkabuステーションREST APIのテスト用モックサーバーを作る
  6. auカブコム証券のkabuステーションREST APIの認証済TOKENをファイル管理する
  7. auカブコム証券のkabuステーションREST APIで自前のトレイル注文を作ってみる(情報収集編)
  8. auカブコム証券のkabuステーションREST APIで自前のトレイル注文を作ってみる(注文発注編)
  9. auカブコム証券のkabuステーションREST APIで自前のトレイル注文を作ってみる(ツール完成編)
  10. auカブコム証券のkabuステーションREST APIで自前のリピート注文を作ってみる(注文約定調査編)
  11. auカブコム証券のkabuステーションREST APIで自前のトレイル注文の改善(トレイル幅の動的拡張)
  12. auカブコム証券のkabuステーションREST APIで自前のリピート注文を作ってみる(設計、検証用実装編)
  13. auカブコム証券のチャートデータの日付を調整する
  14. auカブコム証券のkabuステーションPUSH APIのサンプル
  15. auカブコム証券のkabuステーションREST APIで自前のリピート注文を作ってみる(リファクタリング編)
  16. auカブコム証券のkabuステーションPUSH APIを受信してCSVファイルへ保存する
  17. 5分足の時刻を列挙する
  18. 保存した4本値チャートデータの終値と、PUSH APIで受信したチャートデータをマージする
  19. マージしたチャートデータからテクニカル指標を計算する(SMA6,SMA12,SMA24編)
  20. マージしたチャートデータからテクニカル指標を計算する(ボリンジャーバンド編)
  21. auカブコム証券のkabuステーションREST APIで自前のトレイル注文の改善(前回実行時からの高値/安値)
  22. auカブコム証券のkabuステーションREST APIで自前のトレイル注文の改善(残高管理方法変更)
  23. マージしたチャートデータからテクニカル指標を計算する(MACD編)
  24. auカブコム証券のkabuステーションPUSH APIを受信してCSVファイルへ保存する(複数銘柄対応版)
  25. auカブコム証券のkabuステーションPUSH APIで受信した気配情報対応
  26. 保存した4本値チャートデータと、PUSH APIで受信したチャートデータをマージした4本値を出力する

さて、次はHV(ヒストリカルボラティリティ)を計算します。
ただし、読み込む元データが5分足なので、5分足の年率換算でどうにもうまくいっていないので、相対的に比較するしかないです。
後から、元データのファイルを整理して、日足で計算して検証する予定です(これまた1年が365日なのか250日なのか・・・)。

前日比の自然対数の配列

いきなりHVの元となる標準偏差は計算できないので、1つ配列を用意して、前処理で前日比の自然対数を計算します。

		// 2件目以降の前日比の自然対数を求める
		double[] ratio = new double[chartList.size()];
		for (int i = 1; i < chartList.size(); i++) {
			int p1 = chartList.get(i).closePrice;
			int p0 = chartList.get(i - 1).closePrice;
			double r = (double) p1 / (double) p0;
			ratio[i] = Math.log(r);
		}

HVの計算

標準偏差の計算は、ボリンジャーバンドと同じなので、最初から2乗和と和の2つを計算して、20個前のデータをずらしていきます。

		// 標準偏差を求める
		double sqr = 0;
		double sum = 0;
		int cnt = 0;
		for (int i = 1; i < ratio.length; i++) {
			ChartInfo ci = chartList.get(i);
			System.out.printf("%s,%d,%d", ci.date, ci.closePrice, ci.flag);
			double r = ratio[i];
			if (cnt < 20) {
				sqr += r * r;
				sum += r;
				cnt++;
			} else {
				double r_20 = ratio[i - 20];
				sqr += r * r - r_20 * r_20;
				sum += r - r_20;
			}
			if (cnt == 20) {
				double mean = (double) sum / cnt;
				double variance = (double)sqr / cnt - mean * mean;
				double sd = Math.sqrt(variance);
				double hv = sd * Math.sqrt(250 * 20 * 60 / 5);
				System.out.printf(",%.5f,%.5f", sd, hv);
			}
			System.out.println();
		}

問題は最後のhvの計算のsqrt(250 * 20 * 60 / 5)が、5分足なので、1時間に12本なのは間違いないはずだが、1日が24時間なのか日中+夜間で20時間なのか日中のみ6.5時間なのか、さらに1年が365日なのか250日なのか。謎が多く、適当に変えても、チャートに出てくる数値と違うので諦めた。

2022/05/27 05:00:00,26940,2,0.00066,0.16154
2022/05/27 05:05:00,26930,2,0.00065,0.16021
2022/05/27 05:10:00,26925,2,0.00065,0.15949
2022/05/27 05:15:00,26930,2,0.00065,0.15988
2022/05/27 05:20:00,26915,2,0.00065,0.15833
2022/05/27 05:25:00,26920,2,0.00065,0.15828
2022/05/27 05:30:00,26925,2,0.00065,0.15885
2022/05/27 05:35:00,26925,2,0.00063,0.15506
2022/05/27 05:40:00,26925,2,0.00057,0.13948
2022/05/27 05:45:00,26920,2,0.00053,0.12886
2022/05/27 05:50:00,26920,2,0.00052,0.12790
2022/05/27 05:55:00,26920,3,0.00050,0.12212
2022/05/27 06:00:00,26940,2,0.00052,0.12841

試しにsdも表示したら、最後が0.00052で100倍すると0.052だけど、画面に0.05って出ているのだな。これが。
日足だと20.91だから%表示???

追記:日足のHVを表示する。

実は日足の日付変更線を勘違いしていたので、ツールでマージできないですが、5/30 15:30ごろにチャートデータをダウンロードして、マージすると、100%ダウンロードしたデータなので、仮でChartData1d.txtを作成して、このファイルを読んでHVを計算してみた。

結果は263.1日でほぼ近い値になりますが、これまた意味不明ですが、だいたい正しい値が計算できています。

	private static final String CHART_TXT_FILEPATH = DIRPATH + "ChartData1d.txt";

	double hv = sd * Math.sqrt(263.1);

前日の日付に調整してしまっているので、夜間16:30の時点の日付です。
なので、5/27の終値27400は、5/30 15:15の現値。
100倍していないので、HV21%が0.21です。

2022/05/23,26740,1,0.01402,0.22740
2022/05/24,26680,1,0.01369,0.22201
2022/05/25,26610,1,0.01332,0.21606
2022/05/26,26810,1,0.01261,0.20454  < 20.46%
2022/05/27,27400,1,0.01342,0.21773

chart_20220530

githubソース

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?