Je vois des grossières erreurs du programme qui s’avèrent dès lors bidonné (volontairement ???) en faveur du CTO…
On commence par le fait qu’il impose des frais de 0,5% pour la revente sur le PEA sans tenir compte des frais que tu rentres en paramètre. Or les 0,5% ne sont que le maximum légal, pas celui pratiqué par ton broker que tu rentres en paramètre. Bref, il majore volontairement les frais de revente PEA.
const orderFeesPEA = 0.005; // Frais d’ordre à l’achat et à la revente pour le PEA (0.5%)
// Appliquer les frais d’ordre pour la revente de l’ETF en PEA
const peaAfterSellFees = peaAfterTax - peaAfterTax * orderFeesPEA;
Un programme qui prendrait en compte les frais rentrés en paramètre ressemblerait plutôt à :
function computeEtfDca(yearlyInput, years, interests, fees, orderFees = 0) {
let amount = 0;
for (let i = 0; i < years; i++) {
amount += yearlyInput; // Ajout de l'investissement annuel
amount -= amount * orderFees; // Soustraction des frais d'ordre Ă l'achat
amount *= interests; // Calcul de la croissance
amount -= amount * fees; // Soustraction des frais de gestion
}
return amount;
}
function getFlippeningInvestPlan(yearlyInput, interests, feesPEA, feesCTO) {
const taxRatePEA = 0.172; // Taux de taxation du PEA (17.2%)
const taxRateCTO = 0.3; // Taux de taxation du CTO (30%)
const orderFeesPEA = 0.005; // Frais d'ordre Ă l'achat et Ă la revente pour le PEA (0.5%)
let year = 0;
while (year < 100) {
const pea = computeEtfDca(yearlyInput, year, interests, feesPEA, orderFeesPEA);
const cto = computeEtfDca(yearlyInput, year, interests, feesCTO);
// Calcul des montants après impôt pour le PEA et le CTO
const peaAfterTax = pea - (pea - yearlyInput * year) * taxRatePEA;
const ctoAfterTax = cto - (cto - yearlyInput * year) * taxRateCTO;
// Appliquer les frais d'ordre pour la revente de l'ETF en PEA
const peaAfterSellFees = peaAfterTax - peaAfterTax * feesPEA;
if (peaAfterSellFees < ctoAfterTax) {
console.log(`Au bout de ${year} ans, le CTO sera plus intéressant que le PEA en investissant annuellement ${yearlyInput} euros.`);
console.log(`Montant PEA après impôt et frais de revente : ${peaAfterSellFees.toFixed(2)} euros -- Montant CTO après impôt : ${ctoAfterTax.toFixed(2)} euros`);
break;
}
year++;
}
}
// Tester avec des frais de 0.0038 pour le PEA et 0.002 pour le CTO
getFlippeningInvestPlan(1500, 1.08, 0.0038, 0.002);
Et là , les résultats ne sont absolument pas autant en faveur du CTO.
Programme 1 → 2,09e d’écart en 1 an en faveur du CTO
Au bout de 1 ans, le CTO sera plus intéressant que le PEA en investissant annuellement 1500 euros.
Montant PEA après impôt et frais de revente : 1579.64 euros
Montant CTO après impôt : 1581.73 euros
Programme 2 → 0,17e en 1 an en faveur du CTO
Au bout de 1 ans, le CTO sera plus intéressant que le PEA en investissant annuellement 1500 euros.
Montant PEA après impôt et frais de revente : 1581.55 euros
Montant CTO après impôt : 1581.73 euros
L’autre grossière erreur (toujours volontaire ???), c’est que comme par magie pour lui il n’y aurait aucun frais pour la revente sur CTO. Et oui, il « compare » PEA après taxe et frais (frais bidonné comme vu dessus) VS CTO après taxe mais en « oubliant » les frais… alors là si on pas loin de la tromperie assumée en comparant choux et carottes…
Allez, retournons en debuggage pour rajouter les frais de vente au CTO et bien comparer taxe ET frais dans le 2 cas…
function computeEtfDca(yearlyInput, years, interests, fees, orderFees = 0) {
let amount = 0;
for (let i = 0; i < years; i++) {
amount += yearlyInput; // Ajout de l'investissement annuel
amount -= amount * orderFees; // Soustraction des frais d'ordre Ă l'achat
amount *= interests; // Calcul de la croissance
amount -= amount * fees; // Soustraction des frais de gestion
}
return amount;
}
function getFlippeningInvestPlan(yearlyInput, interests, feesPEA, feesCTO) {
const taxRatePEA = 0.172; // Taux de taxation du PEA (17.2%)
const taxRateCTO = 0.3; // Taux de taxation du CTO (30%)
const orderFeesPEA = 0.005; // Frais d'ordre Ă l'achat et Ă la revente pour le PEA (0.5%)
let year = 0;
while (year < 100) {
const pea = computeEtfDca(yearlyInput, year, interests, feesPEA, orderFeesPEA);
const cto = computeEtfDca(yearlyInput, year, interests, feesCTO);
// Calcul des montants après impôt pour le PEA et le CTO
const peaAfterTax = pea - (pea - yearlyInput * year) * taxRatePEA;
const ctoAfterTax = cto - (cto - yearlyInput * year) * taxRateCTO;
// Appliquer les frais d'ordre pour la revente de l'ETF en PEA
const peaAfterSellFees = peaAfterTax - peaAfterTax * feesPEA;
const ctoAfterSellFees = ctoAfterTax - ctoAfterTax * feesCTO;
if (peaAfterSellFees < ctoAfterSellFees) {
console.log(`Au bout de ${year} ans, le CTO sera plus intéressant que le PEA en investissant annuellement ${yearlyInput} euros.`);
console.log(`Montant PEA après impôt et frais de revente : ${peaAfterSellFees.toFixed(2)} euros -- Montant CTO après impôt et frais de revente : ${ctoAfterSellFees.toFixed(2)} euros`);
break;
}
if (peaAfterSellFees > ctoAfterSellFees) {
console.log(`Au bout de ${year} ans, le PEA sera plus intéressant que le CTO en investissant annuellement ${yearlyInput} euros.`);
console.log(`Montant PEA après impôt et frais de revente : ${peaAfterSellFees.toFixed(2)} euros -- Montant CTO après impôt et frais de revente : ${ctoAfterSellFees.toFixed(2)} euros`);
break;
}
year++;
}
}
// Tester avec des frais de 0.0038 pour le PEA et 0.002 pour le CTO
getFlippeningInvestPlan(1500, 1.08, 0.0038, 0.002);
Programme 3 → 2,98e en 1 an en faveur du PEA
Au bout de 1 ans, le PEA sera plus intéressant que le CTO en investissant annuellement 1500 euros.
Montant PEA après impôt et frais de revente : 1581.55 euros
Montant CTO après impôt et frais de revente : 1578.57 euros