|
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.
|