BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Föreslår rader till Stryktipset med streck, odds och AI-kommentarer
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Föreslår rader till Stryktipset utifrån hur många rader du vill spela, med en kommentar till varje match. Bakom appen samlar en automatisk pipeline på GitHub historik, så att förslagen blir bättre över tid. • Pipeline (pipeline/): Python. Hämtar data, sparar i SQLite (data/stryktips.db, committas till repot), räknar sannolikheter och exporterar docs/kupong.json. • App (docs/): HTML, CSS och JS utan byggsteg. Ingen backend och inga nycklar i webbläsaren. • AI (fas 4): Gemini (eller Claude) anropas bara från pipelinen. Kräver Python 3.9 eller senare.README 전문 보기 ↗
Föreslår rader till Stryktipset utifrån hur många rader du vill spela, med en kommentar till varje match. Bakom appen samlar en automatisk pipeline på GitHub historik, så att förslagen blir bättre över tid.
GitHub Actions (schema) GitHub Pages
┌──────────────────────────────┐ committar ┌──────────────────────────┐
│ python -m pipeline auto │ ─────────────▶ │ docs/ (statisk webbapp) │
│ Svenska Spel, The Odds API │ data/*.db │ läser bara kupong.json │
│ tipssajter, Gemini (fas 4) │ kupong.json └──────────────────────────┘
└──────────────────────────────┘
pipeline/): Python. Hämtar data, sparar i SQLite (data/stryktips.db, committas
till repot), räknar sannolikheter och exporterar docs/kupong.json.docs/): HTML, CSS och JS utan byggsteg. Ingen backend och inga nycklar i webbläsaren.| Fas | Innehåll | Klar |
|---|---|---|
| 1 | Datainsamling: kupong, streck, odds, resultat, utdelning | ✅ |
| 2 | Sannolikhetsmodell och export av kupong.json | ✅ |
| 3 | Webbappen och radoptimering | ✅ |
| 4 | Tipssajter och AI-kommentarer | ✅ |
| 5 | Lärande från historik och backtest | ✅ |
Kräver Python 3.9 eller senare.
python3 -m venv .venv
.venv/bin/pip install -r requirements-dev.txt
.venv/bin/python -m pytest # testerna kräver inget nätverk
.venv/bin/python -m pipeline auto # hämtar det som är aktuellt just nu
Kommandon:
| Kommando | Gör |
|---|---|
python -m pipeline auto | Det schemat kör: Svenska Spel, odds och resultat, det som är aktuellt |
python -m pipeline svenskaspel | Öppna omgångar: kupong, streck, Svenska Spels odds, Tio tidningars tips |
python -m pipeline odds | The Odds API för öppna omgångar (kräver ODDS_API_KEY) |
python -m pipeline resultat | Resultat och utdelning för omgångar efter spelstopp |
python -m pipeline backfill 4700 4973 | Hämta historiska omgångar (1 s paus mellan anrop) |
python -m pipeline tips | Hämta tipsartiklar och låt AI-modellen tolka dem (kräver GEMINI_API_KEY) |
python -m pipeline kommentarer | Skriv AI-kommentarer för öppna omgångar (kräver GEMINI_API_KEY) |
python -m pipeline prognos [--alla] | Räkna sannolikheter med aktiv modellversion (--alla räknar om hela historiken) |
python -m pipeline export | Skriv docs/kupong.json (närmaste öppna omgång, annars den senaste) |
python -m pipeline export --omgang 4974 --till docs/exempel-kupong.json --dolj-resultat | Skapa exempelfilen |
python -m pipeline statistik | Källstatistik, träning av ensemble-v1, backtest och modellval (körs annars automatiskt när nya resultat finns) |
python -m pipeline migrera | Kör bara databasmigreringarna |
Lägg till -v för mer loggning. Miljövariabeln STRYKTIPS_DB styr vilken databasfil som används
(bra för att testa utan att röra data/stryktips.db).
| Secret | Krävs | Används till |
|---|---|---|
ODDS_API_KEY | Nej | Bookmakerodds från The Odds API. Utan nyckel används bara Svenska Spels egna odds. |
GEMINI_API_KEY | Nej, men behövs för fas 4 | Gemini: tolkning av tipsartiklar och matchkommentarer. Gratis nyckel på aistudio.google.com. |
ANTHROPIC_API_KEY | Nej | Alternativ till Gemini (Claude). Används bara om GEMINI_API_KEY saknas eller AI_LEVERANTOR=claude. |
Lägg till dem under Settings → Secrets and variables → Actions → New repository secret.
Gör också så här:
main och /docs.GitHubs schemalagda körningar kan bli flera timmar sena. Därför startas pipelinen varje timme, och tätare på
lördagar, med python -m pipeline planerad. Den kör auto bara när en tid i pipeline/schema.py (svensk
tid) har passerats och inte körts än. Annars avslutas den direkt utan API-anrop eller dataändringar.
.github/workflows/pipeline.yml kör python -m pipeline auto (svensk tid, sommar/vinter):
| När | Varför |
|---|---|
| Mån 10:00 / 09:00 | Ny kupong (öppnar 07:00), streck, odds, tips och AI-kommentarer |
| Ons, tor, fre 19:00 / 18:00 | Uppdaterade streck, odds och tips |
| Lör 10:30, 11:30, 12:30 / 09:30, 10:30, 11:30 | Förmiddagsuppdateringar före lunch |
| Lör 14:00, 15:00, 15:25 (vintertid även 15:20) | Sista streck och odds före spelstopp 15:59 |
| Lör 16:20 och 19:30 | Slutstreck efter spelstopp, och resultat och utdelning samma kväll |
| Sön 10:00 och 20:00 | Resultat och utdelning om de inte kom på lördagen (fas 5: källstatistik) |
Stänger en omgång en annan dag än lördag (söndag eller helgdag) läggs samma tider i förhållande till det
verkliga spelstoppet (schema.RELATIVA), och på söndagar startas pipelinen lika tätt som på lördagar.
Resultatet hämtas dessutom 2,5 och 4,5 timmar efter omgångens sista avspark, så att omgångar där sista
matchen spelas på söndagen (eller natten mot måndag) rättas så snart Svenska Spel publicerat facit.
GitHub-cron kan vara försenad 5–30 minuter. Därför finns det flera lördagskörningar, och en stängd omgång hämtas om i upp till 48 timmar så att slutstrecken alltid kommer med. Alla steg är idempotenta, så det är ofarligt att köra något två gånger. Du kan också köra manuellt under Actions → Pipeline → Run workflow, inklusive backfill.
Extern start: GitHub hoppar över många schemalagda starter utan förvarning. Därför startar cron-job.org (gratis) pipelinen var 15:e minut med ett anrop till GitHubs API:
https://api.github.com/repos/KKandenas/stryktipsguiden/actions/workflows/pipeline.yml/dispatchesPOST, body: {"ref":"main"} (utan parametrar blir kommandot planerad)Accept: application/vnd.github+json, X-GitHub-Api-Version: 2022-11-28,
Content-Type: application/json och Authorization: Bearer <nyckel>Starter som inte behövs avslutas efter cirka 20 sekunder utan API-anrop. Actions-minuter är gratis för publika repon. När nyckeln går ut slutar de externa starterna, och då gäller GitHubs egen cron igen.
Frysning: vid varje körning medan omgången är öppen sparas en ögonblicksbild av kupongen
(frysta_kuponger, migrering 009). Efter spelstopp visar appen den senaste bilden, alltså läget vid
sista körningen före spelstopp, så att förslaget och rättningen inte ändras när slutstrecken kommer in.
data/stryktips.db (SQLite). Alla tider är i UTC.
| Tabell | Innehåll |
|---|---|
omgangar | Omgång (Svenska Spels nummer), datum, spelstopp, omsättning, utdelning och antal vinnare för 13–10 rätt |
matcher | 13 per omgång: lag, liga, land, avspark, resultat, mål, inställd |
streck | Svenska folkets streck (%), en rad per ögonblicksbild där något ändrats |
odds | Odds per bolag och ögonblicksbild. svenskaspel = aktuella, svenskaspel_start = vid öppning, övriga = The Odds API |
kallor | Tipskällor (t.ex. Tio tidningars tips, och tipssajter från fas 4) |
tips | Senaste tipset per match och källa |
prognoser | Modellens sannolikheter per modellversion (fas 2) |
kallstatistik | Brier score per källa och liga (fas 5) |
Migreringar ligger i pipeline/migrations/NNN_namn.sql och körs automatiskt i nummerordning.
Ändra aldrig en fil som redan körts. Lägg i stället till en ny med nästa nummer.
Felhantering: varje källa valideras innan något sparas (13 matcher, streck som summerar till cirka 100, odds över 1,0 och så vidare). En trasig källa loggas som fel, och pipelinen fortsätter med resten. Körningen markeras som misslyckad i Actions bara om Svenska Spel eller resultaten fallerar.
pipeline/model/:
sannolikhet.py): 1/odds delas med summan, så att bookmakerns marginal
försvinner. Har vi odds från flera bolag används snittet. Svenska Spels startodds används bara om
inga senare odds finns.odds-v1, som också räknas vidare för jämförelse.modeller.py): varje modell har en version (nu odds-v2). Prognoserna sparas per
version i prognoser, så att versionerna kan jämföras i backtest. Ändra aldrig en befintlig version,
skapa en ny.Utvärdering på 3 245 matcher (2021–2026, Svenska Spels startodds). Lägre är bättre:
| Brier | Log loss | |
|---|---|---|
| Odds, proportionell metod | 0,6081 | 1,0146 |
| Odds, potensmetod | 0,6083 | 1,0147 |
| Svenska folkets streck | 0,6188 | 1,0315 |
Oddsen träffar tydligt bättre än strecken, och den skillnaden är vad värdet bygger på.
https://kkandenas.github.io/stryktipsguiden/. Lägg till ?exempel i adressen för att alltid se exempelkupongen.
Appen ligger i docs/ och består av index.html, app.css, app.js, optimizer.js och backtest.js. Den läser
kupong.json och faller tillbaka på exempel-kupong.json om filen saknas. Vald budget och låsta
tecken sparas i webbläsarens localStorage, per omgång.
Vyer (menyn högst upp, adresser med # så att bakåtknappen fungerar):
| Vy | Innehåll |
|---|---|
#kupong | Veckans kupong med radförslag. Mellan spelstopp och måndag visas den stängda eller rättade omgången. |
#rattning | Förra omgången: senast stängda omgången (senaste.json) med resultat, vilka tecken som gick in och hur många rätt och kronor systemet gav. Använder den budget och de låsningar du hade den veckan, om de finns sparade. |
#statistik | Så har modellen träffat |
#backtest | Om du spelat varje vecka |
#hjalp | Så läser du kupongen |
#om | Så funkar Stryktipsguiden: syfte, källor, hur chans, värde och rader räknas fram, uppdateringar |
Cache: filerna laddas med versionsnummer (app.js?v=…) så att mobilen aldrig blandar gammal
och ny kod efter en uppdatering. Byt versionen överallt när appen ändras (index.html,
app.js, backtest.js). Testet tests/test_appfiler.py kontrollerar att de är lika.
Lokalt (ES-moduler kräver en server, så det går inte att dubbelklicka på filen):
python3 -m http.server 8765 -d docs
Öppna sedan http://localhost:8765.
docs/optimizer.js)Antalet rader bestämmer garderingarna exakt (2^halv · 3^hel = rader):
| Rader | 1 | 16 | 32 | 48 | 64 | 96 | 128 | 144 | 192 | 256 | 384 | 576 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Fördelning | 13 spik | 4 halv | 5 halv | 4 halv + 1 hel | 6 halv | 5 halv + 1 hel | 7 halv | 4 halv + 2 hel | 6 halv + 1 hel | 8 halv | 7 halv + 1 hel | 6 halv + 2 hel |
För varje match och teckenval S räknas en poäng ut:
(1 − λ)·log(Σ chans) + λ·log(Σ chans/streck). Första delen är träffchansen, och den andra är
förväntad utdelning, där understreckade tecken betalar mer. Dynamisk programmering över
(match, antal halv, antal hel) hittar den kombination som ger högst total poäng. Låsta tecken blir tvingade val.
(Fram till oktober 2026 fanns 432 rader = 4 halv + 3 hel i stället för 256; tabellen nedan är från då.)
Risknivån λ = 0,3 valdes efter backtest på 252 avgjorda omgångar med riktiga utdelningar för 10–13 rätt:
| λ | Andel omgångar med ≥11 rätt (192 rader) | Återbetalning 192 rader | Återbetalning 432 rader |
|---|---|---|---|
| 0,0 | 20 % | 45 % | 37 % |
| 0,3 | 20 % | 44 % | 96 % |
| 0,5 | 11 % | 24 % | 25 % |
| 0,7 | 4 % | 27 % | 52 % |
Upp till λ ≈ 0,3 kostar värdetänkandet nästan ingen träffsäkerhet. Högre λ sänker träffsäkerheten
tydligt. Återbetalningen är brusig, eftersom ett fåtal 13-rättare avgör mycket, och historiken
bygger på Svenska Spels startodds. Den ska därför läsas som en riktning, inte en garanti.
Orange prick visas när chansen är minst 3 procentenheter över strecken (VARDE_GRANS). Matcher där
bara Svenska Spels odds finns (oftast Superettan och nedåt, eftersom The Odds API inte täcker dem)
märks osäkrare och kräver 5 procentenheter (VARDE_GRANS_OSAKER). I historiken är oddsens försprång
mot folket mindre där: Brier 0,609 mot 0,615 för Ettan och division 2, jämfört med 0,614 mot 0,627 för
engelska matcher.
Experterna i matchvyn rankas efter träffsäkerhet på matcher från samma land (England/Sverige/ Övrigt), senaste 8 veckorna, med minst 10 matcher. Annars används hela historiken, och om det inte räcker heller, alla ligor. Poäng: rätt spik 1, halvgardering ½, helgardering ⅓.
node --test tests/js/*.test.mjs
Körs automatiskt i GitHub Actions. Lokalt krävs Node 18 eller senare.
Förutom modultesterna finns två kontroller av själva appen, båda utan beroenden:
identifierare.test.mjs – statisk kontroll att alla namn som används i docs/*.js är deklarerade,
importerade eller globala i webbläsaren (fångar t.ex. en hjälpfunktion som aldrig definierats).app.test.mjs och app-demo.test.mjs – röktest som laddar docs/index.html och docs/app.js i en liten
DOM (minidom.mjs) med kupongen som öppen, stängd, avgjord och inställd, klickar runt och besöker alla vyer.
Testet fallerar om något fel kastas eller loggas med console.error.AI anropas bara från pipelinen (pipeline/ai/), aldrig från appen. Gemini är förvalt
(gemini-3.8-flash, gratisnivå via Google AI Studio). Claude finns kvar som alternativ.
Leverantören väljs efter vilken nyckel som finns: GEMINI_API_KEY i första hand och
ANTHROPIC_API_KEY i andra. AI_LEVERANTOR=claude tvingar Claude. Utan nyckel, eller på
Python < 3.10 där SDK:erna inte finns, hoppas AI-stegen över med en loggrad.
| Källa | Typ | Hur artiklar hittas |
|---|---|---|
| Tio tidningars tips | svensk, från Svenska Spel | ingår i kupongdatan (fas 1) |
| speltips.se | svensk, en artikel per omgång | RSS-flödet: nyaste "Stryktipset d/m" veckan före spelstopp |
| hurbra.se | svensk, en artikel per omgång ("Tipset: X2") | adressen följer spelstoppets datum: /stryktipset-10-oktober-2026/ |
| bettingstugan.se | svensk, analys med tecken per match | länk med omgångens datum på /stryktipset, huvudanalysen i första hand |
| tippat.se | svensk, expertens kupong ("Sparka & Spring") | fast sida; valda tecken (färgmarkerade i HTML) märks upp som [VALT 1], och kupongens datum kontrolleras |
| gamblingcabin.se | svensk, panelens spikar och drag (bara några matcher) | senaste panelen från /speltips/, publiceringsdatumet ska vara veckan före spelstopp |
| rekatochklart.com | svensk, tecken för alla matcher och två färdiga system | länk med omgångens datum på /tips/stryktipset/ (stryktipset-tips-17-10) |
| dagensbastaspel.se | svensk, spelteoretisk analys (Miljongänget), tar ofta upp några matcher | länk /analyser/stryktipset-<datum> på startsidan eller /analyser |
| tipsmedoss.com | svensk, tecken för alla matcher plus bank, värdespik och skräll | länk med omgångens datum på /category/stryktipsforslag/ |
| sportsgambler.com | internationell, en artikel per match | ligasidornas länkar <hemma>-vs-<borta>-prediction-…-<datum> paras med kupongen |
| footballpredictions.com | internationell, en artikel per match ("Our prediction: 2 - 1") | ligasidornas länkar med datum (PL, Championship, Bundesliga, Serie A, Ligue 1) |
| sportsmole.co.uk | internationell, en artikel per match ("We say: 2-1") | ligasidornas länkar paras på lagnamn; artikelns avsparksdatum kontrolleras efter hämtning |
Undersökta men inte använda: forebet.com, predictz.com, windrawwin.com, sportytrader.com, oddspedia.com, squawka.com, betensured.com, oddschecker.com och whoscored.com blockerar automatiska anrop. Sportskeeda och FootyStats spärrar AI-tjänster, och vitibet.com spärrar en rad AI-robotar och skriver att de inte vill att data tas för AI. Därför används inte heller den, trots att den har sannolikheter per match. bettingexpert.com och mightytips.com går inte att läsa utan JavaScript. Aftonbladet och Expressen spärrar AI-tjänster i robots.txt. livescore.com spärrar sina nyhetssidor för AI-tjänster. spelbloggare.com har ingen artikel per omgång, bara en allmän guide.
Inga resultatläckor: tips tolkas bara för matcher som inte har startat. Tipssidor visar livestatus och resultat efter avspark, och det får inte påverka tipset (gäller tidiga matcher före spelstopp).
Hämtning (pipeline/webb.py): robots.txt respekteras, sajter med bot-skydd hoppas över,
2 sekunders paus mellan anrop till samma sajt och cache i data/cache/ (sparas mellan körningar
med actions/cache, committas inte). Själva artikeltexten sparas aldrig i databasen, bara en hash.
Tolkning (pipeline/ai/extraktion.py): modellen får matchlistan och artikeltexten och svarar
med strikt JSON enligt ett schema: tecken (1/X/2 eller gardering), sannolikheter bara om artikeln
anger dem, och en kort sammanfattning på svenska. Svaret valideras innan det sparas i tips.
En artikel tolkas om bara om texten ändrats och den förra tolkningen är äldre än 12 timmar.
Kommentarer (pipeline/ai/kommentarer.py): 1–2 meningar per match utifrån chans, streck, värde
och tipsen. En kommentar skrivs om bara när underlaget ändrats märkbart (avrundade värden hashas).
Inställningar i pipeline/ai/klient.py: modell (GEMINI_MODELL, standard gemini-3.8-flash).
Den kan bytas utan kodändring via repo-variabeln GEMINI_MODELL under Settings → Secrets and
variables → Actions → fliken Variables, t.ex. gemini-2.5-flash. Dessutom: tänkande (GEMINI_TANKANDE = "low").
Reservmodeller: är huvudmodellen överbelastad (429 eller 5xx) eller svarar inte inom 90 s provas
nästa modell i kedjan direkt: gemini-3.5-flash-lite, gemini-3.1-flash-lite, gemini-3.7-flash och sedan gemini-3.6-flash. Flash-Lite-modellerna har betydligt större gratiskvoter än de vanliga Flash-modellerna, som bara tillåter omkring 20 anrop per dag. 2.5-modellerna är pensionerade.
Kedjan kan ändras med repo-variabeln GEMINI_RESERVMODELLER, kommaseparerad. En modell som svarat dåligt
flyttas sist för resten av körningen. En modell som inte finns (400 eller 404) hoppas över. Svarar ingen
modell görs ett nytt varv efter 30 s, sedan ges anropet upp. SDK:ts egna omförsök vid 429 och 5xx är avstängda
(HttpRetryOptions(attempts=1, http_status_codes=[408])), eftersom SDK:t annars väntar så länge servern
anger i Retry-After och anropet då ser ut att hänga. En modell vars dagskvot är slut (429 "per day") används
inte mer under körningen.
Anrop per minut: gratisnivån tillåter 5 anrop per minut och modell. Klienten skickar högst 4
(GEMINI_RPM, som kan höjas med en repo-variabel vid betald nivå) och sprider anropen över kedjan. Är alla
modeller fulla väntar den på första lediga plats, högst 75 s per anrop. En modell som ändå svarar 429 vilar i
60 s.
Spärrar så att en körning alltid hinner spara sin data: 3 misslyckade anrop i rad stänger av AI resten av körningen, och AI får ta högst 15 min per körning: tipsen högst 9 min och kommentarerna högst 3 min, så att Lagkoll alltid hinner med. Det som inte hanns med tas vid nästa körning. En körning gör cirka 15 anrop: 13 matchartiklar, 1 kupongartikel och 1 för kommentarerna.
Kostnad: Geminis gratisnivå räcker för det här. Observera att Google får använda innehåll som
skickas på gratisnivån för att förbättra sina produkter. Här är det bara publika artiklar och
kupongdata. Med Claude (claude-opus-5-5) blir det cirka 5–10 USD i månaden.
Lägg till en sajt: se pipeline/sources/tipssajter/__init__.py. Det är en klass med
hitta_artiklar(), och resten (hämtning, AI, lagring, kommentarer) sköts automatiskt.
pipeline/model/statistik.py körs automatiskt när en ny omgång blivit avgjord (oftast söndag):
kallstatistik): Brier score och träffprocent per källa och liga mot faktiska
resultat. Källorna är Svenska folket (streck), Tio tidningars tips, speltips.se och sportsgambler.com.
Tips som bara anger tecken räknas om till sannolikheter: valda tecken delar på 80 %.pipeline/model/ensemble.py): logistisk regression som väger ihop odds, streck och
tips som ett viktat geometriskt snitt, log p ∝ Σ vikt_källa · log p_källa plus en justering per
tecken. En källa som saknas för en match påverkar inte den matchen, och en källa vägs in först när
den finns för minst 200 träningsmatcher. Vikterna skattas med Newtons metod, i ren Python.prognoser
och vikterna i modellvikter.modellstatistik): Brier, log loss och träffprocent per modellversion och liga,
på samma matcher för alla versioner.installningar.aktiv_modell.Läget i oktober 2026 (2 782 matcher, 2022–2026):
| Brier | Log loss | Träff | |
|---|---|---|---|
| odds-v1 (används) | 0,6079 | 1,0141 | 49 % |
| ensemble-v1 | 0,6091 | 1,0161 | 49 % |
| Svenska folket | 0,6146 | – | 50 % |
| Tio tidningars tips | 0,8207 | – | 50 % |
Sammanvägningen slår ännu inte oddsen. Bookmakers odds innehåller redan det strecken och tidningarna vet, så appen använder bara odds, precis som det är tänkt tills något bevisligen är bättre. Valet görs om varje vecka: när tipssajterna och bookmakeroddsen från The Odds API har samlat historik kan ensemble-v1 ta över av sig själv.
Under "Så har modellen träffat" kan man välja startår (Alla eller från 2023, 2024 osv.). Exporten
räknar då om modellernas, källornas och ligornas träffsäkerhet från det året
(export.statistik_per_ar). Modellerna jämförs alltid på samma matcher. I appen visar avsnittet tabellen ovan, träffsäkerhet per liga och hur
många rätt modellens och folkets favorittecken fick de senaste tio omgångarna.
I appen heter förslagen Oddsen (basmodellen odds-v2) och Med experter (tips-v1).
Med experter är ett parallellt förslag som väljs med växeln Oddsen / Med experter högst upp på kupongen.
Det väljs aldrig automatiskt. tips-v1 väger ihop bookmakerodds (odds-v2) och tipsarna (Tio
tidningars tips, speltips.se, sportsgambler.com) med samma logistiska regression som ensemble-v1,
men utan strecken:
l2 = 5), så att lite data bara flyttar vikten lite.TAK_STARTVIKT_TIPS, som fyra tipsare). Sajterna läser ofta samma odds och varandra, så utan tak
skulle varje ny sajt flytta förslaget mer mot favoriten. En tipsare med skattad vikt ligger utanför taket,
eftersom regressionen då själv delar vikten mellan källor som tipsar likadant. Taket släpper alltså av sig
självt allteftersom sajterna får 30 avgjorda matcher.tips-v1 mäts i modellstatistiken bredvid odds-v2.tips.system) och systemets storlek (tips.system_rader, migrering 008). Varje sajts system
är en egen källa, "namn (system)", med egen startvikt och inlärd vikt, och räknas om med samma
spik/halv/hel-regel. Olika stora system hanteras bara genom den inlärda vikten. Finns flera system i
en artikel används det minsta.Läget i oktober 2026: Tio tidningars tips har vikt 0,016 (3 692 matcher, tillför nästan inget utöver oddsen). speltips.se, hurbra.se, bettingstugan.se, tippat.se, gamblingcabin.se, sportsgambler.com, sportsmole.co.uk och footballpredictions.com samlas in från och med nu (rekatochklart.com, dagensbastaspel.se och tipsmedoss.com från 17 oktober) och står på startvikten tills de har 30 avgjorda matcher, vilket tar ungefär 3–4 veckor.
Varje modell i pipeline/model/modeller.py har ett visningsnamn, en roll och en flagga framat:
| Roll | Betydelse |
|---|---|
bas | Oddsen (odds-v2). Allt jämförs mot den. |
alternativ | Eget förslag i appen, i dag "Med experter". |
skugga | Sparar prognoser och mäts, men påverkar inga rader. |
arkiv | Äldre version som mäts som jämförelse. |
Modeller med framat = True går inte att räkna om på historiken, till exempel sådana som bygger på
AI-analys av dagsaktuella nyheter. De räknas bara för öppna omgångar, så det som sparas är alltid den
sista prognosen före spelstopp. De ingår inte i huvudtabellen, eftersom de annars skulle krympa det
gemensamma urvalet.
Statistiksidan visar varje modell, och Svenska folket, parvis mot oddsen på exakt samma matcher
(export.parvis). Måttet är log loss per match. Slutsatsen "bättre" eller "sämre" dras bara när
medelskillnaden är större än två standardfel och modellen har minst 100 matcher. Annars visas
"ingen säker skillnad" eller "för lite data". Med 13 matcher i veckan tar det i regel ett halvår eller
mer innan små skillnader går att se.
Ett "minne" per lag och en AI-jämförelse av lagen före varje omgång (pipeline/lagkoll.py).
Underlag
lagfakta, en rad per match, lag och källa.sources/bbc.py, tillåtna i robots.txt), med
formen i de sex senaste matcherna. Ligor som BBC saknar, som Superettan och Eliteserien, tas från
Wikipedia utan form. Tränarbyten kommer från Wikipedias säsongsartikel (sources/wikipedia.py). Bara
vanliga /wiki/-sidor används, eftersom /w/ och /api/ är spärrade i robots.txt. Allt hämtas högst var
sjätte timme, vid varje körning (steg_tabeller), och sparas i ligatabeller och ligakallor.
Matchdetaljen visar placering och de fem senaste matcherna för båda lagen hela veckan.Historik: lagfakta och lagkoll skrivs över, men varje ny eller ändrad nyhet och varje ny analys
loggas också i lagfakta_historik och lagkoll_historik (migrering 013, med triggers), med tidpunkten då den
först dök upp och oddsen som analysen utgick från. Jämfört med oddsens historik går det senare att se vilka
nyheter marknaden redan kände till och vilka typer av nyheter som påverkar resultatet.
Analysen delar dessutom upp sin justering per faktor (delar, migrering 014): typ (lagkoll.FAKTORTYPER,
till exempel nyckelspelare borta, tränarbyte, form eller tät matchning), vilket lag, vilket tecken den gynnar
och ungefär hur många procentenheter. Det kostar inga extra AI-anrop.
Analys: när spelstoppet är högst 36 timmar bort, alltså vid fredagskvällens och lördagens körningar,
får AI-modellen oddsens sannolikheter och båda lagens profiler. Den justerar sannolikheterna, med högst
12 procentenheter per tecken, och anger skrällrisk, motivering och faktorer. Analysen görs bara om
underlaget ändrats (underlag_hash). Tabellen ensam räcker inte som underlag, eftersom den redan finns
i oddsen. Det krävs fakta ur artiklar eller ett tränarbyte från de senaste 60 dagarna.
Resultatet sparas i lagkoll och blir prognoser för lagkoll-v1 (framat = True, roll skugga). Appen
visar analysen i matchdetaljen. Lagkoll kan också väljas som förslag, och då används Lagkolls chans där en
analys finns, annars Oddsens. Statistiksidan mäter den mot oddsen, och backtestet tar med omgångar där
Lagkoll analyserat något (fält 9 i historik.json). Manuellt: python -m pipeline lagkoll, som analyserar direkt oavsett tid till spelstopp.
Testat mot 3 289 avgjorda matcher sedan 2021, med oddsens chans (Svenska Spels startodds i historiken) mot faktiskt utfall. "Kvot" = utfall / oddsens chans, där 1,00 betyder att oddsen stämde. Skriptet finns inte i repot, men tabellerna går att återskapa med prognoser (odds-v2), streck och tips.
| Signal | Resultat |
|---|---|
| Oddsens kalibrering per tecken och nivå | Stämmer i alla grupper (kvot 0,94–1,08, inom felmarginalen). Ingen favorit–longshot-snedhet. |
| Värdekvot chans/streck | Förutsäger inte utfallet. Understreckade tecken går in så ofta som oddsen säger, inte oftare. |
| "Favoritfällan" (favorit ≥ 50 % och överstreckad) | Ingen effekt. Överstreckade favoriter vinner lika ofta som oddsen säger. |
| Jämna matcher och kryss | Kryssen stämmer med oddsen oavsett hur jämn matchen är. |
| Liga | Ingen liga avviker säkert. FA-cupen 0,91 och League Two 0,93, men med få matcher. |
| Tio tidningars tips emot favoriten (≤ 4/10 på favoriten) | Signal: favoriten vann 32 % mot 39 % enligt oddsen (kvot 0,82 ± 0,15). Troligen för att tidningarna tippar senare än startoddsen. Ingår redan i tips-v1. |
Slutsatsen är att skrällar i stort inte går att förutsäga bättre än oddsen. Värdet ligger i utdelningen. För omgångens tre mest understreckade icke-favoriter med chans ≥ 20 % spelar graden av understreckning roll:
| Kvot chans/streck | Antal | Gick in | Oddsen sa | Utfall/streck |
|---|---|---|---|---|
| 1,25–1,5 (topp 3 per omgång) | 651 | 29,0 % | 26,6 % | 1,53 |
| över 1,5 | 419 | 20,0 % | 25,6 % | 1,28 |
Över 1,5 visste folket ofta något som startoddsen inte tagit in. Skrällchans är därför kvot 1,25–1,5,
högst tre per omgång (skrallchanser i docs/optimizer.js, samma regel i export.skrallchanser).
Förslaget Skrällchans (skrallKrav) är Oddsens förslag med kravet att raderna innehåller de bästa
skrällarna: 1 upp till 64 rader och 2 på större system. Låsta matcher får inget krav. Backtest 2021–2026
(återbetalning, med och utan 13 rätt):
| Rader | Oddsen | Skrällchans | Oddsen utan 13 rätt | Skrällchans utan 13 rätt |
|---|---|---|---|---|
| 64 | 46 % | 34 % | 46 % | 34 % |
| 96 | 40 % | 24 % | 40 % | 24 % |
| 128 | 49 % | 394 % | 39 % | 54 % |
| 256 | 38 % | 217 % | 33 % | 47 % |
| 576 | 38 % | 120 % | 33 % | 44 % |
De höga totalerna kommer från en enda 13-rättare (december 2025). Utan den ger Skrällchans ändå mer tillbaka än Oddsen från 128 rader och uppåt, men mindre på små system.
Infört i oktober 2026: skrällarna väljs ur Med experters chans (tips-v1) där den finns, annars oddsens
(skrallUnderlag i docs/optimizer.js, samma i export.skrallchanser). Raderna i övrigt byggs på oddsen.
Backtest, återbetalning med kravet 1 skräll upp till 64 rader och 2 därefter:
| Rader | Period | Skräll enligt oddsen | Skräll enligt Med experter |
|---|---|---|---|
| 64 | alla år | 34 % | 42 % |
| 64 | 2024– | 35 % | 35 % |
| 128 | alla år (utan 13 rätt) | 394 % (54 %) | 408 % (68 %) |
| 256 | alla år (utan 13 rätt) | 217 % (47 %) | 223 % (53 %) |
Den nya varianten var lika bra eller bättre i alla fall som testades. I historiken består "experterna" mest av Tio tidningars tips. Matchdetaljen visar hur många experter som tippar skrällen.
Testat i oktober 2026 utan att det infördes: att välja skrällar där högst 6 av Tio tidningars tips höll på favoriten först. Varje vald skräll träffade något oftare (31 % mot 28 % för den bästa), men i backtestet med riktig utdelning blev resultatet detsamma eller något sämre (576 rader: 116 % mot 120 %). Regeln förblir kvot 1,25–1,5, högst kvot först.
Odds- och streckrörelser under veckan går inte att testa bakåt, eftersom Svenska Spels API bara har startodds och slutstreck för gamla omgångar. Pipelinen sparar ögonblicksbilder vid varje körning sedan oktober 2026, så den analysen kan göras när det finns en säsong data. xG finns inte från någon fri källa som tillåter insamling. Det hör hemma i Lagkoll (steg 3).
Utdelningen kan förutsägas mycket väl från strecken på de rätta tecknen
(log utdelning ≈ a + b·Σ log streck, R² 0,90 för 13 rätt och 0,97 för 12–10 rätt, med 15 kr som
lägsta utbetalning). En optimerare som maximerade förväntad utdelning enligt den modellen testades
i oktober 2026 och gav sämre verkligt utfall i backtestet än dagens metod. Den valde tecken där
oddsen och strecken skiljer sig mest, och just där har sannolikheterna mest brus, som förstärks
över 13 matcher. Att dra sannolikheterna mot strecken hjälpte inte heller. Backtestet
(253 omgångar) är dessutom för brusigt för att finjustera λ: ett byte från 0,30 till 0,25 ändrar
utfallet kraftigt beroende på enstaka 12-rättare. Därför behålls λ = 0,3. Försöket kan göras om
när historiken har skarpare odds (odds-v2 med Pinnacle).
Historiska stängningsodds från football-data.co.uk används inte, eftersom sajtens robots.txt uttryckligen spärrar AI-tjänster.
Pipelinen skriver docs/historik.json (cirka 160 kB), med chans, streck, resultat och utdelning för
13–10 rätt för varje avgjord omgång där modellen har prognoser (från december 2021). Appen laddar
filen först när avsnittet öppnas och kör varje omgång genom samma optimizer.js som tar fram
dina rader, så backtestet räknar exakt som appen. Logiken finns i docs/backtest.js.
historik.json har den tipsviktade chansen
som åttonde fält per match), antal rader per vecka (1–576), och ser insats, tillbaka, netto, antal 13/12/11/10 rätt,
saldot vecka för vecka, utfallet per år och de största vinsterna.Exempel med 64 rader i veckan och 253 omgångar: modellen fick tillbaka 46 % (−8 807 kr) och folket 13 % (−14 125 kr). Svenska Spel behåller ungefär en tredjedel av insatserna, så att gå plus är svårt. Modellen förlorar betydligt mindre än att följa folket.
Valfritt och avstängt tills docs/firebase-config.js är ifylld. Uppsättningen beskrivs i
FIREBASE.md.
docs/konto.js laddar Firebase (Authentication och Firestore) först när någon använder kontot.
?demo-konto ger en låtsasdatabas i minnet.docs/minaspel.js är ren logik: skapa spel, ändra tecken, rätta mot historik.json, sammanställa och
jämföra med förslaget utan egna ändringar. Tester finns i tests/js/minaspel.test.mjs.firestore.rules: man läser och skriver bara sitt eget, utom spel som ägaren delat med ens verifierade
e-postadress. delad_med kopieras till varje spel, så att en enkel array-contains-fråga räcker.docs/spelbolag.js, tester i tests/js/spelbolag.test.mjs): spelformen är antingen
kassa, där en kassör spelar för allas pengar, eller turordning, där en medlem spelar per vecka.
#gamed-<kod>.historik.json. Kassaboken, som skaparen och kassören fyller i,
tar inbetalningar, utbetalningar och spel eller vinster utanför appen.Det enda appen läser. Formatet finns beskrivet i början av pipeline/export.py. Kort sammanfattat:
omgång (id, datum, spelstopp, status), och för varje match lag, liga, avspark, chans, streck,
varde och odds (för 1/X/2), tips, kommentar och resultat. statistik innehåller det som visas
under "Så har modellen träffat".
docs/exempel-kupong.json är omgång 4974 visad som öppen, så att appen kan testas även när ingen
omgång är öppen. docs/senaste.json har samma format och innehåller den senast stängda omgången
(för rättningen), och docs/historik.json är underlaget för backtestet.
Se DATAKALLOR.md för exakta endpoints och fält.