Segmentational Analysis

This commit is contained in:
Kazuma
2026-06-02 04:58:07 -04:00
parent 70643a1fd9
commit 19fc052d14
9 changed files with 237 additions and 179 deletions
+37
View File
@@ -0,0 +1,37 @@
import { ScoringRules } from '../config/ScoringConfig.js';
/**
* RuleMerger ensures that we apply sector-specific overrides
* to base asset rules without polluting the individual Asset or Scorer logic.
*/
export const RuleMerger = {
getRulesForAsset(type, metrics) {
// 1. Start with a deep clone of the base rules for this asset type (STOCK, ETF, etc.)
const baseRules = ScoringRules[type];
if (!baseRules) throw new Error(`No configuration found for type: ${type}`);
let finalRules = JSON.parse(JSON.stringify(baseRules));
// 2. If it's a stock and we have a sector, merge the overrides
if (type === 'STOCK' && metrics.sector) {
const sectorKey = metrics.sector.toUpperCase();
const overrides = baseRules.SECTOR_OVERRIDE?.[sectorKey];
if (overrides) {
// Merge gates, weights, and thresholds deeply
finalRules.gates = { ...finalRules.gates, ...overrides.gates };
finalRules.weights = { ...finalRules.weights, ...overrides.weights };
finalRules.thresholds = {
...finalRules.thresholds,
...overrides.thresholds,
};
}
}
// 3. Cleanup: Remove the override configuration from the final object
// so the Scorer works with a clean, flat rule set.
delete finalRules.SECTOR_OVERRIDE;
return finalRules;
},
};