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

posted at

updated at

【v3】auカブコム証券のkabuステーションREST APIの残高照会から先物OPのdeltaを計算する

はじめに

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

前回で、残高照会のリストを取得できたので、日経225先物OPに限定して、トータルのdeltaを計算して表示する。

事前準備

前記事の残高照会の続きです。

ツール

変わっていないので省略。

PositionsSuccessの判定

getSide():1:売、2:買。deltaの符号となる。
getLeavesQty():数量。deltaを整数倍する。
getSecurityType():null:先物OP以外、101:日経225先物、901:日経平均225ミニ先物、103:日経225OP。これ以外は無視。
getSymbol():OPの場合は別途deltaを取得するための主キー。

OPの時価情報

OPのGreeksを取得するには、シンボルに、2:日通しを指定する。
建玉が多数あると、1秒あたり10リクエストの制限に引っかかるので、毎回120ミリ秒スリープしておく。

getDelta():delta値。

完成

前回の最後に作ったAuthorizedTokenクラスと組み合わせて、メインを作る。

public class Main {
	private static InfoApi infoApi = new InfoApi();
	
	public static void main(String[] args) throws ApiException {
		{
	        String X_API_KEY = AuthorizedToken.getToken();
	        String product = null;
	        String symbol = null;
	        String side = null;
	        String addinfo = null;
	        List<PositionsSuccess> response = infoApi.positionsGet(X_API_KEY, product, symbol, side, addinfo);

	        double totalDelta = 0.0;
	        for (int i = 0; i < response.size(); i++) {
		        PositionsSuccess pos = response.get(i);
		        int sign = sign(pos.getSide());
		        int qty = (int)(sign * pos.getLeavesQty());
		        Integer type = pos.getSecurityType();
		        if (type == null) { // ※先物・オプション銘柄以外はnull
		        	continue;
		        }
		        Double delta = null;
		        switch (type) {
		        case 101: // 日経225先物
		        	delta = 1.0;
		        	break;
		        case 901: // 日経平均225ミニ先物
		        	delta = 0.1;
		        	break;
		        case 103: // 日経225OP
		        	BoardSuccess board = board(pos.getSymbol());
		        	delta = board.getDelta();
		        	break;
		        default:
		        	break;
		        }
		        if (delta != null) {
			        System.out.println((i + 1) + ": " + pos.getSymbolName() + " " + qty + " " + delta + " " + (qty * delta));
			        totalDelta += (qty * delta);
		        }
	        }
	        System.out.println("total: " + totalDelta);
		}
	}

	static int sign(String side) {
		switch (side) {
		case "1":
			return -1;
		case "2":
			return 1;
		default:
			throw new RuntimeException();
		}
	}

	static BoardSuccess board(String symbol) throws ApiException {
        String X_API_KEY = AuthorizedToken.getToken();
        BoardSuccess response = infoApi.boardGet(X_API_KEY, symbol + "@2");
        try {
        	Thread.sleep(120); // 8.3req/sec
        } catch (Exception e) {
        }
        return response;
	}

}

実行してみると、

class TokenSuccess {
    resultCode: 0
    token: 94f7d24284524c7da91406414e4eafba
}
3: 日経225mini 22/04 1 0.1 0.1
4: 日経225mini 22/04 1 0.1 0.1
5: 日経225mini 22/04 1 0.1 0.1
6: 日経225mini 22/04 1 0.1 0.1
7: 日経225mini 22/04 2 0.1 0.2
8: 日経平均オプション 22/04 コール 27250 -1 0.0957 -0.0957
9: 日経平均オプション 22/04 コール 27500 -2 0.0715 -0.143
10: 日経平均オプション 22/04 プット 22000 1 -0.0915 -0.0915
11: 日経平均オプション 22/04 コール 27000 -2 0.127 -0.254
12: 日経平均オプション 22/04 プット 22000 1 -0.0915 -0.0915
total: -0.07569999999999996

先OPナビで確認したら、デルタ -0.0757だったので、大丈夫そうな感じ。

おまけ

APIとは直接関係ない改善点。

  • 同じOPを複数回リクエストを出すので、Map<String, BoardSuccess>でキャッシュすればよい
  • 毎回120ミリ秒のスリープは、10回分のタイムスタンプをキューに保存して、過去10個目の時刻から1秒待つ方が効率がよい
  • 見やすく整形してファイルに保存し、タスクスケジューラで一定時間ごとに起動すれば、ファイルを開くだけで確認できる
  • そのファイルをスマホからアクセスできる場所にアップ or 自宅Webサーバー公開すれば、出先から確認できる
  • deltaの絶対値が範囲外となったときにsendmailすれば、独自のアラート通知が運用できる

追記:後日

APIっていいなと思ったこと。
ほとんど同じなのでソース引用は省略しますが、deltaの他にganma, theta, vega, ivの表示とiv以外の集計もしたのです。
唯一、同じ内容を表示できる公式ページで比較し、多少の誤差を考慮してもganmaが-0.0004と-0.0002って何それ??

こちらはAPIで取得してdoubleで計算しているので、-0.00025となるはずで、公式の絶対値の大きい内訳を調べると、どうも値×数量を加算した結果を小数5位で四捨五入するのでなく、四捨五入した値に数量をかけて加算しているんじゃないかと。
-0.0001722=-0.000344≒-0.0003でなく、-0.000172≒-0.00022=-0.0004

0.0000472=0.000094≒0.0001でなく、0.000047≒0.00002=0.0000

CALLとPUTを別々に四捨五入しても、-0.0003+0.0001=-0.0002と-0.0004。
枚数が多ければ、誤差が広がりそう。

追記:eclipseプロジェクト

eclipseにmavenプロジェクトをImport (Maven/Existing Maven Projects)し直した。

追記:JUnitテスト拡充(ランキングAPI除外)

auカブコム証券のkabuステーションREST APIのテスト用モックサーバーを作る を使って、JUnitテストを実行できるようにした。
1つランキングAPIがFAILEDとなるが、モックサーバーがJSONでなく、""を返すので、@Ignoreをつけて除外した。

追記:JUnitテスト拡充(ランキングAPI追加)

モックサーバーの修正により、ランキングAPIが呼べるようになったので、@Ignoreを削除する。

追記:新市場区分に対応

kabu_STATION_API.yamlとjava-client-generated.zipを更新した。

追記:ソースを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?