-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdirectionRules.js
More file actions
215 lines (177 loc) · 13.3 KB
/
directionRules.js
File metadata and controls
215 lines (177 loc) · 13.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
// USD direction rules
const directionRulesUSD = new Map(
[
//OIL
["Crude Oil Inventories", "upIsBearish"], // stocks de pétrole plus élevés = offre excédentaire = baisse prix énergie = désinflation → bearish USD
["Cushing Crude Oil Inventories", "upIsBearish"], // même logique, mais sur hub stratégique Cushing → hausse des stocks = pression baissière sur prix
// 🎯 EMPLOI
["Nonfarm Payrolls", "upIsBullish"], // plus de créations d’emplois = économie robuste = pression salariale → bullish USD
["Initial Jobless Claims", "upIsBearish"], // hausse des nouvelles demandes chômage = marché du travail qui faiblit → bearish USD
["Continuing Jobless Claims", "upIsBearish"], // hausse des chômeurs persistants = faiblesse marché travail → bearish USD
["ADP Nonfarm Employment Change", "upIsBullish"], // plus d’emplois privés = signal fort marché travail → bullish USD
["Challenger Job Cuts", "upIsBearish"], // hausse des licenciements annoncés = mauvais signal emploi → bearish USD
["Employment Component (ISM Manufacturing/Services)", "upIsBullish"], // composante emploi ISM : hausse = marché travail solide → bullish USD
// 🎯 CHÔMAGE
["Unemployment Rate", "upIsBearish"], // taux chômage en hausse = marché travail plus faible → bearish USD
["Labor Force Participation Rate", "upIsBullish"], // plus de gens actifs = marché travail dynamique → bullish USD
["U6 Unemployment Rate", "upIsBearish"], // chômage large (inclut temps partiel subi) en hausse = faiblesse → bearish USD
["Job Openings (JOLTS)", "upIsBullish"], // plus d’offres d’emploi = tension sur marché travail → bullish USD
// 🎯 SALAIRES
["Average Hourly Earnings", "upIsBullish"], // salaires en hausse = pression inflation = bullish USD
["Employment Cost Index", "upIsBullish"], // coût du travail plus élevé = inflation potentielle → bullish USD
["Unit Labor Costs", "upIsBullish"], // coût par unité produite en hausse = inflation → bullish USD
["Wage Growth (Atlanta Fed)", "upIsBullish"], // croissance salaires = inflation future → bullish USD
// 🎯 ISM MANUFACTURING
["ISM Manufacturing PMI", "upIsBullish"], // activité industrielle plus forte = croissance + inflation → bullish USD
["Factory Orders", "upIsBullish"], // commandes d’usines en hausse = dynamique économique positive → bullish USD
["Durable Goods Orders", "upIsBullish"], // commandes de biens durables = investissement en hausse → bullish USD
["Manufacturing Production", "upIsBullish"], // production industrielle en hausse = économie solide → bullish USD
["New Orders Index", "upIsBullish"], // nouvelles commandes en hausse = future activité → bullish USD
// 🎯 ISM SERVICES
["ISM Services PMI", "upIsBullish"], // services plus dynamiques = croissance US solide → bullish USD
["Services Revenue Surveys", "upIsBullish"], // revenus services en hausse = consommation dynamique → bullish USD
["Business Activity Index", "upIsBullish"], // activité des services = composante clé = hausse = bullish USD
["New Orders Index (Services)", "upIsBullish"], // nouvelles commandes dans services = expansion future → bullish USD
// 🎯 VENTES AU DÉTAIL
["Retail Sales", "upIsBullish"], // consommation en hausse = croissance + inflation → bullish USD
["Consumer Confidence", "upIsBullish"], // confiance consommateurs en hausse = dépenses futures plus fortes → bullish USD
["Redbook Index", "upIsBullish"], // ventes hebdo détaillants = conso robuste = bullish USD
["Vehicle Sales", "upIsBullish"], // ventes autos = proxy conso durable = hausse = bullish USD
["Chain Store Sales", "upIsBullish"], // ventes chaînes magasins = consommation solide = bullish USD
["Core Retail Sales", "upIsBullish"], // retail hors autos/essence = tendance conso pure = hausse = bullish USD
["Retail Inventories", "upIsBullish"], // stocks en hausse = activité commerciale soutenue (attention si trop fort = surplus) → bullish USD
["Core PCE", "upIsBullish"], // indice préféré Fed pour inflation sous-jacente : hausse = resserrement monétaire → bullish USD
["Wholesale Inventories", "upIsBullish"], // stocks de gros = dynamique commerce = bullish USD
// 🎯 INFLATION
["CPI", "upIsBullish"], // prix conso en hausse = inflation = bullish USD
["PPI", "upIsBullish"], // prix producteurs en hausse = inflation future → bullish USD
["Core CPI", "upIsBullish"], // inflation hors énergie/food = mesure centrale → bullish USD
["Core PPI", "upIsBullish"], // inflation producteurs sous-jacente → bullish USD
["PPI ex. Food/Energy/Transport", "upIsBullish"], // inflation PPI cœur ajustée → bullish USD
["PPI ex Food and Energy", "upIsBullish"], // idem, core measure → bullish USD
["PPI excluding Food and Energy", "upIsBullish"], // idem → bullish USD
["PPI excl. Food & Energy", "upIsBullish"], // idem → bullish USD
["PPI ex. Food", "upIsBullish"], // idem → bullish USD
["Import Prices", "upIsBullish"], // prix imports en hausse = inflation importée → bullish USD
["Energy Prices", "upIsBullish"], // énergie plus chère = pression inflation → bullish USD
["Rents Index", "upIsBullish"], // loyers = composante clé CPI = hausse = inflation → bullish USD
["Owners’ Equivalent Rent", "upIsBullish"], // proxy logement CPI = hausse = inflation → bullish USD
["Used Car Prices", "upIsBullish"], // voitures occaz = composante volatile CPI = hausse = inflation → bullish USD
["Medical Care Services Index", "upIsBullish"], // services médicaux = poids important CPI = hausse → bullish USD
["Commodity Prices", "upIsBullish"], // matières premières = hausse = coûts producteurs = bullish USD
["Input Prices", "upIsBullish"], // intrants PMI = hausse = inflation amont = bullish USD
["ISM Prices Paid", "upIsBullish"], // composante ISM = hausse = inflation producteurs = bullish USD
["Core Input Prices", "upIsBullish"], // input prices hors énergie/food = pression inflation sous-jacente = bullish USD
["Intermediate Goods Prices", "upIsBullish"], // biens intermédiaires = hausse = inflation future → bullish USD
// 🎯 CHÔMAGE COURT TERME
["State-Level Jobless Reports", "upIsBearish"], // chômage régional en hausse = faiblesse → bearish USD
["Holiday Effects", "upIsBearish"], // hausse chômage temporaire = signe de ralentissement → bearish USD
["Duration of Unemployment", "upIsBearish"], // durée chômage plus longue = marché travail faible → bearish USD
["Rolling Average of Initial Claims", "upIsBearish"], // moyenne 4 semaines en hausse = tendance chômage détériorée → bearish USD
// 🎯 POLITIQUE MONÉTAIRE
["Fed Interest Rate Decision", "upIsBullish"], // hausse des taux = resserrement monétaire → bullish USD
["FOMC Minutes", "upIsBullish"], // ton hawkish = signal durcissement → bullish USD
["Fed Funds Futures", "upIsBullish"], // pricing marchés sur taux plus élevés = bullish USD
// 🎯 CROISSANCE
["GDP", "upIsBullish"], // PIB en hausse = économie robuste → bullish USD
["Atlanta Fed GDPNow", "upIsBullish"], // nowcast PIB Fed Atlanta = si + haut = croissance anticipée → bullish USD
["Inventories", "upIsBullish"], // stocks en hausse = signal activité (mais peut être surplus) → bullish USD
["Trade Balance", "upIsBullish"], // déficit commercial qui se réduit = plus d’exports = bullish USD
["Personal Consumption Expenditures", "upIsBullish"], // dépenses ménages = cœur de l’économie US = hausse = bullish USD
// 🎯 BIENS D'ÉQUIPEMENT
["Capital Goods Orders", "upIsBullish"], // commandes équipements = investissement productif → bullish USD
["Business Equipment Orders", "upIsBullish"], // idem = hausse investissement entreprises = bullish USD
// 🎯 ORACLES PPI
["ISM Manufacturing Prices", "upIsBullish"], // hausse des prix payés par les industriels → pression inflation producteurs → bullish USD
["ISM Non-Manufacturing Prices", "upIsBullish"], // hausse des prix payés dans les services → inflation généralisée → bullish USD
["Crude Oil Inventories", "upIsBearish"], // stocks élevés = surplus d’offre = baisse des prix de l’énergie = moins de pression inflationniste → bearish USD
["CFTC Aluminium speculative net positions", "upIsBullish"], // plus de positions longues = anticipation hausse aluminium = coûts industriels en hausse → bullish USD
["CFTC Copper speculative net positions", "upIsBullish"], // cuivre = métal clé industrie → hausse positions = anticipation prix + élevés → bullish USD
["CFTC Corn speculative net positions", "upIsBullish"], // agriculture → hausse spéculation = prix alimentaires plus hauts → inflation producteurs → bullish USD
["CFTC Crude Oil speculative net positions", "upIsBullish"], // spéculation pétrole en hausse = anticipation prix énergie + élevés → bullish USD
["CFTC Gold speculative net positions", "upIsBullish"], // plus de positions longues or = anticipation hausse métaux = signal inflation matières → bullish USD
["CFTC Natural Gas speculative net positions", "upIsBullish"], // spéculation haussière gaz = prix énergie + hauts = coûts de production + élevés → bullish USD
["CFTC Silver speculative net positions", "upIsBullish"], // argent = métal industriel & précieux → hausse positions = anticipation prix + hauts → bullish USD
["CFTC Soybeans speculative net positions", "upIsBullish"], // soja = produit agricole clé → spéculation haussière = prix intrants alimentaires + élevés → bullish USD
["CFTC Wheat speculative net positions", "upIsBullish"] // blé = intrant agricole majeur → spéculation haussière = anticipation prix + hauts → bullish USD
]);
// JPY direction rules
const directionRulesJPY = new Map([
["BoJ Interest Rate Decision", "upIsBullish"],
["Tokyo CPI", "upIsBullish"],
["Unemployment Rate", "upIsBearish"],
["Retail Sales", "upIsBullish"],
["GDP", "upIsBullish"]
]);
/********************************************************* */
// 🆕 Système de pondération (inspiré des étoiles TradingEconomics)
function getNewsWeight(eventName, currency = "USD") {
const normalized = normalizeEvent(eventName);
if (normalized.includes("atlanta fed")) return 0; // ⛔️ Filtrage explicite
if (currency.toUpperCase() === "USD") {
if (normalized.includes("nonfarm payrolls")) return 3;
if (normalized.includes("ism manufacturing pmi")) return 3;
if (normalized.includes("cpi") || normalized.includes("core cpi")) return 3;
if (normalized.includes("fed interest rate")) return 3;
if (normalized.includes("gdp")) return 3;
if (normalized.includes("retail sales")) return 2;
if (normalized.includes("ppi")) return 2;
if (normalized.includes("unemployment")) return 2;
if (normalized.includes("initial jobless")) return 1;
}
if (currency.toUpperCase() === "JPY") {
if (normalized.includes("boj interest rate")) return 3;
if (normalized.includes("gdp")) return 3;
if (normalized.includes("tokyo cpi")) return 2;
if (normalized.includes("retail sales")) return 2;
if (normalized.includes("unemployment")) return 1;
}
return 0; // non-impactant
}
function normalizeEvent(name) {
return name.replace(/\s?\(.*?\)/g, "").trim().toLowerCase();
}
// Ajoute d'autres Maps ici si nécessaire
function getDirectionRules(currency) {
switch (currency.toUpperCase()) {
case "USD":
return directionRulesUSD;
case "JPY":
return directionRulesJPY;
// case "EUR": return directionRulesEUR;
// case "GBP": return directionRulesGBP;
default:
return new Map(); // Vide si devise non couverte
}
}
function findRule(eventName, currency = "USD") {
const rules = getDirectionRules(currency);
const lowerName = eventName.toLowerCase();
for (const [key, value] of rules.entries()) {
if (lowerName.includes(key.toLowerCase())) {
return value;
}
}
return null; // Aucun match
}
function calculateDirection(rule, forecast, previous) {
if (!rule || forecast == null || previous == null) return null;
const f = parseFloat(forecast.toString().replace(/[^\d.-]/g, ""));
const p = parseFloat(previous.toString().replace(/[^\d.-]/g, ""));
if (isNaN(f) || isNaN(p)) return null;
const isUp = f > p;
const isDown = f < p;
switch (rule) {
case "upIsBullish":
if (isUp) return "bullish";
if (isDown) return "bearish";
return "neutral";
case "upIsBearish":
if (isUp) return "bearish";
if (isDown) return "bullish";
return "neutral";
default:
return null; // unknown rule
}
}
module.exports = { getDirectionRules, findRule, getNewsWeight, calculateDirection };