Automatisera Piotroski F-Score för svenska aktier
En genomgång av Piotroski F-Score och hur du använder BörsAPI för att bygga en automatisk kvalitets-screener för svenska börsbolag.
Piotroski F-Score är ett poängsystem mellan 0 och 9 som utvecklades av professorn Joseph Piotroski för att snabbt utvärdera den finansiella hälsan och kvaliteten hos ett bolag. Genom att kombinera 9 olika kriterier kan du gallra bort finansiellt svaga bolag från dina investeringar.
De 9 Kriterierna i F-Score
F-Score ger 1 poäng för varje uppfyllt kriterium inom tre huvudkategorier:
1. Lönsamhet (Profitability)
- Positiv nettovinst: Vinst för året är större än noll.
- Positivt kassaflöde: Kassaflöde från den löpande verksamheten är större än noll.
- Ökad ROA (Return on Assets): Årets ROA är högre än föregående års ROA.
- Kvalitet på vinsten: Det löpande kassaflödet är större än nettovinsten.
2. Hävstång och Likviditet (Leverage / Liquidity)
- Minskad hävstång: Långfristiga skulder i förhållande till tillgångar har minskat jämfört med förra året.
- Ökad likviditet: Balanslikviditeten (Current Ratio) har ökat jämfört med förra året.
- Ingen utspädning: Inga nya aktier har emitterats under året (antalet utestående aktier har inte ökat).
3. Operationell Effektivitet (Operating Efficiency)
- Ökad bruttomarginal: Årets bruttomarginal är högre än föregående års.
- Ökad kapitalomsättningshastighet: Tillgångarnas omsättningshastighet har ökat jämfört med föregående år.
Python-kod för att räkna ut F-Score
Här är ett färdigt Python-script som hämtar data från BörsAPI och automatiskt kalkylera Piotroski F-Score för ett bolag baserat på de två senaste årsredovisningarna.
import requests
API_KEY = "fd_din_api_nyckel_här"
COMPANY_ISIN = "SE0000115446" # Volvo AB
url = f"https://borsapi.se/api/v1/companies/{COMPANY_ISIN}/reports?period_type=year"
headers = {"Authorization": f"Bearer {API_KEY}", "Accept": "application/json"}
resp = requests.get(url, headers=headers)
if resp.status_code == 200:
reports = sorted(resp.json(), key=lambda x: x["period"])
# Hämta de två senaste åren (t.ex. 2023 och 2024)
if len(reports) >= 2:
r_prev = reports[-2] # Föregående år
r_curr = reports[-1] # Innevarande år
f_score = 0
notes = []
# 1. Positiv vinst
net_curr = r_curr.get("net_income", 0) or 0
if net_curr > 0:
f_score += 1
notes.append("Positiv vinst (+1)")
# 2. Positivt operativt kassaflöde
ocf_curr = r_curr.get("operating_cash_flow", 0) or 0
if ocf_curr > 0:
f_score += 1
notes.append("Positivt kassaflöde (+1)")
# 3. ROA-ökning
assets_curr = r_curr.get("total_assets", 1) or 1
assets_prev = r_prev.get("total_assets", 1) or 1
net_prev = r_prev.get("net_income", 0) or 0
roa_curr = net_curr / assets_curr
roa_prev = net_prev / assets_prev
if roa_curr > roa_prev:
f_score += 1
notes.append("Ökad ROA (+1)")
# 4. Kassaflöde > Vinst
if ocf_curr > net_curr:
f_score += 1
notes.append("Kassaflöde > Vinst (+1)")
# 5. Minskad skuldgrad (hävstång)
liab_curr = r_curr.get("total_liabilities", 0) or 0
liab_prev = r_prev.get("total_liabilities", 0) or 0
lev_curr = liab_curr / assets_curr
lev_prev = liab_prev / assets_prev
if lev_curr < lev_prev:
f_score += 1
notes.append("Minskad skuldgrad (+1)")
# 6. Ökad likviditet (balanslikviditet)
curr_assets_curr = r_curr.get("total_current_assets", 0) or 0
curr_assets_prev = r_prev.get("total_current_assets", 0) or 0
# Enkel uppskattning för kortfristiga skulder om ej specifikt angivet
curr_liab_curr = liab_curr * 0.5
curr_liab_prev = liab_prev * 0.5
liq_curr = curr_assets_curr / curr_liab_curr if curr_liab_curr > 0 else 0
liq_prev = curr_assets_prev / curr_liab_prev if curr_liab_prev > 0 else 0
if liq_curr > liq_prev:
f_score += 1
notes.append("Ökad likviditet (+1)")
# 7. Ingen utspädning (antag shares_outstanding)
shares_curr = r_curr.get("shares_outstanding", 1) or 1
shares_prev = r_prev.get("shares_outstanding", 1) or 1
if shares_curr <= shares_prev:
f_score += 1
notes.append("Ingen aktieutspädning (+1)")
# 8. Ökad bruttomarginal
rev_curr = r_curr.get("revenue", 1) or 1
rev_prev = r_prev.get("revenue", 1) or 1
gp_curr = r_curr.get("gross_profit", 0) or 0
gp_prev = r_prev.get("gross_profit", 0) or 0
gm_curr = gp_curr / rev_curr
gm_prev = gp_prev / rev_prev
if gm_curr > gm_prev:
f_score += 1
notes.append("Ökad bruttomarginal (+1)")
# 9. Ökad tillgångsomsättning
turnover_curr = rev_curr / assets_curr
turnover_prev = rev_prev / assets_prev
if turnover_curr > turnover_prev:
f_score += 1
notes.append("Ökad tillgångsomsättning (+1)")
print(f"Piotroski F-Score: {f_score}/9")
print("Detaljer:")
for note in notes:
print(f" - {note}")
else:
print("För få årsredovisningar tillgängliga för att räkna ut F-Score.")
else:
print(f"Ett fel uppstod: {resp.text}")Kom igång med BörsAPI
För att använda dessa mallar och skript behöver du ett personligt konto och en API-nyckel. Det är helt kostnadsfritt under vår beta-period.
Registrera dig på några sekunder via registreringssidan.
Gå till din Dashboard och klicka på "Generera API-nyckel".
Ersätt placeholder-nyckeln i källkoden eller kalkylarket med din personliga nyckel.