Segmentational Analysis
This commit is contained in:
@@ -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;
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user