Skip to content

Commit 2fdb7c3

Browse files
committed
Add SOXX 10d volatility runtime indicator
1 parent 1050a67 commit 2fdb7c3

3 files changed

Lines changed: 6 additions & 0 deletions

File tree

src/quant_platform_kit/common/runtime_inputs.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ def build_semiconductor_rotation_indicators_from_history(
185185
)
186186
soxx_bb_mid = _tail_mean(soxx_close, 20)
187187
soxx_bb_std = _tail_std(soxx_close, 20)
188+
soxx_realized_volatility_10 = _tail_realized_volatility(soxx_close, 10)
188189
soxx_realized_volatility_20 = _tail_realized_volatility(soxx_close, 20)
189190
return {
190191
"soxl": {
@@ -202,6 +203,7 @@ def build_semiconductor_rotation_indicators_from_history(
202203
"bb_upper": soxx_bb_mid + 2.0 * soxx_bb_std,
203204
"bb_lower": soxx_bb_mid - 2.0 * soxx_bb_std,
204205
"realized_volatility": soxx_realized_volatility_20,
206+
"realized_volatility_10": soxx_realized_volatility_10,
205207
"realized_volatility_20": soxx_realized_volatility_20,
206208
},
207209
}

tests/test_ibkr_runtime_inputs.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ def fake_loader(_ib, symbol, duration="2 Y", bar_size="1 day"):
115115
self.assertGreaterEqual(indicators["soxx"]["rsi14_dynamic_threshold"], 70.0)
116116
self.assertGreater(indicators["soxx"]["bb_upper"], indicators["soxx"]["price"])
117117
self.assertLess(indicators["soxx"]["bb_lower"], indicators["soxx"]["price"])
118+
self.assertIn("realized_volatility_10", indicators["soxx"])
118119
self.assertIn("realized_volatility_20", indicators["soxx"])
119120
self.assertEqual(
120121
indicators["soxx"]["realized_volatility"],
@@ -141,6 +142,7 @@ def test_build_semiconductor_rotation_indicators_from_history_is_generic(self) -
141142
self.assertEqual(indicators["soxx"]["rsi14"], 100.0)
142143
self.assertGreaterEqual(indicators["soxx"]["rsi14_dynamic_threshold"], 70.0)
143144
self.assertGreater(indicators["soxx"]["bb_upper"], indicators["soxx"]["price"])
145+
self.assertIn("realized_volatility_10", indicators["soxx"])
144146
self.assertIn("realized_volatility_20", indicators["soxx"])
145147
wrapped = build_semiconductor_rotation_inputs_from_history(
146148
soxl_history=[100.0 + idx for idx in range(170)],
@@ -180,6 +182,7 @@ def fake_loader(_ib, symbol, duration="2 Y", bar_size="1 day"):
180182
self.assertEqual(payload["derived_indicators"]["soxx"]["ma20"], 200.0)
181183
self.assertEqual(payload["derived_indicators"]["soxx"]["rsi14"], 50.0)
182184
self.assertEqual(payload["derived_indicators"]["soxx"]["rsi14_dynamic_threshold"], 70.0)
185+
self.assertEqual(payload["derived_indicators"]["soxx"]["realized_volatility_10"], 0.0)
183186
self.assertEqual(payload["derived_indicators"]["soxx"]["realized_volatility_20"], 0.0)
184187

185188
def test_build_semiconductor_rotation_indicators_requires_sufficient_history(self) -> None:

tests/test_longbridge_market_data.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ def test_calculate_rotation_indicators(self) -> None:
7979
self.assertGreaterEqual(indicators["soxx"]["rsi14_dynamic_threshold"], 70.0)
8080
self.assertGreater(indicators["soxx"]["bb_upper"], indicators["soxx"]["price"])
8181
self.assertLess(indicators["soxx"]["bb_lower"], indicators["soxx"]["price"])
82+
self.assertIn("realized_volatility_10", indicators["soxx"])
8283
self.assertIn("realized_volatility_20", indicators["soxx"])
8384
self.assertEqual(
8485
indicators["soxx"]["realized_volatility"],

0 commit comments

Comments
 (0)