① Multiplicateur Lunaire
Pondère l'activité selon phase et illumination. Nouvelle/pleine lune = alignement gravitationnel
maximal.
base = 1 + 0.4 × illumination
Waning/Waxing Gibbous → × 1.05
Full Moon / New Moon → × 1.10
clamp(base, 1.0, 1.60)
② Score Créneau Solunar
Major (2h) = 80pts, Minor (1h) = 60pts. Overlap avec événement solaire (sunrise/transit/sunset) →
+20.
base = MAJOR ? 80 : 60
if overlap(créneau, solar_event):
base = min(base + 20, 100)
score = clamp(base × lunar_mult, 100)
③ Golden Hours Solaires
Lumière rasante = prédateurs avantagés. 1h avant lever + 1.5h après, miroir au coucher.
morning = [sunrise-0.5h, sunrise+1.5h]
evening = [sunset-1.5h, sunset+0.5h]
golden_bonus = ×1.15 si overlap
④ Score Horaire Ajusté
Combine score brut API, multiplicateur lunaire et bonus golden hour en score final par heure.
gbonus = 1.15 if golden_hour else 1.0
score = base × lunar_mult × gbonus
clamp(score, 0, 100)
⑤ Score Global Journée
Formule pondérée combinant 4 dimensions : rating global, moyenne horaire, créneau peak, densité.
W1=(day/5×100)×0.30 ← rating
W2=mean(h)×mult ×0.25 ← horaire
W3=best_score ×0.30 ← peak
W4=(%h≥60×100) ×0.15 ← densité
⑥ Synergy Marée (Bonus)
Créneau solunar + marée haute/basse (±3h) → bonus d'activité. Courants = déplacement des poissons.
ov = overlap(sol, [tide±3h])
if ov > 1h → bonus +25
elif ov > 0 → bonus +15
else → bonus 0
⑦ Qualité (Label)
Conversion du score numérique en label lisible. Seuils empiriques basés sur retours de pêcheurs.
≥ 80 → "Excellent 🏆"
≥ 65 → "Très bon ⭐⭐"
≥ 50 → "Bon ✅"
≥ 35 → "Moyen ⚠️"
< 35 → "Faible ❌"
🐍 Exemple d'intégration FastAPI Python
# pip install fishing_forecast
from fishing_forecast import SolunarData,
analyze_fishing_day
import requests
# 1. Appel API Solunar (gratuit, sans clé API)
raw = requests.get(f"https://api.solunar.org/solunar/44.84,-0.58,20260403,1").json()
# 2. Analyse complète (marées optionnelles)
result = analyze_fishing_day(
SolunarData(**raw),
high_tide_dec=14.5, # marée haute à
14h30
low_tide_dec=8.2 # marée basse à
8h12
)
# 3. Endpoint FastAPI
@app.get("/fishing/forecast")
async def forecast(lat: float, lon: float, date: str):
raw = requests.get(f"https://api.solunar.org/solunar/{lat},{lon},{date},1").json()
r = analyze_fishing_day(SolunarData(**raw))
return {"score": r.global_score, "quality": r.day_quality,
"best": r.best_window.start_str, "windows": r.all_windows}