Meta-simulateur

Bienvenue, vous n'êtes pas connecté. ( Se connecter - S'enregistrer )

Meta-simulateur > Meta-simulateur > Utilisation > Programmer: étude de cas location suivie d'achat

RSS >  Programmer: étude de cas location suivie d'achat, analyse "en faisceaux"
slash33 #1 04/07/2008 - 23h16

Groupe : Administrateur
Messages : 82
Enregistré le : 11/04/2008

Hors ligne

Cet article décrit comment réaliser une fonction de simulation par programmation avec l'API du simulateur. Il est principalement destiné aux programmeurs Java. Le non développeur pourra néanmoins être intéressé par les résultats des simulations figurant en fin de page.

Objet

Simulation complexe où à partir d'une hypothèse d'évolution de prix et de loyer, on veut étudier les coûts et bénéfices engagés en cas de location suivie d'une accession si l'accession se fait au bout de 1 an, 2 ans, 3 ans, etc jusqu'à 10 ans.
Ici on fait usage d'un nombre assez importants de comportements en même temps.

Code source

/**
*
*/
package org.bulleimmobiliere.metasimu.demos;

import java.util.Calendar;
import java.util.Hashtable;
import java.util.Map;

import org.bulleimmobiliere.metasimu.immo.Calendaire;
import org.bulleimmobiliere.metasimu.immo.Date;
import org.bulleimmobiliere.metasimu.immo.Epargne;
import org.bulleimmobiliere.metasimu.immo.Patrimoine;
import org.bulleimmobiliere.metasimu.immo.metier.AideCalculEmprunt;
import org.bulleimmobiliere.metasimu.simulateur.AObjet;
import org.bulleimmobiliere.metasimu.simulateur.AccesInterdit;
import org.bulleimmobiliere.metasimu.simulateur.AccesObjetSansEtat;
import org.bulleimmobiliere.metasimu.simulateur.Descripteur;
import org.bulleimmobiliere.metasimu.simulateur.ErreurSimulateur;
import org.bulleimmobiliere.metasimu.simulateur.IAccesObjet;
import org.bulleimmobiliere.metasimu.simulateur.IObjet;
import org.bulleimmobiliere.metasimu.simulateur.LigneDeTemps;
import org.bulleimmobiliere.metasimu.simulateur.UniteSimu;
import org.bulleimmobiliere.metasimu.simulateur.param.IParametre;
import org.bulleimmobiliere.metasimu.simulateur.param.Parametre;
import org.bulleimmobiliere.metasimu.simulateur.param.Revision;
import org.bulleimmobiliere.metasimu.simulateur.param.Variable;

/**
* Benchmark commandé par Calvin sur www.bulle-immobiliere.org/forum
*
* Conditions du bench: - le prix d'achat net vendeur : 100 000€ - le montant de
* l'apport : 15 000€ - 8% de FN et 4.5% de taux, assurances incluses - pas de
* pénalités (taux à 0%) - pas de frais d'agence. - indice immobilier:
* 2004(0)=1, 2005(1)=1.12, 2006(2)=1.21, 2007(3)=1.24, 2008(4)=1.24, 2009=1.21,
* 2010=1.12, 2011=1.05, 2012=1.0, 2013=0.95, 2014=0.91 - durée de la simulation :
* 10 ans (120 mois) - location: année 2004=750€ mensuel (CC) puis +2%/an -
* rendement de l'épargne: 3% - revenu non précisé mais qui augmente de 3% l'an.
* Calculer pour mensualité 2004 = 33% revenu 2004. -> Tester toutes les
* combinaisons location puis achat en 2004, 2005, etc. (10 simulations à
* traiter) => à priori, il s'agit de calculer la différence coût logement /
* plue value à l'achat
*
* @author slash33
*/
public class BenchCalvin {

   /**
    * @param args
    */
   public static void main(String[] args) {

       UniteSimu lSimu;

       // l'indice de prix de l'énoncé sous sa forme fractionnée
       double[] indicePrix = new double[] { 1, 1.12, 1.21, 1.24, 1.24, 1.21,
               1.12, 1.05, 1, 0.95, 0.91 };

       // construit la règle de révision correspondante
       String lIndiceExp = "";
       for (int i = 1; i < indicePrix.length; i++) {
           if (i>1) lIndiceExp += ";";
           lIndiceExp += "=" + indicePrix[i] + ":" + (i * 12 + 1);
       }

       double apport = 15000;
       double rendementEpargne = .03;
       double lValeurAppart = 100000;
       // NB: la valeur de l'appartement au moment de l'acquisition
       // varie selon l'indice de prix.
       
       try {

           // on traite chacun des 10 cas de location/accession
           for (int lAnneeAchat = 0; lAnneeAchat < indicePrix.length; lAnneeAchat++) {
               lSimu = new UniteSimu(new Calendaire(new Date(Calendar.JANUARY, 2004)));

               // cette variable utilisateur est l'indice de prix de l'énoncé en valeur
               // absolue.
               Parametre lIndice = lSimu.reg.creerParamLocal("indice_prix");
               lSimu.reg.affecterCalcul(null, "indice_prix", indicePrix[0], new Revision(lIndiceExp.split(";")));
               lIndice.setLabel(new Descripteur("Indice immo.", ""));
               
               int lMoisAchat = 12 * lAnneeAchat + UniteSimu.NUMERO_PREMIER_PAS;
               
               // construire la situation de location
               SituationLocataire locataire = new SituationLocataire();
               locataire.instancier(lSimu, 750., .02);

               final Epargne lEpargne = new Epargne();
               Map<String, Object> lArgs = new Hashtable<String, Object>();
               lArgs.put(Epargne.TAUX_INTERETS, rendementEpargne);
               lArgs.put(Epargne.SOLDE, apport);
               lEpargne.faire(Epargne.INITIALISER, lArgs, lSimu);
               Parametre lParam = (Parametre)lSimu.reg.trouverParametre(lEpargne, Epargne.SOLDE);
               lParam.setLabel(new Descripteur("Apport placé", ""));

               LigneDeTemps lLigneTps = new LigneDeTemps();
               lSimu.placerEnFin(lLigneTps);

               lLigneTps.animer(lEpargne, 0);
//                lLigneTps.finAnimation(lEpargne, lMoisAchat);
               
               // programmer le transfert de l'épargne en apport
               IObjet lRazEpargne = new AObjet() {
                   
                   @Override
                   public IAccesObjet accesseur(Object pCandidat)
                           throws AccesInterdit {
                       return AccesObjetSansEtat.global;
                   }

                   @Override
                   public void faire(String pQuoi, Map<String, Object> pArgs,
                           UniteSimu pSimu) throws ErreurSimulateur {
                   }

                   @Override
                   public void finaliserPas(UniteSimu pSimu) {
                   }

                   @Override
                   public void simuler(UniteSimu pSimu)
                           throws ErreurSimulateur {
                       Map<String, Object> lParams = new Hashtable<String, Object>();
                       lEpargne.faire(Epargne.RETOURNER_SOLDE, lParams, pSimu);
                       lParams.put(Epargne.CREDIT, -(Double)lParams.get(Epargne.SOLDE));
                       lEpargne.faire(Epargne.CREDITER, lParams, pSimu);
                   }

                   @Override
                   public Variable[] entrees() {
                       return new Variable[]{};
                   }

                   @Override
                   public String irs() {
                       return "temp.razEpargne";
                   }

                   @Override
                   public IParametre[] sorties() {
                       return new IParametre[]{};
                   }
               };

               lLigneTps.animer(lRazEpargne, lMoisAchat);
               lLigneTps.finAnimation(lRazEpargne, lMoisAchat);
               
               // construire la situation de l'accession
               SituationAccedant accession = new SituationAccedant();
               
               // calcul de l'emprunt nécessaire pour un apport supposé
               // constant quelque soit l'année d'acquisition à 15k€
               AideCalculEmprunt aideCalcul = new AideCalculEmprunt();
               aideCalcul.indiquerApport(apport * Math.pow(1+rendementEpargne, lAnneeAchat));
               aideCalcul.indiquerFraisNotaire(.08);
               aideCalcul.indiquerCommissionAgence(.0);
               accession.creer(lSimu, aideCalcul
                       .estimerCoutEmprunt(lValeurAppart * indicePrix[lAnneeAchat]), 0.045, 20, 0., 0.);

               // création de l'appartement
               Patrimoine lAppart = new Patrimoine();
               lArgs.clear();
               lArgs.put(Patrimoine.PRIX, lValeurAppart);
               lArgs.put(Patrimoine.ACQUIS_LE, lMoisAchat);
               lArgs.put(Patrimoine.INDICE_PRIX, lIndice);
               lAppart.faire(Patrimoine.INITIALISER, lArgs, lSimu);
               
               lLigneTps.animer(lAppart, lMoisAchat);

               // programmer la location au début et l'arrêter avant
               // l'accession
               lLigneTps.animer(locataire, 0);
               lLigneTps.finAnimation(locataire, lMoisAchat-1);

               // positionner l'accession après la location
               lLigneTps.animer(accession, lMoisAchat);

               // simuler sur 11 ans
               lSimu.simulerNbPas(12 * indicePrix.length);

               // exporter les résultats de cette simulation en CSV
               lSimu.reg.exporter("calvin" + (2004 + lAnneeAchat) + ".csv", ";", lSimu);
           }
       } catch (ErreurSimulateur eSimu) {
           eSimu.printStackTrace();
       }
   }
}


Résultats de simulation

Les résultats de la simulation sont accessibles dans ce fichier excel mis en forme avec les fichiers produits par le simulateur.
http://www.simulateur.info/public_files/calvin.xls

Pas de capture sur ce cas. Voyez le fichier.
Gal #2 05/07/2008 - 04h00

Ce message a été posté par un invité.

Le lien est cassé, ça empêche de lire le csv :) Dommage c'était à mon avis l'application phare pour beaucoup de beta-testeurs.
slash33 #3 05/07/2008 - 09h13

Groupe : Administrateur
Messages : 82
Enregistré le : 11/04/2008

Hors ligne

Corrigé. C'est un XLS pas un CSV. Il y a un travail de mise en forme des 10 fichiers et de synthèse sur ce cas (voir en première feuille)

Dans cette version, j'avais donné des noms symboliques aux variables. J'espère que la lecture sera plus aisée. :huh:
Wentworth #4 30/05/2009 - 15h09

Ce message a été posté par un invité.

C'est exactement ce que je recherchais, merci!

Simulation pret
kittykat #5 22/07/2009 - 17h37

Ce message a été posté par un invité.

bonjour! ce qui avait été très utile post! merci!  :lol:

[right]rachat credit immobilier[/right]

 >  Réponse rapide

Composez votre message

Meta-simulateur > Meta-simulateur > Utilisation > Programmer: étude de cas location suivie d'achat