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

posted at

updated at

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

はじめに

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

19番目の記事でSMA、20番目の記事でボリンジャーバンドを計算したので、今回はEMAを計算し、最終的にMACDを計算します。

EMA

EMAの計算は、平滑定数a=2/(n+1)を使い、EMA=前日のEMA+a×(当日の価格-前日のEMA)で計算できます。
初項は、十分データ件数がある前提で大昔の結果を参照することはないので、1番目の価格とします。

		// 平滑定数を事前に計算する
		final double a5 = 2.0 / (5 + 1);
		final double a20 = 2.0 / (20 + 1);
		// 初項を初期化する
		ChartInfo ci = chartList.get(0);
		double ema5 = ci.closePrice;
		double ema20 = ci.closePrice;
		for (int i = 1; i < chartList.size(); i++) {
			ci = chartList.get(i);
			System.out.printf("%s,%d,%d", ci.date, ci.closePrice, ci.flag);
			ema5 += a5 * (ci.closePrice - ema5);
			ema20 += a20 * (ci.closePrice - ema20);

MACD

MACDはEMA5 - EMA20を計算します。
SignalはMACDのEMA9を計算します。
(説明にはSMA9と書いてありましたが、実際に計算するのはEMAより面倒で、実際にチャート画面と値を比較したらEMAで計算していたので、EMAを採用します)

初項を価格0円は有り得ないので、0でもよかったですが、Double.MIN_VALUEにしています。

		// 平滑定数を事前に計算する
		final double a9 = 2.0 / (9 + 1);
		// 初項を初期化する
		double signal9 = Double.MIN_VALUE;
		for (int i = 1; i < chartList.size(); i++) {
			ci = chartList.get(i);
			ema5 += a5 * (ci.closePrice - ema5);
			ema20 += a20 * (ci.closePrice - ema20);
			double macd = ema5 - ema20;
			if (signal9 == Double.MIN_VALUE) {
				signal9 = macd;
			} else {
				signal9 += a9 * (macd - signal9);
			}

実行結果

見やすいように手でスペースを追加しています。

2022/05/24 04:30:00,27065,2,27063.22,27070.57, -7.35,  -0.21
2022/05/24 04:35:00,27030,2,27052.15,27066.71, -14.56, -3.08
2022/05/24 04:40:00,27030,2,27044.77,27063.21, -18.44, -6.15
2022/05/24 04:45:00,27010,2,27033.18,27058.14, -24.96, -9.92
2022/05/24 04:50:00,27040,2,27035.45,27056.41, -20.96,-12.13
2022/05/24 04:55:00,27085,2,27051.97,27059.14, -7.17, -11.13
2022/05/24 05:00:00,27085,2,27062.98,27061.60,  1.38,  -8.63
2022/05/24 05:05:00,27115,2,27080.32,27066.69, 13.63,  -4.18
2022/05/24 05:10:00,27105,2,27088.55,27070.33, 18.21,   0.30
2022/05/24 05:15:00,27110,2,27095.70,27074.11, 21.59,   4.56
2022/05/24 05:20:00,27105,2,27098.80,27077.05, 21.74,   7.99
2022/05/24 05:25:00,27105,2,27100.87,27079.72, 21.15,  10.63
2022/05/24 05:30:00,27105,2,27102.24,27082.12, 20.12,  12.52
2022/05/24 05:35:00,27105,2,27103.16,27084.30, 18.86,  13.79
2022/05/24 05:40:00,27105,2,27103.77,27086.27, 17.50,  14.53
2022/05/24 05:45:00,27110,2,27105.85,27088.53, 17.32,  15.09
2022/05/24 05:50:00,27120,2,27110.57,27091.53, 19.04,  15.88
2022/05/24 05:55:00,27120,3,27113.71,27094.24, 19.47,  16.60
2022/05/24 06:00:00,27120,2,27115.81,27096.69, 19.11,  17.10

chart_20220523

追記:ソースを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
Help us understand the problem. What are the problem?