Simulazione Monte Carlo per il Rischio di Cassa nel Franchising: Oltre il Break-Even Point

Cerca:

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors

Un business plan può indicare che un punto vendita raggiungerà il pareggio con 778 vendite al mese e, nello stesso tempo, non essere sufficiente per capire se l’attività riuscirà effettivamente a superare i primi mesi di esercizio.

Il problema nasce dal fatto che il Break-Even Point descrive una soglia economica, mentre la sopravvivenza dell’impresa dipende anche dalla sequenza temporale con cui ricavi e costi si trasformano in flussi di cassa.

Durante la fase di avvio di un franchising, questa distinzione diventa particolarmente importante. Un punto vendita può avere un margine di contribuzione positivo a regime, ma trovarsi comunque in difficoltà se la domanda iniziale è inferiore alle attese, i costi variabili aumentano oppure la liquidità disponibile non è sufficiente a finanziare i mesi di perdita.

Il problema, quindi, non consiste soltanto nel chiedersi quante unità sia necessario vendere per raggiungere il pareggio, ma nel valutare con quale probabilità la liquidità rimarrà positiva lungo l’intero percorso operativo.

La simulazione Monte Carlo permette di affrontare questo problema generando migliaia di possibili traiettorie della domanda e trasformando ciascuna traiettoria in un percorso di ricavi, costi e liquidità. Il risultato non è più un unico valore previsto, ma una distribuzione di possibili risultati sulla quale è possibile misurare probabilità di default, minimo livello di cassa, cassa finale e vulnerabilità ai diversi scenari.

L’esempio seguente utilizza un franchising come caso applicativo, ma la stessa struttura può essere utilizzata per analizzare un progetto di investimento, una nuova apertura commerciale, un piano di espansione o qualsiasi attività nella quale la liquidità dipenda da ricavi incerti e costi relativamente rigidi.

Pubblicità

Il limite del Break-Even Point deterministico

Nella sua formulazione più semplice, il Break-Even Point espresso in quantità è:

[math]\displaystyle Q_{BEP} = \frac{CF}{P-CV}[/math]

dove:

  • [math]CF[/math] rappresenta i costi fissi;
  • [math]P[/math] è il prezzo unitario;
  • [math]CV[/math] è il costo variabile unitario.

Supponiamo che il punto vendita sostenga 14.000 euro di costi fissi mensili, venda ogni unità a 30 euro e sostenga un costo variabile unitario di 12 euro.

Il margine di contribuzione unitario è quindi:

[math]\displaystyle MC=30-12=18\ \text{€}[/math]

e il Break-Even Point diventa:

[math]\displaystyle Q_{BEP}=\frac{14.000}{18}\approx 777{,}78[/math]

Il punto vendita deve quindi vendere circa 778 unità al mese per coprire i costi.

Se la domanda media prevista è di 1.000 unità mensili, il margine rispetto al Break-Even Point sembra piuttosto ampio. Tuttavia, questo calcolo non dice nulla sulla liquidità necessaria per sostenere un periodo nel quale la domanda effettiva rimane sotto la soglia.

Il problema emerge ancora più chiaramente se si considera una cassa iniziale limitata. Un’attività che parte con 10.000 euro di liquidità non dispone dello stesso margine di sopravvivenza di un’attività che parte con 50.000 euro, anche se entrambe hanno esattamente lo stesso Break-Even Point.

Il Break-Even Point rimane quindi un indicatore utile, ma deve essere interpretato come una soglia economica e non come una misura completa del rischio finanziario.

Dalla domanda media alla distribuzione degli scenari

La domanda mensile non viene trattata come un valore fisso di 1.000 unità, ma come una variabile casuale.

Per questo esempio utilizziamo una distribuzione log-normale, che permette di evitare valori negativi e rappresenta una domanda caratterizzata da una certa asimmetria. L’uso di una distribuzione specifica non deve però essere considerato un dettaglio puramente tecnico: nella simulazione Monte Carlo la scelta delle distribuzioni degli input è una delle decisioni che incidono maggiormente sulla qualità del risultato.

Impostiamo una domanda media di 1.000 unità e una deviazione standard pari al 20% della media.

import numpy as np
import pandas as pd

rng = np.random.default_rng(42)

n_sim = 100_000
months = 24

target_mean = 1_000
sigma_domanda = 0.20

prezzo = 30
costo_variabile = 12
costi_fissi = 14_000

# Liquidità iniziale volutamente più contenuta
# per rendere osservabile il rischio di cassa
cassa_iniziale = 10_000

# Parametro della normale sottostante alla log-normale
mu_domanda = (
    np.log(target_mean)
    - (sigma_domanda ** 2) / 2
)

domanda_base = rng.lognormal(
    mean=mu_domanda,
    sigma=sigma_domanda,
    size=(n_sim, months)
)

print("Dimensione matrice:", domanda_base.shape)
print("Domanda media simulata:",
      domanda_base.mean())
print("Domanda mediana simulata:",
      np.median(domanda_base))

L’output atteso avrà una struttura simile alla seguente:

Dimensione matrice: (100000, 24)
Domanda media simulata: circa 1000
Domanda mediana simulata: inferiore a 1000

La prima informazione conferma che sono state generate 100.000 traiettorie, ciascuna composta da 24 mesi, per un totale di 2,4 milioni di osservazioni.

La differenza tra media e mediana è invece una conseguenza della log-normalità. La distribuzione è asimmetrica e alcuni valori elevati della domanda spingono la media verso l’alto rispetto alla mediana. Questo è importante perché il valore medio di 1.000 unità non significa che 1.000 sia il risultato più frequente di un singolo mese.

Dal punto di vista applicativo, questa è la prima differenza rispetto al business plan deterministico: invece di dire “la domanda sarà di 1.000 unità”, il modello considera 1.000 come valore medio di una popolazione di possibili domande.

Pubblicità

Dalla domanda al conto economico mensile

La domanda simulata viene trasformata in ricavi e costi attraverso le relazioni economiche del punto vendita.

Il flusso di cassa operativo mensile è:

[math]\displaystyle CF_t=Q_t(P-CV)-CF[/math]

dove [math]Q_t[/math] è la domanda osservata nel mese [math]t[/math].

Il codice seguente costruisce la dinamica della liquidità:

def calcola_cash_flow(domanda, costo_variabile_mensile):
    
    ricavi = domanda * prezzo
    
    costi_variabili = (
        domanda * costo_variabile_mensile
    )
    
    cash_flow = (
        ricavi
        - costi_variabili
        - costi_fissi
    )
    
    cash_balance = (
        cassa_iniziale
        + np.cumsum(cash_flow, axis=1)
    )
    
    return cash_flow, cash_balance

La funzione restituisce due oggetti diversi ma complementari.

Il primo è il flusso di cassa mensile, che permette di capire in quali mesi l’attività genera o assorbe liquidità. Il secondo è il saldo progressivo della cassa, che permette di individuare il momento in cui la liquidità diventa insufficiente.

Questa distinzione è essenziale perché un mese negativo non implica automaticamente un default. Se la cassa iniziale è sufficientemente elevata, l’impresa può assorbire temporaneamente il deficit.

Al contrario, anche una serie relativamente breve di flussi negativi può provocare un’insolvenza se il capitale iniziale è insufficiente.

La probabilità di default diventa la variabile centrale

Definiamo come default operativo l’evento nel quale la liquidità diventa negativa almeno una volta durante i 24 mesi simulati.

def analizza_scenario(
    domanda,
    costo_variabile_mensile,
    nome_scenario
):

    cash_flow, cash_balance = calcola_cash_flow(
        domanda,
        costo_variabile_mensile
    )

    default_mask = cash_balance < 0

    ha_default = default_mask.any(axis=1)

    prob_default = ha_default.mean()

    idx = np.arange(months)

    t_default = np.where(
        default_mask,
        idx,
        np.inf
    ).min(axis=1)

    # Break-Even Point mensile
    if np.isscalar(costo_variabile_mensile):

        bep_units = (
            costi_fissi
            / (prezzo - costo_variabile_mensile)
        )

        raggiunto_bep = (
            domanda >= bep_units
        )

    else:

        bep_mensile = (
            costi_fissi
            / (
                prezzo
                - costo_variabile_mensile
            )
        )

        raggiunto_bep = (
            domanda >= bep_mensile
        )

    t_bep = np.where(
        raggiunto_bep,
        idx,
        np.inf
    ).min(axis=1)

    default_pre_bep = (
        (t_default < t_bep)
        & np.isfinite(t_default)
    )

    prob_default_pre_bep = (
        default_pre_bep.mean()
    )

    min_cash = cash_balance.min(axis=1)

    p5_min_cash = np.percentile(
        min_cash,
        5
    )

    cassa_finale = cash_balance[:, -1]

    mediana_finale = np.median(
        cassa_finale
    )

    prob_finale_negativa = (
        cassa_finale < 0
    ).mean()

    return {
        "Scenario": nome_scenario,
        "Probabilità default": prob_default,
        "Default prima del BEP": prob_default_pre_bep,
        "5° percentile minimo cash": p5_min_cash,
        "Cassa finale mediana": mediana_finale,
        "Cassa finale negativa": prob_finale_negativa
    }

Questa funzione concentra in un unico punto le principali metriche di rischio.

Forse potrebbe interessarti anche:  La Matematica della Tombola: perché quella Cinquina non arriva mai (e cosa c’entra Python)

La probabilità di default misura quante traiettorie attraversano almeno una volta la barriera della liquidità negativa.

Il default prima del BEP è ancora più interessante, perché identifica gli scenari nei quali il punto vendita entra in crisi prima di aver raggiunto almeno una volta la soglia economica di pareggio.

Il 5° percentile del minimo cash non guarda alla cassa in un momento specifico, ma individua un livello prudenziale della liquidità minima raggiunta lungo l’intero percorso.

Infine, la cassa finale mediana mostra la situazione al termine dei 24 mesi senza lasciarsi condizionare eccessivamente dalle traiettorie particolarmente favorevoli.

Lo scenario base

Possiamo ora eseguire la prima simulazione.

risultato_base = analizza_scenario(
    domanda_base,
    costo_variabile,
    "Base"
)

pd.DataFrame([risultato_base])

Con il seed utilizzato nell’esempio, il risultato è indicativamente:

Scenario                         Base
Probabilità default             0,003%
Default prima del BEP           0,003%
5° percentile minimo cash       8.365,79 €
Cassa finale mediana            105.710,98 €
Cassa finale negativa           0,00%

Questo risultato è interessante proprio perché il rischio appare molto contenuto.

Nel 95% circa delle traiettorie, il minimo livello di cassa non scende sotto il valore rappresentato dal 5° percentile, pari a circa 8.366 euro. La cassa finale mediana supera invece i 100.000 euro.

Dal punto di vista applicativo, il modello suggerisce che con queste ipotesi il capitale iniziale di 10.000 euro è generalmente sufficiente a superare la fase iniziale.

Non significa che il franchising sia certamente sostenibile, perché il risultato dipende dalle ipotesi sulla domanda, sui costi e sulla struttura finanziaria. Significa soltanto che, all’interno del modello costruito, lo scenario base presenta una probabilità simulata di default estremamente bassa.

Questa precisazione è importante: Monte Carlo non trasforma ipotesi arbitrarie in verità. Produce una distribuzione condizionata alle ipotesi che abbiamo scelto.

Pubblicità

Cosa accade se la domanda diminuisce del 10%?

Il primo stress test modifica soltanto la domanda.

risultati = []

risultati.append(
    risultato_base
)

domanda_meno10 = domanda_base * 0.90

risultati.append(
    analizza_scenario(
        domanda_meno10,
        costo_variabile,
        "Domanda -10%"
    )
)

df_rischio = pd.DataFrame(risultati)

df_rischio

Il risultato è indicativamente:

Scenario                         Domanda -10%
Probabilità default             0,217%
Default prima del BEP           0,086%
5° percentile minimo cash       5.832,23 €
Cassa finale mediana             62.539,89 €
Cassa finale negativa            0,001%

La riduzione del 10% della domanda cambia sensibilmente la distribuzione della liquidità, pur senza trasformare lo scenario in una situazione di crisi generalizzata.

La cassa finale mediana passa da circa 105.711 a 62.540 euro e il 5° percentile del minimo cash scende da circa 8.366 a 5.832 euro.

Dal punto di vista gestionale, il risultato indica che una contrazione apparentemente moderata della domanda può consumare una parte consistente del margine finanziario disponibile.

La probabilità di default rimane comunque bassa nel modello, e questo è altrettanto importante da osservare: non ogni peggioramento operativo determina automaticamente un problema di solvibilità.

Una contrazione della domanda del 20%

A questo punto possiamo aumentare ulteriormente la pressione sulla domanda.

domanda_meno20 = domanda_base * 0.80

risultati.append(
    analizza_scenario(
        domanda_meno20,
        costo_variabile,
        "Domanda -20%"
    )
)

df_rischio = pd.DataFrame(risultati)

df_rischio

Il risultato simulato è circa:

Scenario                         Domanda -20%
Probabilità default             20,274%
Default prima del BEP            2,536%
5° percentile minimo cash      -7.772,27 €
Cassa finale mediana             19.368,79 €
Cassa finale negativa             8,028%

Qui il comportamento del modello cambia in modo molto più evidente.

La probabilità di attraversare almeno una volta una situazione di cassa negativa supera il 20%, mentre il 5° percentile del minimo cash diventa negativo.

Questo significa che esiste una porzione consistente delle traiettorie nelle quali la liquidità disponibile non è sufficiente ad assorbire la contrazione della domanda.

La cassa finale mediana rimane però positiva, pari a circa 19.369 euro. Questa informazione potrebbe sembrare rassicurante se si guardasse soltanto alla situazione al mese 24.

Ed è proprio qui che emerge il valore della simulazione temporale.

Un’impresa può arrivare al ventiquattresimo mese con una cassa positiva e avere comunque attraversato un periodo di insolvenza nel quarto, quinto o sesto mese.

La sola cassa finale non è quindi sufficiente per valutare il rischio.

Uno shock sui costi variabili

La domanda non è l’unica fonte di rischio. Anche un aumento del costo variabile riduce direttamente il margine di contribuzione.

Supponiamo che il costo variabile passi da 12 a 15 euro per unità, con un incremento del 25%.

risultati.append(
    analizza_scenario(
        domanda_base,
        costo_variabile * 1.25,
        "Costi variabili +25%"
    )
)

df_rischio = pd.DataFrame(risultati)

df_rischio

Il risultato è indicativamente:

Scenario                         Costi variabili +25%
Probabilità default              5,220%
Default prima del BEP            0,821%
5° percentile minimo cash         -149,76 €
Cassa finale mediana             33.759,15 €
Cassa finale negativa             0,862%

L’aumento del costo variabile ha un effetto diverso rispetto alla semplice contrazione della domanda.

Il punto vendita continua a ricevere una domanda media di circa 1.000 unità, ma ogni vendita contribuisce meno alla copertura dei costi fissi.

Il rischio di default passa quindi da una frequenza quasi nulla nello scenario base a circa il 5,2%.

Il dato più interessante è il 5° percentile del minimo cash, che diventa leggermente negativo. In una parte delle simulazioni, quindi, la liquidità attraversa la soglia critica anche se la domanda non è stata ridotta.

Per il management questo significa che il monitoraggio della domanda non è sufficiente. Se il margine unitario si deteriora, una rete può entrare in una situazione di tensione anche mantenendo volumi di vendita apparentemente soddisfacenti.

Quando domanda e costi peggiorano contemporaneamente

Il vero stress test nasce quando più variabili si muovono nella stessa direzione.

Consideriamo ora uno scenario nel quale la domanda diminuisce del 20% e contemporaneamente il costo variabile aumenta del 25%.

domanda_stress = domanda_base * 0.80
costo_stress = costo_variabile * 1.25

risultati.append(
    analizza_scenario(
        domanda_stress,
        costo_stress,
        "Shock combinato"
    )
)

df_rischio = pd.DataFrame(risultati)

df_rischio

Il risultato è estremamente più severo:

Scenario                         Shock combinato
Probabilità default             99,962%
Default prima del BEP           42,253%
5° percentile minimo cash      -57.266,66 €
Cassa finale mediana           -38.192,68 €
Cassa finale negativa           99,887%

In questo scenario quasi tutte le traiettorie attraversano la soglia di liquidità negativa.

Il risultato non deve essere interpretato come una previsione secondo la quale il franchising avrebbe il 99,962% di probabilità di fallire nella realtà. È invece la conseguenza delle ipotesi inserite nello stress test: domanda ridotta del 20%, costo variabile aumentato del 25%, cassa iniziale di 10.000 euro e struttura dei costi mantenuta invariata.

Dal punto di vista applicativo, il valore dell’esercizio consiste proprio nel mostrare quanto rapidamente possa deteriorarsi la posizione finanziaria quando due driver economici si muovono contemporaneamente.

Il modello permette inoltre di distinguere il problema commerciale da quello finanziario. Se la domanda diminuisce ma la struttura dei costi riesce ad adattarsi, il risultato può essere molto diverso da quello ottenuto mantenendo costi fissi e costi variabili invariati.

Forse potrebbe interessarti anche:  Il Mistero dello 0.5: Alla Scoperta della Correzione di Continuità

Lo stress più interessante: la crisi concentrata nei primi sei mesi

Finora abbiamo modificato la severità dello shock, ma non il momento in cui si verifica.

Questo passaggio è fondamentale perché la liquidità presenta una vera dipendenza dal percorso: un’impresa può recuperare economicamente nei mesi successivi, ma non può recuperare una liquidità che ha già attraversato una soglia di insolvenza senza un finanziamento aggiuntivo.

Creiamo quindi uno scenario nel quale i primi sei mesi sono particolarmente difficili:

  • domanda ridotta del 25%;
  • costo variabile aumentato del 20%;
  • dal settimo mese in poi si ritorna allo scenario base.
domanda_primi6 = domanda_base.copy()

domanda_primi6[:, :6] *= 0.75

costo_primi6 = np.full(
    months,
    float(costo_variabile)
)

costo_primi6[:6] *= 1.20

risultato_primi6 = analizza_scenario(
    domanda_primi6,
    costo_primi6,
    "Stress primi 6 mesi"
)

risultati.append(risultato_primi6)

df_rischio = pd.DataFrame(risultati)

df_rischio

Il risultato simulato è circa:

Scenario                         Stress primi 6 mesi
Probabilità default             78,611%
Default prima del BEP           50,580%
5° percentile minimo cash      -13.158,62 €
Cassa finale mediana             67.926,62 €
Cassa finale negativa             0,000%

Questo è probabilmente il risultato più istruttivo dell’intero esempio.

La cassa finale mediana è positiva e raggiunge circa 67.927 euro, mentre la probabilità di default durante il percorso arriva a circa il 78,6%.

Come è possibile?

Perché lo shock viene concentrato nei primi sei mesi. L’attività dispone di soli 10.000 euro di liquidità iniziale e deve quindi finanziare una fase nella quale la domanda è bassa e il margine unitario è ridotto.

Successivamente la situazione torna allo scenario base e il punto vendita può ricostituire liquidità. Tuttavia, nelle simulazioni nelle quali la cassa è diventata negativa durante i primi mesi, il default è già avvenuto.

Questo risultato mostra in modo molto concreto perché la cassa finale non può essere utilizzata come unica misura del rischio.

Un business può quindi avere un valore finale positivo e, nello stesso tempo, presentare un rischio di liquidità molto elevato durante la fase di avvio.

La matrice di stress: domanda e costi cambiano insieme

Per evitare di scegliere arbitrariamente un singolo scenario, possiamo costruire una matrice nella quale la domanda viene ridotta progressivamente e il costo variabile aumenta contemporaneamente.

shock_domanda = [
    0.00,
    -0.10,
    -0.20,
    -0.30
]

shock_costi = [
    0.00,
    0.10,
    0.20,
    0.30
]

stress_matrix = []

for sd in shock_domanda:

    for sc in shock_costi:

        domanda_s = domanda_base * (1 + sd)

        costo_s = costo_variabile * (1 + sc)

        risultato = analizza_scenario(
            domanda_s,
            costo_s,
            f"Domanda {sd:+.0%} / "
            f"Costi {sc:+.0%}"
        )

        stress_matrix.append(
            risultato
        )

df_stress = pd.DataFrame(
    stress_matrix
)

df_stress[
    [
        "Scenario",
        "Probabilità default",
        "Default prima del BEP",
        "5° percentile minimo cash",
        "Cassa finale mediana"
    ]
]

L’output produce una griglia di scenari nella quale è possibile osservare come cambia il rischio al variare simultaneo delle due condizioni.

Un esempio di lettura può essere:

matrice di stress


Questa matrice ha un’utilità diversa rispetto allo scenario combinato analizzato in precedenza.

Non serve soltanto a mostrare un caso estremo, ma permette di individuare la zona nella quale il rischio comincia a cambiare rapidamente.

Per esempio, un responsabile finanziario potrebbe utilizzare la matrice per stabilire una soglia operativa: se la domanda osservata si avvicina a una riduzione del 20% e contemporaneamente il costo variabile cresce oltre il 10%, potrebbe essere necessario rivedere il capitale circolante, i prezzi o la struttura dei costi.

In questo senso lo stress test non è soltanto una previsione pessimistica, ma diventa uno strumento per costruire soglie di attenzione.

Qual è il mese più vulnerabile?

La probabilità di default dice quante traiettorie attraversano la soglia critica, ma non indica quando questo avviene.

Possiamo quindi calcolare il primo mese nel quale la liquidità diventa negativa.

def mese_medio_default(
    domanda,
    costo_variabile_mensile
):

    _, cash_balance = calcola_cash_flow(
        domanda,
        costo_variabile_mensile
    )

    default_mask = cash_balance < 0

    ha_default = default_mask.any(axis=1)

    tempo_default = np.full(
        len(ha_default),
        np.nan
    )

    tempo_default[ha_default] = (
        np.argmax(
            default_mask[ha_default],
            axis=1
        ) + 1
    )

    return np.nanmedian(
        tempo_default
    )

Possiamo applicare la funzione allo scenario di stress dei primi sei mesi:

mese_mediano = mese_medio_default(
    domanda_primi6,
    costo_primi6
)

print(
    "Mese mediano del primo default:",
    mese_mediano
)
Mese mediano del primo default: 4.0

Se il risultato si concentra nei primi mesi, l’interpretazione gestionale è molto diversa da quella di un default che compare verso la fine dell’orizzonte.

Un rischio concentrato all’inizio suggerisce infatti che il problema principale possa essere il fabbisogno finanziario di avvio, mentre un rischio che emerge progressivamente può indicare una struttura economica che non riesce a sostenere il modello operativo nel medio periodo.

La distinzione non permette da sola di individuare la causa reale, ma indica quale parte del modello economico-finanziario merita una verifica più approfondita.

Quanto deve essere grande il cuscinetto di liquidità?

Una delle applicazioni più utili della simulazione consiste nel ribaltare la domanda.

Invece di chiedersi quale sia il rischio associato a una determinata cassa iniziale, possiamo chiederci:

quale liquidità iniziale serve per mantenere il rischio di default al di sotto di una soglia prestabilita?

Per esempio, possiamo ripetere lo scenario di stress dei primi sei mesi modificando la cassa iniziale.

def probabilita_default_con_cassa(
    cassa,
    domanda,
    costo_variabile_mensile
):

    cash_flow, _ = calcola_cash_flow(
        domanda,
        costo_variabile_mensile
    )

    cash_balance = (
        cassa
        + np.cumsum(
            cash_flow,
            axis=1
        )
    )

    return (
        cash_balance < 0
    ).any(axis=1).mean()


casse_test = [
    10_000,
    20_000,
    30_000,
    40_000,
    50_000,
    60_000
]

risultati_cassa = []

for cassa in casse_test:

    prob = probabilita_default_con_cassa(
        cassa,
        domanda_primi6,
        costo_primi6
    )

    risultati_cassa.append({
        "Cassa iniziale": cassa,
        "Probabilità default": prob
    })

df_cassa = pd.DataFrame(
    risultati_cassa
)

df_cassa

L’output permette di costruire una relazione diretta tra capitale iniziale e rischio.

Un risultato del tipo:

permette di affrontare una domanda molto più concreta rispetto al semplice Break-Even Point.

Il management non deve necessariamente chiedersi soltanto se il progetto sia redditizio, ma può valutare quale dotazione di liquidità sia coerente con il livello di rischio che è disposto ad accettare.

Naturalmente la soglia di rischio non è una proprietà matematica universale: deve essere definita dall’azienda sulla base della propria struttura finanziaria, degli obblighi contrattuali, dell’accesso al credito e della capacità di ottenere liquidità aggiuntiva.

Confrontare gli scenari in un’unica tabella

A questo punto possiamo riunire tutti gli scenari analizzati.

df_rischio = pd.DataFrame(risultati)

df_rischio[
    [
        "Scenario",
        "Probabilità default",
        "Default prima del BEP",
        "5° percentile minimo cash",
        "Cassa finale mediana",
        "Cassa finale negativa"
    ]
]

La tabella finale consente di leggere contemporaneamente quattro dimensioni diverse del rischio.

La probabilità di default risponde alla domanda “quanto spesso la liquidità diventa negativa?”.

Il default prima del BEP risponde a una domanda più specifica: “quanto spesso l’impresa entra in crisi prima di aver raggiunto il proprio equilibrio operativo?”.

Il 5° percentile del minimo cash indica quanto può essere profonda la tensione finanziaria in una fascia sfavorevole ma non estrema della distribuzione.

La cassa finale mediana, infine, descrive la situazione al termine dei 24 mesi senza utilizzare la media, che potrebbe essere influenzata dagli scenari particolarmente favorevoli.

Forse potrebbe interessarti anche:  Regressione Quadratica con Python: Guida Pratica per Analizzare Andamenti Curvilinei

Queste metriche non sono intercambiabili. Una delle lezioni principali dell’esempio è proprio che una singola misura non è sufficiente per descrivere il rischio di liquidità.

Perché il percorso conta più del risultato finale

Il caso dello stress nei primi sei mesi merita di essere ripreso perché mostra una proprietà fondamentale dei problemi finanziari caratterizzati da vincoli di liquidità.

Supponiamo che un punto vendita perda liquidità nei primi mesi, ma successivamente recuperi domanda e margini.

Se si osservasse soltanto il saldo al ventiquattresimo mese, si potrebbe concludere che l’attività abbia attraversato una difficoltà temporanea ma sia riuscita a recuperare.

Se però il saldo è diventato negativo al quarto mese, l’impresa avrebbe avuto bisogno di una fonte di finanziamento proprio in quel momento.

Questo significa che due traiettorie possono avere una cassa finale simile e, contemporaneamente, presentare rischi finanziari completamente diversi.

La simulazione Monte Carlo permette di conservare l’intera traiettoria mensile e non soltanto il valore finale. È questa caratteristica a rendere particolarmente utile l’approccio quando l’evento di interesse dipende dal percorso seguito dal sistema.

Cosa ci dice questo modello

Il modello non dimostra che un determinato franchising sia finanziariamente sostenibile o insostenibile, perché non dispone dei dati reali di una specifica rete e utilizza distribuzioni e parametri costruiti a fini didattici.

Il suo obiettivo è diverso: mostrare come trasformare una previsione puntuale in una struttura quantitativa nella quale domanda, costi e liquidità vengono simulati lungo un orizzonte temporale.

Lo scenario base mostra che una struttura con domanda media di 1.000 unità, prezzo di 30 euro, costo variabile di 12 euro, costi fissi di 14.000 euro e liquidità iniziale di 10.000 euro presenta un rischio simulato molto contenuto.

Una riduzione del 10% della domanda erode parte del margine di sicurezza, mentre una riduzione del 20% porta il rischio di default a livelli molto più elevati.

L’aumento del 25% dei costi variabili produce un effetto analogo, anche senza modificare la domanda.

Lo shock combinato mostra invece quanto rapidamente la situazione possa deteriorarsi quando domanda e margini si muovono contemporaneamente nella direzione sfavorevole.

Lo stress concentrato nei primi sei mesi introduce infine la lezione più importante: un’impresa può presentare una cassa finale positiva e avere comunque attraversato un rischio di default molto elevato durante il percorso.

Limiti del modello

Una simulazione Monte Carlo non diventa automaticamente affidabile perché vengono generate 100.000 o un milione di traiettorie. Il numero di simulazioni riduce l’errore di simulazione, ma non corregge un modello economico costruito su ipotesi poco realistiche.

Il primo limite riguarda la distribuzione della domanda. In questo esempio viene utilizzata una log-normale con osservazioni indipendenti, mentre una rete commerciale reale può presentare stagionalità, trend, autocorrelazione e periodi nei quali domanda e costi reagiscono agli stessi fattori economici.

Il secondo limite riguarda la relazione tra variabili. Domanda e costi non sono necessariamente indipendenti. Un periodo inflazionistico, per esempio, potrebbe aumentare alcuni costi proprio mentre riduce la capacità di spesa dei clienti.

Il terzo limite riguarda il cash flow. Il modello utilizza una struttura volutamente semplificata nella quale ricavi e costi diventano direttamente flussi di cassa. In un modello professionale sarebbe necessario introdurre almeno tempi di incasso, tempi di pagamento, capitale circolante, IVA, imposte, royalty, investimenti iniziali, ammortamenti quando rilevanti per il modello finanziario, debito e relativi interessi.

Un quarto limite riguarda la reazione del management. Se la liquidità diminuisce, l’impresa può aumentare i prezzi, ridurre i costi, negoziare con i fornitori, ottenere un finanziamento oppure modificare le attività commerciali. Un modello statico non può assumere automaticamente che queste reazioni avvengano.

Infine, gli shock utilizzati nell’esempio sono ipotesi didattiche. In un’analisi reale dovrebbero essere costruiti utilizzando dati storici, informazioni di settore, dati aziendali e scenari economici plausibili. Lo stress testing è infatti complementare alla simulazione: gli scenari avversi servono a verificare la resilienza del sistema anche in condizioni severe, mentre la simulazione permette di rappresentare una distribuzione più ampia degli esiti possibili.

Dalla simulazione alla decisione

Il valore di questo esercizio non sta nel sostituire il Break-Even Point con un modello più complesso, ma nel mettere i due strumenti nella corretta relazione.

Il Break-Even Point indica una soglia economica.

La simulazione Monte Carlo mostra come l’incertezza della domanda possa trasformarsi in una distribuzione di flussi finanziari.

Lo stress test verifica cosa accade quando alcune condizioni peggiorano contemporaneamente.

L’analisi della traiettoria permette di capire quando la liquidità raggiunge il punto di maggiore vulnerabilità.

La simulazione della cassa iniziale permette infine di trasformare il rischio in una domanda decisionale: quale capitale di partenza è necessario per mantenere il rischio entro una determinata soglia?

Per un franchisee, questa informazione può essere più utile del semplice calcolo delle vendite necessarie per raggiungere il pareggio. Per chi finanzia l’apertura, può diventare uno strumento per valutare il fabbisogno di capitale. Per la direzione della rete, può servire a confrontare diversi profili di rischio tra punti vendita e individuare le condizioni nelle quali un nuovo affiliato potrebbe trovarsi in difficoltà.

Il passaggio importante è quindi quello da una domanda come “quante unità devo vendere?” a una domanda più completa:

“Qual è la probabilità che la liquidità rimanga sufficiente lungo il percorso e quali condizioni possono portare il punto vendita sotto la soglia di sicurezza?”

È in questo passaggio che il Break-Even Point smette di essere un numero isolato e diventa una componente di un’analisi quantitativa più ampia del rischio finanziario.

📚 Simulazione Monte Carlo, rischio e decisioni quantitative

Quando costi, domanda, vendite o disponibilità delle risorse sono incerti, una singola stima può non essere sufficiente. Questi articoli mostrano come utilizzare la simulazione Monte Carlo e altri strumenti quantitativi per analizzare il rischio e supportare decisioni in contesti diversi:

👉 Metodo Monte Carlo: cos’è, come funziona e applicazioni pratiche con Python

👉 Break-Even Point nel franchising: formule, margine di contribuzione ed esercizi

👉 Break-Even Point nel franchising: calcolo avanzato, automazione e royalty con Python

👉 Ottimizzazione del budget marketing con la simulazione Monte Carlo

👉 Monte Carlo nella supply chain: prevedere il rischio di rottura di stock e ottimizzare l’inventario

Pubblicità