Skip to content

Commit cdbfbb3

Browse files
Pigbibicursoragent
andauthored
Use shared UsEquityStrategies market signal runtime shim (#137)
* Replace duplicated market_signal_runtime with UsEquityStrategies shim. Bump us-equity-strategies pin to pick up shared resolve_external_market_signal_inputs. Co-authored-by: Cursor <cursoragent@cursor.com> * Fix market signal runtime tests for shared UES implementation. Co-authored-by: Cursor <cursoragent@cursor.com> * Bump us-equity-strategies pin to merged main revision. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 047f376 commit cdbfbb3

4 files changed

Lines changed: 19 additions & 111 deletions

File tree

market_signal_runtime.py

Lines changed: 13 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -1,116 +1,23 @@
1-
from __future__ import annotations
2-
3-
from datetime import date, datetime
4-
from pathlib import Path
5-
from typing import Any, Callable, Iterable
1+
"""Compatibility shim; implementation lives in us_equity_strategies.signals."""
62

73
from us_equity_strategies.signals import (
4+
DEFAULT_MARKET_SIGNAL_CACHE_DIR,
85
MARKET_SIGNAL_REFERENCE_CONSUMPTION_AUDIT,
96
MARKET_SIGNAL_REFERENCE_PLATFORM_HANDOFF,
107
MARKET_SIGNAL_REFERENCE_PLATFORM_HANDOFF_INDEX,
118
default_market_signal_inputs_when_unconfigured,
129
extract_consumer_market_signal_inputs_from_reference,
1310
market_signal_consumer_for_strategy_profile,
11+
resolve_external_market_signal_inputs,
1412
)
1513

16-
17-
DEFAULT_MARKET_SIGNAL_CACHE_DIR = "/tmp/quant-platform-market-signals"
18-
19-
20-
def resolve_external_market_signal_inputs(
21-
*,
22-
strategy_profile: str,
23-
available_inputs: Iterable[str],
24-
runtime_settings: Any,
25-
as_of: Any = None,
26-
logger: Callable[[str], None] = print,
27-
client_factory: Any = None,
28-
) -> dict[str, Any]:
29-
normalized_profile = str(strategy_profile or "").strip().lower()
30-
consumer = market_signal_consumer_for_strategy_profile(normalized_profile)
31-
if consumer is None:
32-
return {}
33-
if "derived_indicators" not in {str(item) for item in available_inputs or ()}:
34-
return {}
35-
36-
reference_type, reference = _market_signal_reference(runtime_settings)
37-
if reference is None:
38-
if bool(getattr(runtime_settings, "market_signal_required", False)):
39-
raise RuntimeError(
40-
f"{normalized_profile} external market signal is required "
41-
"but no signal reference is configured"
42-
)
43-
return default_market_signal_inputs_when_unconfigured(normalized_profile)
44-
45-
market_inputs, metadata = extract_consumer_market_signal_inputs_from_reference(
46-
reference,
47-
reference_type=reference_type,
48-
consumer=consumer,
49-
cache_dir=_market_signal_cache_dir(runtime_settings),
50-
as_of=_market_signal_as_of(as_of),
51-
client_factory=client_factory,
52-
fallback_mode=_market_signal_fallback_mode(runtime_settings),
53-
fallback_max_stale_days=_market_signal_max_stale_days(runtime_settings),
54-
)
55-
logger(
56-
"market_signal_inputs_loaded | "
57-
f"profile={strategy_profile} reference_type={metadata.get('reference_type')} "
58-
f"source_uri={metadata.get('source_uri') or reference} "
59-
f"materialized_count={metadata.get('materialized_count')} "
60-
f"fallback_used={bool(metadata.get('artifact_fallback_used'))}"
61-
)
62-
return dict(market_inputs)
63-
64-
65-
def _market_signal_reference(runtime_settings: Any) -> tuple[str, str | None]:
66-
consumption_audit_uri = _optional_string(
67-
getattr(runtime_settings, "market_signal_consumption_audit_uri", None)
68-
)
69-
if consumption_audit_uri:
70-
return MARKET_SIGNAL_REFERENCE_CONSUMPTION_AUDIT, consumption_audit_uri
71-
72-
handoff_manifest_uri = _optional_string(
73-
getattr(runtime_settings, "market_signal_handoff_manifest_uri", None)
74-
)
75-
if handoff_manifest_uri:
76-
return MARKET_SIGNAL_REFERENCE_PLATFORM_HANDOFF, handoff_manifest_uri
77-
78-
handoff_index_uri = _optional_string(
79-
getattr(runtime_settings, "market_signal_handoff_index_uri", None)
80-
)
81-
if handoff_index_uri:
82-
return MARKET_SIGNAL_REFERENCE_PLATFORM_HANDOFF_INDEX, handoff_index_uri
83-
84-
return MARKET_SIGNAL_REFERENCE_PLATFORM_HANDOFF_INDEX, None
85-
86-
87-
def _market_signal_cache_dir(runtime_settings: Any) -> Path:
88-
configured = _optional_string(getattr(runtime_settings, "market_signal_cache_dir", None))
89-
return Path(configured or DEFAULT_MARKET_SIGNAL_CACHE_DIR)
90-
91-
92-
def _market_signal_fallback_mode(runtime_settings: Any) -> str:
93-
return _optional_string(getattr(runtime_settings, "market_signal_fallback_mode", None)) or "none"
94-
95-
96-
def _market_signal_max_stale_days(runtime_settings: Any) -> int:
97-
value = getattr(runtime_settings, "market_signal_max_stale_days", None)
98-
if value is None or str(value).strip() == "":
99-
return 3
100-
return max(0, int(value))
101-
102-
103-
def _market_signal_as_of(value: Any) -> str | None:
104-
if value is None:
105-
return None
106-
if isinstance(value, datetime):
107-
return value.date().isoformat()
108-
if isinstance(value, date):
109-
return value.isoformat()
110-
text = str(value).strip()
111-
return text[:10] if text else None
112-
113-
114-
def _optional_string(value: Any) -> str | None:
115-
text = str(value or "").strip()
116-
return text or None
14+
__all__ = [
15+
"DEFAULT_MARKET_SIGNAL_CACHE_DIR",
16+
"MARKET_SIGNAL_REFERENCE_CONSUMPTION_AUDIT",
17+
"MARKET_SIGNAL_REFERENCE_PLATFORM_HANDOFF",
18+
"MARKET_SIGNAL_REFERENCE_PLATFORM_HANDOFF_INDEX",
19+
"default_market_signal_inputs_when_unconfigured",
20+
"extract_consumer_market_signal_inputs_from_reference",
21+
"market_signal_consumer_for_strategy_profile",
22+
"resolve_external_market_signal_inputs",
23+
]

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ authors = [
1515
dependencies = [
1616
"firstrade==0.0.39",
1717
"quant-platform-kit @ git+https://github.com/QuantStrategyLab/QuantPlatformKit.git@b821e8c318e15d40f925c84a007ae335a3415cd5",
18-
"us-equity-strategies @ git+https://github.com/QuantStrategyLab/UsEquityStrategies.git@07232b0",
18+
"us-equity-strategies @ git+https://github.com/QuantStrategyLab/UsEquityStrategies.git@7ae083fae5c00c3df0c8fb1d98b045401a3b5bfa",
1919
"google-cloud-storage",
2020
"requests",
2121
]

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ flask
22
gunicorn
33
firstrade==0.0.39
44
quant-platform-kit @ git+https://github.com/QuantStrategyLab/QuantPlatformKit.git@b821e8c318e15d40f925c84a007ae335a3415cd5
5-
us-equity-strategies @ git+https://github.com/QuantStrategyLab/UsEquityStrategies.git@07232b0
5+
us-equity-strategies @ git+https://github.com/QuantStrategyLab/UsEquityStrategies.git@7ae083fae5c00c3df0c8fb1d98b045401a3b5bfa
66
google-cloud-storage
77
google-auth
88
requests

tests/test_market_signal_runtime.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import pytest
77

88
import market_signal_runtime
9+
from us_equity_strategies.signals import runtime_market_signal_inputs as runtime_signal_inputs
910

1011

1112
def test_unsupported_profile_does_not_load_market_signal():
@@ -107,7 +108,7 @@ def fake_extract(
107108
}
108109

109110
monkeypatch.setattr(
110-
market_signal_runtime,
111+
runtime_signal_inputs,
111112
"extract_consumer_market_signal_inputs_from_reference",
112113
fake_extract,
113114
)
@@ -175,7 +176,7 @@ def fake_extract(
175176
}
176177

177178
monkeypatch.setattr(
178-
market_signal_runtime,
179+
runtime_signal_inputs,
179180
"extract_consumer_market_signal_inputs_from_reference",
180181
fake_extract,
181182
)
@@ -243,7 +244,7 @@ def fake_extract(
243244
}
244245

245246
monkeypatch.setattr(
246-
market_signal_runtime,
247+
runtime_signal_inputs,
247248
"extract_consumer_market_signal_inputs_from_reference",
248249
fake_extract,
249250
)

0 commit comments

Comments
 (0)