/screening の filters にしきい値の単位を書けるようにしました
GET /screening の filters を field:op:value:unit の 4 セグメントで書けるようにしました。unit を書くと、その単位で書かれたしきい値をサーバがフィールドの単位へ換算します。
# 「時価総額 1,000 億円以上」
GET /v1/screening?filters=marketCap:gte:1000:hundred_million_jpy
# 「自己資本比率 70% 以上」(equityRatio の unit は ratio だが percent で書ける)
GET /v1/screening?filters=equityRatio:gte:70:percent
これまではしきい値の単位を書く場所が無く、フィールドの単位と違うスケールで書いても値としては妥当なため受理され、意図と違う結果が黙って返っていました(equityRatio:gte:70 が 0 件になる、時価総額のしきい値が意図と違う桁で解釈される、など)。単位を書けば、意図した意味のまま解釈されます。
換算は同じ種類の単位のあいだだけで行います。金額(jpy・million_jpy・hundred_million_jpy)と比率(ratio・percent)が対象で、times(倍)のように換算相手を持たない単位はそのフィールドの単位しか受け付けません。フィールドと換算できない単位を書いた場合は、受け付ける単位を添えた 400 が返ります → 単位とスケール。
unit を省略した 3 セグメント(field:op:value)の書き方はこれまでどおりで、フィールドの単位でしきい値を書いたものとして扱います。既存のリクエストの解釈は変わりません。
金額のしきい値については、旧単位(億円)とみられる値を 400 で弾く移行ガードがありますが、換算が起きる単位を明示した指定はガードの対象外です。marketCap:gte:1000:hundred_million_jpy はそのまま「1,000 億円」として通ります。フィールド自身の単位をそのまま書いた marketCap:gte:1000:jpy は、数値が単位を省略した場合と同じなのでガードが効きます。
MCP ツール screen_securities でも metric_filters[].unit で同じ指定ができます。MCP の金額フィールドは公開済み契約のため単位が億円で、外部 REST(円)とは異なります。どちらの面でも指標カタログの unit が正です。