Le but de ce projet est de réaliser un logiciel de gestion de patrimoine, sous le logiciel scientifique
Scilab, et de le mettre en libre accès sur Internet. L’intérêt de cette démarche réside dans la
possibilté de modifier le code Scilab si besoin. Celui-ci consiste en quelques fonctions type, qui
pourront être ensuite exploitées et modifiées selon les placements à modéliser, et sera disponible
sur la page Internet.
Les différents types de placements ici traités sont principalement :
le livret A;
l’assurance-vie (monosupport en euros);
la bourse, le CAC40 étant pris comme référence.
Ces divers placements diffèrent essentiellement par le système de capitalisation des intérêts.
Dans tous les cas, le calcul des intérêts s’effectue au mois, mais ils sont capitalisés soit en fin
d’année, soit à la fin du mois. Ainsi, nous avons distingué, dans la structure même de ce projet,
ces deux systèmes de capitalisation des intérêts.
2 Placements à capitalisation annuelle
Dans un placement financier à capitalisation annuelle, les intérêts sont bien calculés chaque mois,
mais ne sont capitalisés qu’en fin d’année, de sorte qu’il n’y a pas d’intérêts sur les intérêts. On
peut en revanche ajouter régulièrement de l’argent, ce qui a été pris en compte dans le
programme associé à ce placement. Nous examinerons ensuite les cas du livret A et de
l’assurance-vie.
2.1 Programme Scilab
Dans cette partie, on donne en Code Scilab 1 un programme définissant une fonction de nom
annuel qui prend en arguments :
un vecteur contenant les taux du placement par mois ;
le montant du capital initial ;
le montant d’un éventuel apport régulier d’argent ;
les dates de dépôt et de retrait ;
et qui renvoie le capital final ainsi que les intérêts agrégés.
Cette fonction sera utilisée pour simuler des placements sur le livret A ainsi que sur
l’assurance-vie.
Code Scilab1.
//
function [capital,total_interets]=annuel(...
tableau_taux,capital_initial,tableau_mensualites,...
mois_debut,annee_debut,mois_fin,annee_fin)
// CAPITALISATION À LA FIN DE CHAQUE ANNÉE
//error('Attention : mettre 4.5 pour un taux de 4,5 pourcent')
//disp('Attention : mettre 4.5 pour un taux de 4,5 pourcent')
capital=capital_initial;
// vecteur des capitaux mois par mois
total_interets=0;
//interets cumules sur la duree du placement
theta=tableau_taux/100/12;
//taux mensuels avec 0 <= teta <= 1
// ------------------------------------------------------------
// Première année
// ------------------------------------------------------------
interets=0; // interets cumulés sur l'année
if annee_fin>annee_debut
nb_mois_d=12-mois_debut;
// placement sur plus d'une année
else nb_mois_d=mois_fin-mois_debut;
// placement au sein d'une même année
end
for j=1:nb_mois_d
capital=[capital,capital($)+tableau_mensualites(j)];
interets=interets+theta(j)*capital($);
end
// un montant placé le mois j est considéré comme rapportant
// à partir du mois j+1
// par exemple, un placement en décembre (mois_debut=12)
// rapporte à partir de janvier de l'année suivante
// ------------------------------------------------------------
// années intermédiaires
// ------------------------------------------------------------
if annee_fin>annee_debut+1
nb_annees=annee_fin-annee_debut-1;
else nb_annees=0;
end
for i=1:nb_annees
interets=0; // variable locale remise à zero à chaque début d'année
for j=1:12
ind_mois=(i-1)*12+j+12-mois_debut ; // indice du mois en cours
capital=[capital,capital($) + tableau_mensualites(ind_mois)];
interets=interets+theta(ind_mois)*capital($);
end
capital($)=capital($)+interets;
total_interets=total_interets+interets;
end
// ------------------------------------------------------------
// dernière année
// ------------------------------------------------------------
if annee_fin>annee_debut
// nb_mois_f=mois_fin-1; //placement sur plus d'une année
nb_mois_f=mois_fin ;
// else nb_mois_f=0;
else nb_mois_f=0;
end
interets=0;
for j=1:nb_mois_f
ind_mois=nb_mois_d+nb_annees*12+j ; // indice du mois en cours
capital=[capital,capital($) + tableau_mensualites(ind_mois)];
interets=interets+theta(ind_mois)*capital($);
end
Il s’agit ici de modéliser l’évolution d’un capital placé sur livret A, qu’on alimente tous les mois.
On utilise dans ce but la fonction annuel définie plus haut. En effet, les intérêts ne sont
capitalisés, dans le cas du livret A, qu’à la fin de chaque année. Toutefois, en toute rigueur, sur le
livret A les intérêts sont calculés par quinzaines, et le livret A est plafonné : le code
correspondant est donné en Annexe A.
Exemple
Un exemple d’application au livret A avec les données du Tableau 2.2 est donné en
Code Scilab 2. On y traite simultanément le cas de taux stationnaire et de taux instationnaires.
Les résultats sont présentés en Figure 2.2.
Code Scilab2.
//
getf('annuel.sci');
// -----------------------------------------------------------
// Données communes
// -----------------------------------------------------------
xtitle('Livret A : Capital initial de' +...
string(capital_initial) +' euros'+' et placements reguliers de '+...
string(tableau_mensualite(1)) +' euros', 'Mois' ,'Capital');
legends(['Livret A '+string(taux_A)+'%'],[1],'ul');
//
Figure 1: Placement mensuel sur le livret A. Évolution du capital sur 10 ans.
Taux
date d’entrée
date de sortie
mensualité
capital initial
2,75%
05/1987
04/2007
100
class="td11"> 1 000
Table 1: Données pour simulation de placement régulier sur le livret A
2.3 Assurance-vie
Caractéristiques
Nous allons maintenant procéder de la même manière pour un placement avec ajout mensuel, mais
sur une assurance-vie. Nous avons choisi de modéliser un contrat monosupport en euros qui est le
type de base de l’assurance-vie. Il existe également des contrats multisupports qui permettent de
placer une partie du capital en bourse ou dans l’immobilier.
Le contrat monosupport en euros est un placement sans risque. Les versements sont soumis à
des frais d’entrée. Les intérêts sont calculés mensuellement et capitalisés en fin d’année. Ces
mêmes intérêts sont soumis aux prélèvements sociaux (11%). Au moment du retrait du capital, les
intérêts sont soumis à l’impôt sur le revenu ou à un prélèvement libératoire forfaitaire de
7,5%. La somme à payer peut ensuite être déduite de l’impôt sur le revenu dans la
limite de 4 600
class="umvs-x-x-120">
également des frais de gestion mais qui sont généralement déjà compris dans le taux
annoncé.
Attention : pour bénéficier des avantages de l’assurance-vie décrits plus haut, il faut placer son
argent pendant huit ans minimum. En effet, un retrait précoce entraine des frais de sortie très
importants.
La fonction assurance_vie qui simule un placement en assurance-vie à partir de la fonction
annuel est donnée en Code Scilab 3. La fonction ainsi définie prend en arguments :
un tableau contenant l’ensemble des taux mensuels (constants ici) appliqués tout au
long de la période ;
le pourcentage prélevé par la banque à chaque versement ;
le montant du capital initial ;
le montant d’éventuels rajouts mensuels;
les dates d’entrée et de sortie ;
et renvoie la suite mensuelle des capitaux ainsi que le montant des intérêts agrégés.
Code Scilab3.
//
//assurance-vie:contrat monosupport en euros
function [capital,total_interets]=assurance_vie(tableau_taux,...
frais,capital_initial,tableau_rajouts,m1,a1,m2,a2)
//frais: pourcentage prélevé par la banque sur chaque versement
CS=0.89; //coefficient charges sociales
legends(['Assurance-vie '+string(taux)+'%, frais '+string(frais)+...
'% en entree'],[1},'ul');
//
Figure 2: Assurance-vie : évolution du capital sur 10 ans
Taux
frais
date d’entrée
date de sortie
mensualité
capital initial
4,5%
3 %
05/2007
10/2017
100
class="td11"> 1 000
Table 2: Données pour simulation de placement régulier sur l’assurance-vie
2.4 Comparaison du livret A et de l’assurance-vie
On dispose d’un bref historique des taux du livret A, donné en Tableau 2.4.
Date
Taux
16 mai 1986
4,50 %
1er mars 1996
3,50 %
16 juin 1998
3,00 %
1er aout 1999
2,25 %
1er août 2005
2,00 %
1er août 2006
2,75 %
Table 3: Historique des taux du livret A
On peut donc comparer l’évolution d’un même capital pendant toute cette période, sur le
livret A ou sur l’assurance-vie, en utilisant par exemple le Code Scilab 5
Code Scilab5.
//
//getf('annuel.sci');
// ------------------------------------------------------------
// Données communes
// ------------------------------------------------------------
xtitle('Capital initial de' +...
string(capital_initial) +' euros'+' et placements reguliers de '+...
string(tableau_mensualites(1)) +' euros', 'Mois' ,'Capital');
legends(['Livret A (historique)' ; ...
'Assurance-vie '+string(taux_av)],[1,2],'ul');
//
Les résultats correspondants sont donnés en Figure 2.4.
Figure 3: Livret A et assurance-vie sur 10 ans
3 Placement en bourse
Il s’agit dans cette partie de pouvoir simuler des placements boursiers. Étant donnée
une série (historique) de taux de rentabilité mensuels, ce placement s’apparente à une
capitalisation mensuelle. Pour cette série historique, nous avons opté pour le CAC40. Nous
disposons en effet de données relatives à l’indice CAC, ou son équivalent reconstitué, depuis
1965.
3.1 Obtention des variations mensuelles de l’indice CAC40
Les données relatives au CAC40 reconstitué peuvent être trouvées par exemple sur Internet
http://jmrpassions.free.fr/bourse/cac40.php.
Une fois ces données saisies sous Scilab, le programme présenté en Code Scilab 6 permet de
définir, pour chaque mois, le taux de rentabilité attaché à l’indice CAC40.
Code Scilab6.
//
M=fscanfMat('cac40_mensuel.txt');
Md=M(:,2); //Vecteur des valeurs en début de mois
Mf=M(:,5); //Vecteur des valeurs en fin de mois
tableau_taux_cac40=100* (Mf-Md)./Mf;
//Vecteur des taux de variation pour chaque mois
//
On peut alors représenter ces variations de taux sur un graphique donné en Figure 4.
Figure 4: Variation du taux de rémunération mensuelle de l’indice CAC40 reconstitué de
janvier 1965 à juin 2003.
3.2 Programme Scilab
On définit dans cette section une fonction Scilab bourse qui permet de faire évoluer un capital
selon les variations historiques du CAC40, ou d’autres indices pourvu que les données soient
stockées dans un tableau. Elles est donnée en Code Scilab 7.
Cette fonction prend en arguments :
la date où commence le tableau historique ;
la suite des taux de rentabilité mensuels ;
la valeur du capital initial ;
la suite des apports mensuels ;
les dates de début et fin de placement,
et retourne la suite des valeurs mensuelles du capital, et le montant des plus-values.
Code Scilab7.
//
function [capital,plus_values]=bourse(mois_tab,annee_tab,...
tableau_taux,capital_initial,tableau_mensualites,mois_debut,...
annee_debut,mois_fin,annee_fin)
//mois_tab //mois de début du tableau des rentabilités
//annee_tab //annee de début du tableau des rentabilités
ind0=(12-mois_tab) + (annee_debut - annee_tab - 1)*12 +...
mois_debut+1 ;
indf=(12-mois_tab) + (annee_fin - annee_tab - 1)*12 +...
mois_fin;
for k=ind0:indf
capital=[capital,capital($)*(1+tableau_taux(k)/100) +...
tableau_mensualites(k-ind0+1)];
//le tableau des mensualités n'est constitué que pour
//la période de placement... d'où l'indice.
cumul_mensualites=cumul_mensualites + tableau_mensualites(k-ind0+1) ;
plus_values=[plus_values, capital($) - cumul_mensualites ]
end
endfunction
//
3.3 Simulation de différents placements en bourse
On donne dans la suite plusieurs exemples d’utilisation de la fonction bourse.
Evolution d’un capital brut placé en bourse
Le programme qui figure en Code Scilab 8 donne l’évolution d’un capital placé en bourse, si l’on
n’apporte pas de mensualités. Le graphique qui en résulte est lui donné en Figure 5, et est relatif
aux données du Tableau 3.3.
xtitle('Capital initial de' +...
string(capital_initial) +' euros'+' et placements reguliers de '+...
string(tableau_mensualites(1)) +' euros', 'Mois' ,'Capital');
legends(['Bourse de '+string(mois_debut)+'/'+string(annee_debut)+...
' a '+string(mois_fin)+'/'+string(annee_fin)],[1],'ul');
//
Figure 5: Evolution d’un capital en bourse sans apport mensuel
Date d’entrée
date de sortie
mensualité
capital initial
01/1985
01/1995
0
class="td11"> 1 000
Table 4: Données pour simulation de capital en bourse sans menusalité
Evolution du même capital avec apports mensuels
On aimerait ici confirmer ou infirmer la stratégie proposée par les banques qui consiste à préférer
un apport régulier d’argent afin de ”lisser” les variations chaotiques des cours de la bourse. On va
donc simuler le même placement que précédemment, mais en apportant régulièrement de l’argent.
Le programme associé, peu différent du précédent, est donné en Code Scilab 9. Le graphique qui
présente les deux courbes simultanément est celui de la Figure 6; il correspond aux données du
Tableau 3.3.
xtitle('Capital initial de' +...
string(capital_initial) +' euros'+' et placements reguliers de '+...
string(tableau_mensualites(1)) +' euros', 'Mois' ,'Capital');
legends(['Bourse de '+string(mois_debut)+'/'+string(annee_debut)+...
' a '+string(mois_fin)+'/'+string(annee_fin)+', avec mensualites',...
'Bourse de '+string(mois_debut)+'/'+string(annee_debut)+...
' a '+string(mois_fin)+'/'+string(annee_fin)+', sans mensualites'],...
[1,2],'ul');
//
Figure 6: Comparaison de capitalisations boursières selon les mensualités
Date d’entrée
date de sortie
mensualité
capital initial
01/1985
01/1995
100
class="td11"> 1 000
01/1985
01/1995
0
class="td11"> 1 000
Table 5: Données pour comparaison de capitaux en bourse, selon les mensualites
Comparaison d’un même placement sur deux périodes différentes
On va ici simuler un même placement, mais sur deux plages historiques différentes. Le programme
associé est celui du Code Scilab 10. Une fois encore, le graphique, obtenu avec les données du
Tableau 3.3, est en Figure 7.
xtitle('Capital initial de' +...
string(capital_initial) +' euros'+' et placements reguliers de '+...
string(tableau_mensualites(1)) +' euros', 'Mois' ,'Capital');
legends(['Bourse de '+string(mois_debut)+'/'+string(annee_debut)+...
' a '+string(mois_fin)+'/'+string(annee_fin),...
'Bourse de '+string(mois_debut2)+'/'+string(annee_debut2)+...
' a '+string(mois_fin2)+'/'+string(annee_fin2)],[1,2],'ul');
//
Figure 7: Comparaison de capitalisations boursières à différentes époques
Date d’entrée
date de sortie
mensualité
capital initial
06/1993
06/2003
100
class="td11"> 1 000
01/1975
01/1985
100
class="td11"> 1 000
Table 6: Données pour comparaison de capitaux en bourse, selon les dates de placement
3.4 Comparaison des trois différents placements
Il s’agit ici de comparer les placements sur le livret A, l’assurance-vie ou la bourse. Les
programmes associés sont donnés en Code Scilab 11
Code Scilab11.
//
getf('annuel.sci');
// ------------------------------------------------------------
// Données communes
// ------------------------------------------------------------
xtitle('Capital initial de' +...
string(capital_initial) +' euros'+' et placements reguliers de '+...
string(tableau_mensualites(1)) +' euros', 'Mois' ,'Capital');
legends(['Livret A '+string(taux_A)+'%' ; ...
'Assurance-vie '+string(taux_av)+'%' ; 'CAC 40'],[1,2,3],'ul');
//
Le graphique de synthèse est donné en Figure 3.4, et correspond aux données du
Tableau 3.4
Figure 8: Graphique de synthèse : comparaison sur 10 ans
Placement
taux
frais
date d’entrée
date de sortie
mensualité
capital initial
Assurance-vie
4,5%
3 %
01/1965
06/2002
100
class="td11"> 1 000
LivretA
2.75 %
-
01/1965
06/2002
100
class="td11"> 1 000
Bourse
-
-
01/1965
06/2002
100
class="td11"> 1 000
Table 7: Données pour synthèse et comparaison des placements
4 Conclusion
soigner frais d’achat et de vente, et fiscalité boursière
plafond livret A
scénarios types de placements
soigner fiscalité assurance-vie et revoir code en conséquence
A Annexe : Code spécifique pour le Livret A
Le livret A se caractérise notamment par
l’absence de frais d’entrée ou de sortie,
son mécanisme de calcul des intérêts par quinzaine et de capitalisation par année,
son taux, fixe au moins pour de courtes périodes, et relativement faible.
A.1 Programme Scilab
Le programme présenté en Code Scilab 12 définit une fonction Scilab, appelée livretA, qui
prend en arguments :
le taux du livret ;
le montant du capital initial ;
le montant d’un éventuel apport régulier d’argent ;
et les dates de placement initial et de retrait ;
et qui renvoie trois vecteurs :
un premier comptant les quinzaines du placement ;
un deuxième qui stocke, pour chaque quinzaine, le montant du capital à cette date ;
un dernier qui contient, pour chaque quinzaine, le montant des intérêts agrégés.
Code Scilab12.
//
function [abcisses_quinzaines,capital,tableau_interets]=...
livretA(taux,capital_initial,rajout,j1,m1,a1,j2,m2,a2)
//taux en pourcentage annuel : par exemple 4 et non pas 0.04
//capital_initial:capital initial
//rajout:rajout chaque mois
//placement le j1/m1/a1
//nous sommes le j2/m2/a2
// error('Attention : mettre 4.5 pour
// un taux de 4,5 pourcent')
t=1/24*taux
// t est le taux par quinzaine
////////////////////////////////////////////////////
// PASSAGE DE DATES À DES QUINZAINES
////////////////////////////////////////////////////
if j1>15 then
quinzaine_placement=2*m1;
else quinzaine_placement=2*m1-1;
end
if j2>15 then
quinzaine_sortie=2*m2-1;
else quinzaine_sortie=2*(m2-1);
end
//Commentaire : quinzaine_sortie idem que
//quinzaines_restantes mais pour le retrait
////////////////////////////////////////////////////
// PREMIÈRE ANNÉE
////////////////////////////////////////////////////
quinzaines_restantes=24-quinzaine_placement;
abcisses_quinzaines= ...
1:(quinzaines_restantes+quinzaine_sortie+nombre_annees*24+1);
// vecteur des abscisses exprimées en quinzaines
// Commentaire:
// quinzaines_restantes est le nombre de quinzaines
//de l'année du placement pendant lesquelles
//l'argent est placé
// Problème car les versements sont mensuels alors que
//le calcul des intérêts est par quinzaines
// capital est un vecteur contenant la suite des capitaux
//par quinzaine
// interets est un scalaire
capital=[]
tableau_interets=[];
interets=0;
if j1>15 then
// alors quinzaines_restantes est pair
capital=capital_initial;
tableau_interets=[0];
for j=1:(quinzaines_restantes/2)
// boucle sur le mois
capital=[capital,capital($)+rajout,capital($)+rajout]
// doublon pour cause de quinzaines
interets=interets+2*t/100*capital($);
tableau_interets=[tableau_interets,tableau_interets($)+...
t/100*capital($),tableau_interets($)+2*t/100*capital($)];
// cumul des intérêts
end
else
// j1<=15 et alors quinzaines_restantes est impair
capital=[capital_initial,capital_initial + 0]
interets=t/100*capital($);
tableau_interets=[0,t/100*capital($)];
// +0 pour signifier l'absence de rajout dans
//la deuxième quinzaine
for j=1:(quinzaines_restantes-1)/2
// boucle sur le mois
capital=[capital,capital($)+rajout,capital($)+rajout]
// doublon pour cause de quinzaines
interets=interets+2*t/100*capital($);
tableau_interets=[tableau_interets,tableau_interets($)+...
t/100*capital($),tableau_interets($)+2*t/100*capital($)];
// cumul des intérêts
end
end
capital($)=capital($)+interets ;
// capital à la fin de la première année
////////////////////////////////////////////////////
// ANNÉES INTERMÉDIAIRES
////////////////////////////////////////////////////
if nombre_annees >0 then
for i=1:nombre_annees
interets=0;
for j=1:12
capital=[capital,capital($)+rajout,capital($)+rajout]
interets=interets+2*t/100*capital($);
tableau_interets=[tableau_interets,tableau_interets($)+...
t/100*capital($), tableau_interets($)+2*t/100*capital($)];
end
capital($)=capital($)+interets ;
// capital à la fin de chaque année
end
end
////////////////////////////////////////////////////
// DERNIÈRE ANNÉE
////////////////////////////////////////////////////
interets=0;
if j2>15 then
for j=1:((quinzaine_sortie-1)/2)
capital=[capital,capital($)+rajout,capital($)+rajout]
interets=interets+2*t/100*capital($);
tableau_interets=[tableau_interets,tableau_interets($)+...
t/100*capital($), tableau_interets($)+2*t/100*capital($)];
end
capital=[capital,capital($)+rajout]
interets=interets+t/100*capital($);
tableau_interets=[tableau_interets,tableau_interets($)+t/100*capital($)];
else
for j=1:quinzaine_sortie/2
capital=[capital,capital($)+rajout,capital($)+rajout]
interets=interets+2*t/100*capital($);
tableau_interets=[tableau_interets,tableau_interets($)+...
t/100*capital($), tableau_interets($)+2*t/100*capital($)];
end
end
capital($)=capital($)+interets;
CAPITAL=capital($);
printf('Le capital en sortie est :')
disp(CAPITAL);
endfunction
//
A.2 Exemple
Un exemple d’utilisation de la fonction livretA est donné en Code Scilab 13. Ceci signifie que
le taux du livret A est 2,75 % ;
le montant du capital initial est de 1 000 euros ;
le montant de l’apport régulier d’argent est de 100 euros mensuels ;
et 10/05/2007 et 27/10/2017 sont les dates de placement initial et de retrait.