Tiede ja perustelut

Miksi siika syö silloin kun syö — ja miten ennusteen pisteet on rakennettu · snapshot haettu

Miksi tämä työkalu on olemassa

Tavalliset kalakalenterit (solunar, kuun vaiheet) on kehitetty vuoroveden voimakkaille merialueille. Itämerellä vuorovesi on alle 20 cm — se ei ohjaa siian käyttäytymistä mihinkään suuntaan. Yleiset säänäkökulmat eivät taas ota huomioon Saaronniemen geometriaa eivätkä kevätsiian biologiaa. Tämä työkalu yrittää korjata molemmat puutteet: pisteyttää Saaronniemen olosuhteet siten kuin ne oikeasti vaikuttavat siian rantasyöntiin.

1. Siian biologia — miksi nämä tekijät

Eurooppalainen siika (Coregonus lavaretus) on opportunistinen yleissyöjä, mutta kevään rantakalastuksen kannalta tärkeitä piirteitä ovat:

2. Vesilämpötila on tärkein muuttuja

Tämä on kaikkien ennustettavien tekijöiden kuningas. Ei ilman lämpötila — veden lämpötila. Ilma on huono mittari rantaveden lämmöstä, koska vedellä on lämpöinertia ja matalat poukamat lämpenevät omaan tahtiinsa.

VedenlämpöTilanne rannalla
< 2 °CJää juuri lähtenyt; siika ei vielä syö rannalla
2–4 °CKäynnistymisvaihe; epävarmaa
4–8 °CHuippukausi — siika parveissa pohjasta
8–12 °CKauden loppuvaihe; särki ja ahven tulevat
> 12 °CKausi käytännössä ohi

Pisteytysmalli reagoi tähän kahdella tavalla: vesilämmölle on iso 20 % paino osatekijänä, ja sen päälle kovat kerroinrangaistukset jos vesi on alle 4 °C (×0.4) tai yli 12 °C (×0.5). Yksi kylmä vesi voi siis yksinään tiputtaa muuten hyvän päivän surkeaksi — kuten käytännössäkin.

Tärkeä vinkki: oma rannalta otettu mittaus on aina luotettavampi kuin malli. Open-Meteon avovesimalli on usein 2–3 °C lämpimämpi kuin matalan rannan oma vesi, varsinkin kylmän pohjois/luoteistuulen jälkeen. Käytä ennustesivun ”Oma havainto rannalla” -liukua kun on uusi mittaus.

3. Tuulen suunta — Saaronniemen geometria

Saaronniemen kärki (Kolkannokka) avautuu länsi/lounaan suuntaan, ja avoin Saaristomeri on etelässä ja lännessä. Tämä asettaa tuulet hyvin epäsymmetrisesti:

Tuulen voimakkuus on toinen ulottuvuus. Optimi on 2–6 m/s: riittää sekoittamaan pohjaa, ei sameuta vettä. Yli 14 m/s vesi sameutuu ja siika lakkaa näkemästä saalistaan. Aivan tyyni (alle 0.5 m/s) saa pisteytyksen 40 — se ei sekoita pohjaa, mutta sight-feedingille se ei myöskään ole este.

4. Ilmanpaine — muutos, ei taso

Kalastusperinteessä ”paine vaikuttaa kalan syöntihaluun” on yleinen uskomus. Biofysikaalisesti se on kuitenkin epätodennäköinen: koko sääjärjestelmän paine-ero (20–40 hPa) on pieni verrattuna siihen painevaihteluun, jonka kala itse tuottaa uimalla yhden metrin verran ylös tai alas (~100 hPa).

Mitä paineessa oikeasti kannattaa katsoa, on muutosnopeus. Se ei vaikuta suoraan kalaan vaan toimii välikätenä säämuutoksille — pilvisyydelle, tuulelle, lämpötilan vaihtelulle, sateelle. Nämä taas vaikuttavat siian syöntiin oikeasti.

Mallissa paineen muutosta katsotaan kahdella ikkunalla: 24 h (paino 12) ja 48 h (paino 6). Absoluuttinen paine ei tule mukaan lainkaan.

5. Sade ja sameus

Pienet sateet (alle 2 mm/vrk) eivät juurikaan haittaa. Rankka sade sameuttaa veden ja blokkaa sight-feedingin; siika ei syö. Edellisten 48 h sateet ovat usein ratkaisevampia kuin kyseisen päivän — vesi tarvitsee aikaa kirkastua. Saaristomeren alhainen suolaisuus (5–7 ‰) tarkoittaa että makean veden valuma ei sokkilailla muuta suolaisuutta, mutta voi paikallisesti jäähdyttää.

6. Pilvisyys ja valo

Tämä on hieman vastakkainen mitä yleensä kuvitellaan. Aurinko ei pelästytä siikaa, vaan päinvastoin: aurinko lämmittää pohjasedimenttiä, mikä saa harvasukamadot möyrimään ja siika tulee parveissa pohjalle syömään niitä.

7. Mitä mallissa ei ole — tarkoituksella

8. Yhteenveto — mitä kannattaa katsoa

  1. Vesilämpötila 4–10 °C, mieluiten omalla mittauksella rannalta.
  2. Lämpenevä trendi 7 vrk:n yli; jyrkkä kylmeneminen on hälyttävä.
  3. Tuulen suunta S/SW/W, vältä N/NE.
  4. Tuulen voimakkuus 2–6 m/s.
  5. Paineen muutos 3–8 hPa / 24 h.
  6. Edellisten 48 h sateet alle 8 mm.
  7. Pilvisyys alle 80 %, mieluiten 10–60 %.
  8. Kellonaika 10–12 tai 17–19.

Yksityiskohtaiset kaavat ja painokertoimet löytyvät viereiseltä Algoritmin spesifikaatio -välilehdeltä (englanniksi). Lähteet ja laajempi tausta: docs/research.md (FI) ja docs/methodology.md (EN).

Note (EN): this tab is the implementation spec for developers. It is the single source of truth for the math used in scoring.js. The angler-facing summary is on the previous tab (in Finnish).

High-level formula

finalScore = clamp(round(baseScore × Π penaltyMultipliers), 0, 100)

where baseScore is a weighted average of 11 factor scores (each 0–100) and penaltyMultipliers are zero or more critical-condition multipliers (each ≤ 1).

Why weighted average × multipliers

A pure weighted average can't capture veto conditions — situations where a single factor (e.g. water below 4 °C, or +20 °C summer water) effectively shuts down the fishery regardless of everything else. A pure rule-based system can't capture gradual interactions between many small factors. The hybrid: weighted average of gradient factors, then hard penalty multipliers for the few biological vetoes.

The 11 factors and their weights

KeyFactorWeightCritical
wtWater temperature20
wtrendWater-temp trend (7-day Δ)10
p24Pressure change 24h (|ΔhPa|)12
p48Pressure change 48h (|ΔhPa|)6
wsWind speed (max km/h)10
wdWind direction (Saaronniemi-relative)10
r24Precipitation 24h6
r48Precipitation prior 48h6
ccCloud cover (mean)6
atAir temperature (max)4
attAir-temp trend (48h Δ)10
Total100

baseScore = Σ(score × weight) / 100

Generic shape: triangular(v, hardLo, optLo, optHi, hardHi)

v ≤ hardLo                  → 0
v ≥ hardHi                  → 0
optLo ≤ v ≤ optHi           → 100
hardLo < v < optLo          → linear ramp 0 → 100
optHi < v < hardHi          → linear ramp 100 → 0

Per-factor formulas

scoreWaterTemp(t) — weight 20

triangular(t, 2, 6, 10, 14). Optimum 6–10 °C, hard bounds 2 and 14.

scoreWaterTrend(dt) — weight 10

Δ over 7 daysScore
+1 to +4 °C (warming)100
0 to +1 °C (drift up)80
> +4 °C (very fast warming)70
0 to −1 °C (slow cooling)65
−1 to −2 °C35
−2 to −3 °C15
< −3 °C (crash)5

Sudden cooling in spring tells fish to leave the shallow shore for the deeper, more thermally stable column.

scorePressureChange(dp) — weights 12 (24h) and 6 (48h)

triangular(|dp|, 0, 3, 8, 15). Reward 3–8 hPa/24h; penalize stagnant pressure (|Δp|<3) and extreme drops (|Δp|>15).

scoreWindSpeed(kmh) — weight 10

ms = kmh / 3.6
if ms < 0.5  →  40   (dead calm; sight feeding still fine)
else  →  triangular(ms, 0, 2, 6, 14)

scoreWindDir(deg) — weight 10 (Saaronniemi-specific)

The cape opens W/SW. Best: SW (~225°) onshore. Worst: NE (~45°) offshore.

dist = min(|deg − 225|, 360 − |deg − 225|)   // angular distance, 0–180
score = round(100 × (1 − dist / 180))

scorePrecipToday(mm) — weight 6

mm < 0.5   →  100
mm < 2     →  80
mm < 5     →  50
mm < 10    →  25
mm ≥ 10    →  10

scorePrecip48h(mm) — weight 6

mm < 2     →  100
mm < 8     →  70
mm < 20    →  40
mm ≥ 20    →  15

scoreCloud(pct) — weight 6

Piecewise (not triangular):

pct ≤ 10   →  85   (clear; great in spring, harsh in summer)
pct ≤ 60   →  100  (broken cloud sweet spot)
pct ≤ 80   →  70
pct ≤ 95   →  45
pct > 95   →  25   (overcast; bottom doesn't warm, polychaetes stay in)

scoreAirTemp(tmax) — weight 4

triangular(tmax, -5, 6, 14, 22). Lower weight than water temp because air is a poor proxy for shore water on short timescales.

scoreAirTrend(dt) — weight 10

dt 0 to +5    →  100 (warming)
dt > +5       →  70 (warming fast — confused fish)
dt 0 to −2    →  70 (slight cool)
dt −2 to −5   →  40
dt < −5       →  20 (cold shock)

Critical penalty multipliers

Applied multiplicatively after the weighted base score. Multiple can stack.

ConditionMultiplierRationale
Water temp < 4 °C× 0.4Polychaete activity halts; siika moves to deep stable water.
Water temp 4–5 °C× 0.6Cold-edge marginal — shore food chain barely active.
Water temp > 12 °C× 0.5Spring whitefish window closes; roach/perch dominate the shallow shore.
Water trend ≤ −2.5 °C / 7d× 0.5Sudden cooling — fish vacate the shallows for thermal stability.
Water trend −1.5 to −2.5 °C / 7d× 0.75Cooling not catastrophic but biases against feeding.
WindDir score < 30 AND wind > 8 m/s AND water < 7 °C× 0.7Cold offshore wind drives warm surface water out and brings cold deep water up.

If multiple water-temp conditions match, only one fires (e.g. < 4 °C does not also trigger 4–5 °C). Trend and direction conditions stack with temperature conditions.

Future-day water-temperature projection

Open-Meteo Marine gives a daily SST forecast, but we don't currently use it directly per future day. Instead we project from today's chosen source using a damped air-temp delta:

projectedWater(d) = baseWater + (airAvg(d) − airAvg(today)) × 0.2 × min(daysFromToday, 5) / 5

Capped to [1, 18] °C. This is crude and known to be a weakness — a better implementation would use the Open-Meteo Marine forecast directly per future day.

Validation

One ground-truth event so far: 2026-04-24 user reports nobody catching fish at Saaronniemi, water shore-measured at 4 °C (down from 6–8 °C earlier weeks), wind from NW at 25 km/h. Without the water-temp + offshore-wind compound, the model gave 85 (very wrong). With them, the model gives 34 ("Huono"), matching reality. More catch-log data points are needed for real validation.

Sources and bibliography