Risk signal detection
Watching for emerging market stress while filtering out scheduled, routine coverage.
A desk wants to hear about sovereign debt and emerging market stress as it surfaces — but not about the scheduled rate decisions that dominate the same vocabulary every month.
MATCH DIRECTION(["sovereign debt concern", "emerging market stress"]) CONE 0.4
AND CONTRAST(
ATTRACT ["credit spreads", "bond yields"],
REPEL ["routine monetary policy", "scheduled rate decision"]
)
NAMESPACE "org:hedgefund", GLOBAL
{
"match": {
"and": [
{ "direction": { "toward": ["sovereign debt concern", "emerging market stress"], "cone": 0.4 } },
{ "contrast": {
"attract": ["credit spreads", "bond yields"],
"repel": ["routine monetary policy", "scheduled rate decision"] } }
]
},
"namespace": { "include": ["org:hedgefund"], "global": true }
}
Why each clause is there
DIRECTION, not DISTANCE. The signal being watched for is a theme, and it
arrives at wildly different intensities — a clause in a longer note, or a piece
entirely about it. A cone catches both; a sphere would favour the second and
miss the first, which is the one with time value.
CONTRAST does the filtering. Scheduled policy coverage and genuine stress
coverage share almost all their vocabulary, so no keyword exclusion separates
them. Repelling from "routine monetary policy" and "scheduled rate decision"
moves the composite away from the calendar-driven register while keeping the
credit vocabulary.
No WITHIN on the contrast. Without a floor the clause contributes to the
score without hard-rejecting anything, so DIRECTION decides membership and
CONTRAST shapes the ranking. Adding WITHIN 0.7 would make it a filter
instead — a reasonable change once you have seen what actually matches.
GLOBAL alongside the private namespace. Market-moving news arrives from
outside the organisation. Including only "org:hedgefund" would restrict the
query to what the desk had already written down.
What to adjust first
Widen CONE before touching anything else. 0.4 radians is about 23°, which is
fairly tight for a two-concept mean; if the query is quiet, 0.5 is the first
thing to try.
If it is noisy instead, the usual cause is the repel set being too close to the
attract set — see CONTRAST.