tag:blogger.com,1999:blog-66027173982287488612024-03-28T00:53:10.056+01:00Ordre SpontanéGuillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.comBlogger720125tag:blogger.com,1999:blog-6602717398228748861.post-72614616106973159822023-05-04T16:22:00.046+02:002023-05-05T17:48:02.145+02:00Votre mot de passe<p>On ne va pas épiloguer pendant 150 ans, vous avez besoin :</p>
<ul>
<li>De mots de passe très forts (à partir de 128 bits), un par site (sauf, éventuellement, les sites d’intérêt secondaire pour lesquels le fait qu’un tier accède à votre compte n’a pas d’importance) ;</li>
<li>De mots de passe que vous pouvez mémoriser très facilement [1] (sans avoir à les noter en clair dans le fameux motsdepasse.txt que vous avez sauvegardé sur le bureau de votre ordinateur).</li>
</ul>
<p>Il va de soi que ces deux objectifs sont contradictoires, raison pour laquelle vous utilisez sans doute des mots de passe beaucoup trop faciles à casser par la force brute et/ou les stockez de façon peu ou pas sécurisée.</p>
<h3>Parametrically Hashed Password</h3>
<p>Raison pour laquelle nous vous proposons ci-dessous une méthode simple (PHP) qui vous permettra de créer des mots de passe de nature à décourager les hackers les plus opiniâtres et les mieux équipés tout en restant extrêmes simples à mémoriser.</p>
<p>Vous avez besoin de deux choses :</p>
<ul>
<li>Primo, d’un entier naturel (strictement positif) que nous allons, faute de meilleure idée, appeler le <em>biais</em>. Ça peut être absolument n’importe quel entier (1, 42, votre date de naissance au format YYYYMMDD ou le code PIN de votre carte bancaire [2]…) : la seule contrainte c’est que vous devez pouvoir vous en souvenir très facilement. La bonne nouvelle, c’est que vous pouvez utiliser le même pour tous vos mots de passe ;</li>
<li>Deuxio, d’une chaine de caractères facile à mémoriser et à saisir qui doit simplement être différente pour chacun de vos comptes (i.e. une sorte de mot de passe très simple) que nous allons appeler la <em>clé</em>.</li>
</ul>
<p>Par exemple, supposez (ce n’est pas le cas) que notre biais soit 42 et que, pour notre compte Twitter, nous ayons décidé d’utiliser la clé « @SciamVox » (qui est <a href='https://twitter.com/SciamVox' target='_blank'>évidemment</a> un très mauvais mot de passe). Entrez ça dans le formulaire ci-dessous et cliquez sur « Générer ».</p>
<!-- Code by SCIAM.fr -- Feel free to use and redistribute. -->
<form id="foo_form">
<label for="input_string">Clé :</label>
<input type="text" id="input_string" name="input_string" required>
<label for="n">Biais :</label>
<input type="number" id="n" name="n" min="0" required>
<button type="submit">Générer</button>
</form>
<div id="result"><br>Votre mot de passe est :<br><pre>...</pre><br></div>
<script>
function buf2hex(buffer) {
return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
}
function mulberry32(a) {
return function() {
a |= 0;
a = a + 0x6D2B79F5 | 0;
let t = Math.imul(a ^ a >>> 15, 1 | a);
t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
return ((t ^ t >>> 14) >>> 0) / 4294967296;
};
}
function shuffleArray(array, n) {
const newArr = array.slice();
const random = mulberry32(n);
for (let i = newArr.length - 1; i > 0; i--) {
const j = Math.floor(random() * (i + 1));
[newArr[i], newArr[j]] = [newArr[j], newArr[i]];
}
return newArr;
}
function GetHash(x, n) {
const encoder = new TextEncoder();
const data = encoder.encode(x);
return crypto.subtle.digest('SHA-256', data).then(hash => {
const hexHash = buf2hex(hash);
let intArray = [];
for (let i = 0; i < hexHash.length; i += 2) {
intArray.push(parseInt(hexHash.substr(i, 2), 16));
}
let validChars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-*/&|#$§!:?;%=(){}[],.£<>@~'.split('');
validChars = shuffleArray(validChars, n);
let resultChars = intArray.map(int => validChars[int % validChars.length]);
return resultChars.slice(0, 32).join('');
});
}
document.getElementById('foo_form').addEventListener('submit', function (event) {
event.preventDefault();
const inputString = document.getElementById('input_string').value;
const n = parseInt(document.getElementById('n').value);
GetHash(inputString, n).then(result => {
document.getElementById('result').innerHTML = '<br>Votre mot de passe est :<br><pre>' + result + '</pre>';
});
});
</script>
<p>Notre mot de passe est donc « 2xiK(/6ky}!R9l;,o]A615x@IaB~fs-j » ; 32 caractères sélectionnés parmi un set de 90 caractères possibles, ça nous fait $90^{32}$ arrangements possibles (environ 200 bits) : <em>good luck with that, hackers !</em></p>
<h2>Explications</h2>
<p>L’idée de base, c’est que votre compte peut être exposé à deux types d’attaques. La plus classique, c’est ce qui arrive quand la base de données de l’application/site auquel vous souhaitez vous connecter a été compromise : l’assaillant dispose de votre <em>login</em> et de l’emprunte (MD5, SHA-1..) de votre mot de passe et va utiliser la force brute pour le craquer.</p>
<p>Dans ce cas, il est sans doute raisonnable de considérer qu’aucun mot de passe n’est absolument inviolable et de résonner en termes de coût. Concrètement : vous avez besoin d’un mot de passe tellement monstrueux que votre assaillant aura tout intérêt à passer par d’autres méthodes [3] que les algorithmes existants pour le découvrir.</p>
<p>L’approche proposée ici, c’est une fonction de hachage (SHA-256) à ceci près que votre mot de passe n’est pas constitué de la séquence [a-f, A-F, 0-9] (soit 22 caractères possibles) mais de (i) toutes les lettres de l’alphabet latin moderne en minuscules (26), (ii) les mêmes en majuscules (26), (iii) les chiffres de 0 à 9 (10) et (iv) 28 « caractères spéciaux » — soit un total de 90 symboles différents.</p>
<p>Le résultat, même avec un simple mot ou même un seul symbole, c’est une chaine de 32 caractères qui a le goût, l’odeur et le saveur de l’aléa.</p>
<p>Reste qu’évidemment, la transformation de vos clés en mots de passe n’est pas aléatoire mais purement déterministe. C’est-à-dire qu’un assaillant (humain) qui, par hypothèse, saurait que vous avez utilisé cette approche et devinerait votre clé n’aurait aucun mal à découvrir votre mot de passe.</p>
<p>D’où le biais : sa fonction est simplement de mélanger le vecteur de caractères possibles de telle sorte que, même dans le cas susmentionné, il soit pratiquement impossible à quiconque de reproduire le même « hash » (sauf, évidemment, si vous rendez publique cette information).</p>
<p>Il va de soi que notre algorithme n’enregistre absolument rien (vous trouverez le code ci-dessous) et que, dans l’hypothèse ou cette affirmation ne suffit pas à vous rassurer, vous pouvez très facilement le copier sur une page HTML stockée en local (et, puisque nous y sommes, modifier quelques paramètres). La seule chose importante, c’est que vous devez pouvoir y accéder lorsque vous aurez besoin de retrouver votre mot de passe — le reste est accessoire.</p>
<h2>Code</h2>
<p>Voici le code :</p>
<iframe
src="https://carbon.now.sh/embed?bg=rgba%28171%2C+184%2C+195%2C+1%29&t=seti&wt=none&l=javascript&width=680&ds=true&dsyoff=20px&dsblur=68px&wc=true&wa=true&pv=56px&ph=56px&ln=false&fl=1&fm=Hack&fs=14px&lh=133%25&si=false&es=2x&wm=false&code=%253C%21--%2520Code%2520by%2520SCIAM.fr%2520--%2520Feel%2520free%2520to%2520use%2520and%2520redistribute.%2520--%253E%250A%250A%253Cform%2520id%253D%2522foo_form%2522%253E%250A%2520%2520%2520%2520%253Clabel%2520for%253D%2522input_string%2522%253ECl%25C3%25A9%2520%253A%253C%252Flabel%253E%250A%2520%2520%2520%2520%253Cinput%2520type%253D%2522text%2522%2520id%253D%2522input_string%2522%2520name%253D%2522input_string%2522%2520required%253E%250A%2520%2520%2520%2520%253Clabel%2520for%253D%2522n%2522%253EBiais%2520%253A%253C%252Flabel%253E%250A%2520%2520%2520%2520%253Cinput%2520type%253D%2522number%2522%2520id%253D%2522n%2522%2520name%253D%2522n%2522%2520min%253D%25220%2522%2520required%253E%250A%2520%2520%2520%2520%253Cbutton%2520type%253D%2522submit%2522%253EG%25C3%25A9n%25C3%25A9rer%253C%252Fbutton%253E%250A%253C%252Fform%253E%250A%253Cdiv%2520id%253D%2522result%2522%253E%253Cbr%253EVotre%2520mot%2520de%2520passe%2520est%2520%253A%253Cbr%253E%253Cpre%253E...%253C%252Fpre%253E%253Cbr%253E%253C%252Fdiv%253E%250A%250A%253Cscript%253E%250A%2520%2520%250Afunction%2520buf2hex%28buffer%29%2520%257B%250A%2520%2520%2520%2520return%2520Array.prototype.map.call%28new%2520Uint8Array%28buffer%29%252C%2520x%2520%253D%253E%2520%28%2700%27%2520%252B%2520x.toString%2816%29%29.slice%28-2%29%29.join%28%27%27%29%253B%250A%257D%250A%250Afunction%2520mulberry32%28a%29%2520%257B%250A%2520%2520%2520%2520return%2520function%28%29%2520%257B%250A%2520%2520%2520%2520%2520%2520%2520%2520a%2520%257C%253D%25200%253B%250A%2520%2520%2520%2520%2520%2520%2520%2520a%2520%253D%2520a%2520%252B%25200x6D2B79F5%2520%257C%25200%253B%250A%2520%2520%2520%2520%2520%2520%2520%2520let%2520t%2520%253D%2520Math.imul%28a%2520%255E%2520a%2520%253E%253E%253E%252015%252C%25201%2520%257C%2520a%29%253B%250A%2520%2520%2520%2520%2520%2520%2520%2520t%2520%253D%2520t%2520%252B%2520Math.imul%28t%2520%255E%2520t%2520%253E%253E%253E%25207%252C%252061%2520%257C%2520t%29%2520%255E%2520t%253B%250A%2520%2520%2520%2520%2520%2520%2520%2520return%2520%28%28t%2520%255E%2520t%2520%253E%253E%253E%252014%29%2520%253E%253E%253E%25200%29%2520%252F%25204294967296%253B%250A%2520%2520%2520%2520%257D%253B%250A%257D%250A%250Afunction%2520shuffleArray%28array%252C%2520n%29%2520%257B%250A%2520%2520%2520%2520const%2520newArr%2520%253D%2520array.slice%28%29%253B%250A%2520%2520%2520%2520const%2520random%2520%253D%2520mulberry32%28n%29%253B%250A%2520%2520%2520%2520for%2520%28let%2520i%2520%253D%2520newArr.length%2520-%25201%253B%2520i%2520%253E%25200%253B%2520i--%29%2520%257B%250A%2520%2520%2520%2520%2520%2520%2520%2520const%2520j%2520%253D%2520Math.floor%28random%28%29%2520*%2520%28i%2520%252B%25201%29%29%253B%250A%2520%2520%2520%2520%2520%2520%2520%2520%255BnewArr%255Bi%255D%252C%2520newArr%255Bj%255D%255D%2520%253D%2520%255BnewArr%255Bj%255D%252C%2520newArr%255Bi%255D%255D%253B%250A%2520%2520%2520%2520%257D%250A%2520%2520%2520%2520return%2520newArr%253B%250A%257D%250A%250Afunction%2520GetHash%28x%252C%2520n%29%2520%257B%250A%2520%2520%2520%2520const%2520encoder%2520%253D%2520new%2520TextEncoder%28%29%253B%250A%2520%2520%2520%2520const%2520data%2520%253D%2520encoder.encode%28x%29%253B%250A%2520%2520%2520%2520return%2520crypto.subtle.digest%28%27SHA-256%27%252C%2520data%29.then%28hash%2520%253D%253E%2520%257B%250A%2520%2520%2520%2520%2520%2520%2520%2520const%2520hexHash%2520%253D%2520buf2hex%28hash%29%253B%250A%2520%2520%2520%2520%2520%2520%2520%2520let%2520intArray%2520%253D%2520%255B%255D%253B%250A%2520%2520%2520%2520%2520%2520%2520%2520for%2520%28let%2520i%2520%253D%25200%253B%2520i%2520%253C%2520hexHash.length%253B%2520i%2520%252B%253D%25202%29%2520%257B%250A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520intArray.push%28parseInt%28hexHash.substr%28i%252C%25202%29%252C%252016%29%29%253B%250A%2520%2520%2520%2520%2520%2520%2520%2520%257D%250A%2520%2520%2520%2520%2520%2520%2520%2520let%2520validChars%2520%253D%2520%27abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789%252B-*%252F%2526%257C%2523%2524%25C2%25A7%21%253A%253F%253B%2525%253D%28%29%257B%257D%255B%255D%252C.%25C2%25A3%253C%253E%2540%7E%27.split%28%27%27%29%253B%250A%2520%2520%2520%2520%2520%2520%2520%2520validChars%2520%253D%2520shuffleArray%28validChars%252C%2520n%29%253B%250A%2520%2520%2520%2520%2520%2520%2520%2520let%2520resultChars%2520%253D%2520intArray.map%28int%2520%253D%253E%2520validChars%255Bint%2520%2525%2520validChars.length%255D%29%253B%250A%2520%2520%2520%2520%2520%2520%2520%2520return%2520resultChars.slice%280%252C%252032%29.join%28%27%27%29%253B%250A%2520%2520%2520%2520%257D%29%253B%250A%257D%250A%250Adocument.getElementById%28%27foo_form%27%29.addEventListener%28%27submit%27%252C%2520function%2520%28event%29%2520%257B%250A%2520%2520%2520%2520event.preventDefault%28%29%253B%250A%2520%2520%2520%2520const%2520inputString%2520%253D%2520document.getElementById%28%27input_string%27%29.value%253B%250A%2520%2520%2520%2520const%2520n%2520%253D%2520parseInt%28document.getElementById%28%27n%27%29.value%29%253B%250A%2520%2520%2520%2520GetHash%28inputString%252C%2520n%29.then%28result%2520%253D%253E%2520%257B%250A%2520%2520%2520%2520%2520%2520%2520%2520document.getElementById%28%27result%27%29.innerHTML%2520%253D%2520%27%253Cbr%253EVotre%2520mot%2520de%2520passe%2520est%2520%253A%253Cbr%253E%253Cpre%253E%27%2520%252B%2520result%2520%252B%2520%27%253C%252Fpre%253E%253Cbr%253E%27%253B%250A%2520%2520%2520%2520%257D%29%253B%250A%257D%29%253B%250A%253C%252Fscript%253E"
style="width: 100%; height: 1379px; border:0; transform: scale(1); overflow:hidden;"
sandbox="allow-scripts allow-same-origin">
</iframe>
<p>---
<br/>[1] Vous devriez, en principe, utiliser une base de données sécurisée comme <a href='https://keepass.info/' target='_blank'>KeePass</a> pour stocker vos mots de passe. Reste qu’un mot de passe stocké dans votre mémoire ne saurait être plus en sécurité ailleurs et qu’il existe de nombreuses circonstances dans lesquelles vous pourriez ne plus avoir accès à votre base.
<br/>[2] Utiliser le code PIN de votre carte bancaire est, de notre point de vue, une très bonne idée mais n’hésitez pas à innover.
<br/>[3] Et nous nous refusons à imaginer ce que pourraient être lesdites méthodes.
<p>
Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com9tag:blogger.com,1999:blog-6602717398228748861.post-8496465491091462172023-03-16T14:28:00.002+01:002023-03-16T14:28:24.808+01:00Partage de la valeur ajoutée<p>Je reproduis ci-dessous une version légèrement simplifiée du <a href='https://www.insee.fr/fr/statistiques/6438735?sommaire=6438793' target='_blank'>tableau 1.107</a>, « <em>Partage de la valeur ajoutée brute à prix courants (en milliards d'euros)</em> », tel que publié par le comptable national (l'Insée) en rajoutant simplement quelques indications sur la nature des postes et les opérations effectuées. Ces chiffres concernent l'année 2021 et sont donnés en milliards d'euros courants, base 2014 :</p>
<pre>
= Valeur ajoutée brute *au prix de base* (B1g) ...................... 2'216.8
- Autres impôts sur la production (D29) ............................... 113.0
+ Autres subventions sur la production (D39) ........................... 67.9
- Rémunération des salariés (D1) .................................... 1'283.8
= Excédent brut d'exploitation et Revenu mixte brut (B2g + B3g) ....... 887.9
dont :
Excédent brut d'exploitation (B2g) ................................. 755.7
Revenu mixte brut (B3g) ............................................ 132.2
</pre>
<p>Pour autant que je sache ces données sont aussi justes qu’elles peuvent l’être mais l’interprétation qui en est faite bien souvent est parfaitement erronée. Plus précisément : de nombreux commentateurs peu aguerris et désireux de mesurer comment la richesse créée par l’économie est répartie entre le travail et le capital utilisent ces chiffres sans les comprendre et en arrivent à des conclusions parfaitement fausses. Erreur typique : rapporter les rémunération des salariés (D1) [1] à la valeur ajoutée brute (B1g) et en déduire que la part du travail dans la richesse créée n’est que de 57.9% puis, faire le même calcul avec la somme de l’excédent brut d’exploitation (B2g) et du revenu mixte (B3g) et en conclure que la part du capital s’élève à 40.1%.</p>
<p>Ce qui est parfaitement faux. Dès lors que nous souhaitons mesurer la part des facteurs de production (le travail et le capital) dans la production de richesse nationale, ces données doivent être retraitées.</p>
<p>Le premier retraitement n’entraine pas de modifications majeures mais, quitte à faire les choses autant les faire bien : jusque à preuve du contraire, les <a href='https://www.insee.fr/fr/metadonnees/definition/c1541' target='_blank'>autres impôts sur la production</a> ne rémunèrent ni le travail ni le capital (il faut donc les retrancher de la valeur ajoutée brute au prix de base) tandis que les <a href='https://www.insee.fr/fr/metadonnees/definition/c2263' target='_blank'>autres subventions sur la production</a> sont susceptibles de rémunérer l’un comme l’autre (il faut donc les rajouter). C’est ce que le comptable national appelle la valeur ajoutée brute <em>au coût des facteurs</em> :</p>
<pre>
= Valeur ajoutée brute *au prix de base* (B1g) ...................... 2'216.8
- Autres impôts sur la production (D29) ............................... 113.0
+ Autres subventions sur la production (D39) ........................... 67.9
= Valeur ajoutée brute *au coût des facteurs* ....................... 2'171.7
</pre>
<p>La rémunération des salariés (D1) représente désormais 59.1% de la valeur ajoutée brute (au coût des facteurs) et la rémunération du capital, évidemment, c’est simplement le complément pour faire 100%.</p>
<p>Le second retraitement est beaucoup plus important : lorsqu’on cherche à mesurer de la richesse (par opposition à de l’activité), on ne raisonne jamais en valeur ajoutée brute mais en valeur ajoutée <em>nette</em>. La différence entre les deux, c’est ce que le comptable national appelle la <a href='https://www.insee.fr/fr/metadonnees/definition/c1115' target='_blank'>consommation de capital fixe</a> (P51c, voir le <a href='https://www.insee.fr/fr/statistiques/6438735?sommaire=6438793' target='_blank'>tableau 1.112</a>), c’est-à-dire la dépréciation (ou amortissement) du capital physique. Le fait est qu’une part substantielle de l’activité économique (telle que mesurée par le PIB) ne créé pas de richesse nette : lorsque, par exemple, les rails ou le matériel roulant de la SNCF s’usent, ça n’est en aucune façon une rémunération du capital (pas plus qu'une rémunération du travail). Si la SNCF ne fait rien, son matériel perd de la valeur ; si elle procède à l’entretient nécessaire, c’est un coût.</p>
<p>Le retraitement consiste donc à retrancher cette consommation de capital fixe à la valeur ajoutée brute pour obtenir une valeur ajoutée nette et, parallèlement, à la retrancher à l’excédent brut d’exploitation (et au revenu mixte brut) pour calculer un excédent <em>net</em> d’exploitation (et un revenu mixte <em>net</em>) :</p>
<pre>
= Valeur ajoutée brute *au coût des facteurs* ....................... 2'171.7
- Consommation de capital fixe (P51c) ................................. 486.3
= Valeur ajoutée *nette* au coût des facteurs ....................... 1'685.3
- Rémunération des salariés (D1) .................................... 1'283.8
= Excédent *net* d'exploitation et Revenu mixte *net* (B2n + B3n) ..... 401.6
dont :
Excédent *net* d'exploitation (B2n) ................................ 281.4
Revenu mixte *net* (B3n) ........................................... 120.2
</pre>
<p>La rémunération des salariés (D1) représente alors 76.2% de la valeur ajoutée nette au coût des facteurs et la rémunération du capital, les 23.8% restants.</p>
<p>Notez que, jusqu’ici, nous n’avons fait qu’appliquer à la lettre les recommandations de tout bon manuel de comptabilité nationale. Ces deux retraitements n’ont absolument rien de nouveau ni d’original :ils ne font pas débat. Ce qui suit, en revanche, relève plus de l’interprétation (de votre serviteur et d’un bon nombre d’économistes) et peut donc être débatu.</p>
<p>Pour bien comprendre le point, il nous faut découper l’économie nationale (S10) en ses cinq secteurs institutionnels, tels que définis par L’insée — <em>Sociétés non financières</em> (S11), <em>Sociétés financières</em> (S12), <em>Administrations publiques</em> (S13), <em>Ménages y compris entrepreneurs individuels</em> (S14) et <em>Institutions sans but lucratif au service des ménages</em> (S15) — et comparer la rémunération des salariés (ci-dessous, « Salariés », c'est-à-dire le poste D1 de la compatbilité nationale) à la valeur ajoutée <em>nette au prix des facteurs</em> (ci-dessous « VAN ») telle que nous venons de la calculer.</p>
<pre>
.................................................... VAN . Salariés ........ %
Sociétés non financières (S11) ................... 999,6 .... 836,1 .... 83,6%
Sociétés financières (S12) ........................ 63,6 .... 60,2 .... 94,7%
Administrations publiques (S13) .................. 312,7 .... 312,4 .... 99,9%
Ménages y-c entrepreneurs individuels (S14) ...... 275,2 ..... 40,9 .... 14,9%
Institutions sans but lucratif (S15) .............. 34,2 ..... 34,2 ... 100,0%
Économie nationale (S10).........................1'685,3 .. 1'283,8 .... 76,2%
</pre>
<p>Comme vous pouvez le constater, la part de la rémunération des salariés dans les <em>administrations publiques</em> (S13) et dans les <em>institutions sans but lucratif au service des ménages</em> (S15) est proche de 100%. En théorie, elle devrait même être de 100% <em>exactement</em>. C’est tautologique : la production de ces deux secteurs étant essentiellement non-marchande (i.e. nous n’avons pas de prix de marché pour l’évaluer), elle est donc mesurée, par convention, à son coût de production ; c’est-à-dire le coût des consommations intermédiaires, la rémunération des salariés, la consommation de capital fixe (qui est donc bien traitée comme un coût) et le solde des impôts et subventions sur la production. Bref, au-delà de ces petits écarts [2], la part de la rémunération des salariés dans la valeur ajoutée nette au coût des facteurs de ces deux secteurs devrait logiquement être de 100%.</p>
<p>Vous serez sans doute moins surpris par les résultats obtenus pour les <em>sociétés financières</em> et <em>non-financières</em> (banques, compagnies d'assurance etc...). Dans ces deux cas, il est évident que le capital doit être rémunéré et il ne devrait surprendre personne qu’il le soit plus dans les sociétés non-financières (pensez aux rails et au matériel roulant de la SNCF [3]) que dans les sociétés financières.</p>
<p>Il nous reste donc le secteur des ménages y-compris entrepreneurs individuels (S14) dans lequel la part des salariés dans la valeur ajoutée nette au coût des facteurs n’est que de 14.9% ; ce qui nous amène naturellement à évaluer la part du capital, pour ce secteur, à 85.1%. De quoi s’agit-il ? Eh bien de deux choses : d’une part, de l’activité locative des ménages qui, de fait, génère une rémunération du capital (le leur) sans nécessiter d’embaucher grand monde et, d’autre part, des nombreuses activités des entrepreneurs individuels (les indépendants et, éventuellement, les membres de leur famille) dont une partie des revenus (les fameux <a href='https://www.insee.fr/fr/metadonnees/definition/c1885' target='_blank'>revenus mixtes</a>) peut effectivement être considéré comme une rémunération du capital — la moissonneuse-batteuse d’un céréalier indépendant, par exemple, c’est du capital (le sien).</p>
<p>De là, tout dépend de ce que vous cherchez à mesurer. Si votre objectif est de mesurer la part de la rémunération du travail et celle du capital dans la richesse nette créée par l'économie nationale, il est sans doute temps de prendre en compte les milliards d’heures de travail effectuées en dehors de tout contrat de travail, c’est-à-dire le <a href='https://www.insee.fr/fr/metadonnees/definition/c1748' target='_blank'>travail non-salarié</a>. On parle ici de 3'254.8 emplois (en équivalent temps plein) sur les 27'329.5 emplois recensés par le comptable national en 2021, près de 12% du total, qui sont massivement le fait de ce secteur — sachant que les salariés, ici, sont des membres de la famille et que le capital que rémunèrent les indépendants, c’est le leur et ils le rémunèrent grâce à leur propre travail.</p>
<p>D'où le dernier retraitement que je propose ici, ayant parfaitement conscience qu'il n’est pas conforme à la pratique du comptable national :</p>
<pre>
.................................................... VAN .. Travail ........ %
Sociétés non financières (S11) ................... 999,6 .... 836,1 .... 83,6%
Sociétés financières (S12) ........................ 63,6 .... 60,2 .... 94,7%
Administrations publiques (S13) .................. 312,7 .... 312,7 ... 100,0%
Ménages y-c entrepreneurs individuels (S14) ...... 275,2 .... 275.2 ... 100.0%
Institutions sans but lucratif (S15) .............. 34,2 ..... 34,2 ... 100.0%
Économie nationale (S10).........................1'685,3 .. 1'518,4 .... 90,1%
</pre>
<p>C’est-à-dire que la part de la valeur ajoutée nette au coût des facteurs (i.e. ce qui peut légitimement être considéré comme partageable par les facteurs de production) qui a été allouée au travail (salarié ou non) en 2021 était de 90.1% et, par différence, la part allouée au capital (étant entendu comme le capital d’une personne autre que celle qui travaille) n’était que de 9.9%.</p>
<p>Il va de soit que ce dernier retraitement est sujet à caution. Sa principale faiblesse repose sur les activités locatives des ménages : on peut tout à fait légitimement supposer que ces quelques 115.8 milliards d’excédent net d’exploitation constituent bien une rémunération du capital (auquel cas la part du travail retombe à 83.2%) ou, sans doute plus justement, que ce poste n’a rien à faire dans un compte d’exploitation et devrait être traité dans le compte d'affectation des revenus primaires au même titre que les investissements en actions, obligations (etc…). A contrario, il est légitime de s’interroger sur la réelle valeur ajoutée des secteurs principalement non marchands (administrations et institutions sans but lucratif [4]) tout comme on peut se demander si les salaires des actionnaires dirigeants des sociétés (financières ou non) ne comporte pas une part de rémunération de leur travail effectif. Nous remettrons, si vous le voulez bien, ces débats à plus tard.</p>
<p>---
<br/>[1] La rémunération des salariés inclue le coûts total employeur tel qu’il apparait sur vos bulletins de paie (salaire brut + charges dites « patronales ») ainsi que l’intéressement, la participation et les éventuels abondements au titre de l’épargne salariale (il me semble que les avantages en nature sont aussi évalués mais je préfère ne pas m’avancer sur ce point).
<br/>[2] C'est une petite bizarrerie que je ne parviens pas à expliquer : l’excédent net d’exploitation des administrations publiques et ISBLSM est très proche de zéro mais pas exactement et cette bizarrerie se répercute d’année en année jusqu’à l’évaluation de la production. Cette dernière devrait, en principe, être égale à la somme des postes consommation intermédiaire (P2), consommation de capital fixe (P51c), rémunération des salariés (D1) et impôts sur la production (D29) moins les autres subventions sur la production (D39) mais, sans que je parvienne à identifier pourquoi, on observe systématiquement de petits écarts.
<br/>[3] Les sociétés financières (S12) et non-financières (S11) incluent également les entreprises détenues, en tout ou partie, par L’État.
<br/>[4] Et je précise ici que cette réévaluation peut avoir lieu dans un sens comme dans l'autre : je pense notamment au travail fourni à titre gracieux par les bénévoles qui, de toute évidence, créé de la valeur ajoutée nette mais pas au coût des facteurs (puisque bénévole).
</p>
Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com5tag:blogger.com,1999:blog-6602717398228748861.post-80876760044946703922023-03-12T15:36:00.000+01:002023-03-12T15:36:02.505+01:00De la part du travail<p>Le comptable national cherche prioritairement à mesurer l’activité économique des différentes entités résidentes. Pour ce faire, son point de départ est la production (P1), mesurée en euros et toutes taxes comprises [1]. En 2021, tous secteurs confondus, la production était évaluée à 4'433.2 milliards d’euros [2]. C’est de ce total que le comptable national déduit la valeur des consommations intermédiaires (P2) pour obtenir la valeur ajoutée <em>brute aux prix du marché</em> (B1g). En 2021, à l’échelle de l’économie nationale, il y en avait pour 2'216.8 milliards (soit, de façon amusante cette année-là, presque exactement 50% de la production).</p>
<p>Lorsque vous entendez parler de « partage de la valeur ajoutée » dans la presse ou dans le discours public, c’est en général de cette valeur ajoutée brute au prix du marché qu’il est question. Le calcul est le suivant (données 2021 en milliards et en % de la valeur ajoutée brute aux prix du marché, voir le <a href='https://www.insee.fr/fr/statistiques/6438735?sommaire=6438793' target='_blank'>tableau 1.107</a> :</p>
<table style='width:100%'>
<tr>
<td width:'60%'>Valeur ajoutée brute au prix du marché (B1g)</td>
<td width:'20%' style='text-align:right'>2'216.8</td>
<td width:'20%' style='text-align:right'>100%</td>
</tr>
<tr>
<td width:'60%'>- Rémunération des salariés (D1)</td>
<td width:'20%' style='text-align:right'>1'283.8</td>
<td width:'20%' style='text-align:right'>57.9%</td>
</tr>
<tr>
<td width:'60%'>- Impôts sur la production (D29)</td>
<td width:'20%' style='text-align:right'>113.0</td>
<td width:'20%' style='text-align:right'>5.1%</td>
</tr>
<tr>
<td width:'60%'>+ Subventions sur la production (D39)</td>
<td width:'20%' style='text-align:right'>67.9</td>
<td width:'20%' style='text-align:right'>3.1%</td>
</tr>
<tr>
<td width:'60%'>= Excédent brut d'exploitation (B2g+B3g) [3]</td>
<td width:'20%' style='text-align:right'>887.9</td>
<td width:'20%' style='text-align:right'>40.1%</td>
</tr>
</table>
<p>De là, on conclue habituellement que les salariés ne perçoivent que 57.9% de la richesse créée par l'économie tandis que « la rémunération du capital » (l’Excédent brut d’exploitation et le revenu mixte des entreprises individuelles) atteint 40.1%.</p>
<p>C'est tout à fait faux. La valeur ajoutée distribuable, celle qui rémunère effectivement les facteurs de production (les salariés et « le capital »), c'est la valeur ajoutée <em>nette au coût des facteurs</em>. Louis-André Vincent, dans <a href='https://www.persee.fr/doc/estat_0423-5681_1963_num_18_1_8800', target='_blank'><em>La notion de valeur ajoutée et la prévision économique</em></a> (1963), écrivait :</p>
<p>« La valeur ajoutée nette au coût des facteurs est égale à la somme des rémunérations des facteurs de production qui ont coopéré, au sein de cette branche, à l’élaboration des produits. La valeur ajoutée [4] se décompose donc en salaires, profits et intérêts. »
<p>Pour évaluer la part de la valeur ajoutée brute au prix du marché qui rénumère effectivement les facteurs de production (i.e. valeur ajoutée nette au coût des facteurs), nous devons procéder à deux ajustements :</p>
<p>D'abord, nous allons calculer la valeur ajoutée brute au coût des facteurs. Il va de soi que les impôts sur la production (comme la TVA) ne rémunèrent ni les salariés ni le capital et il va de soi aussi que les subventions sont susceptibles de rémunérer l'un comme l'autre. On calcule donc :</p>
<table style='width:100%'>
<tr>
<td width:'60%'>Valeur ajoutée brute au prix du marché (B1g)</td>
<td width:'20%' style='text-align:right'>2'216.8</td>
<td width:'20%' style='text-align:right'>100%</td>
</tr>
<tr>
<td width:'60%'>- Impôts sur la production (D29)</td>
<td width:'20%' style='text-align:right'>113.0</td>
<td width:'20%' style='text-align:right'>5.1%</td>
</tr>
<tr>
<td width:'60%'>+ Subventions sur la production (D39)</td>
<td width:'20%' style='text-align:right'>67.9</td>
<td width:'20%' style='text-align:right'>3.1%</td>
</tr>
<tr>
<td width:'60%'>= Valeur ajoutée brute au coût des facteurs</td>
<td width:'20%' style='text-align:right'>2'171.7</td>
<td width:'20%' style='text-align:right'>98.0%</td>
</tr>
</table>
<p>Ensuite, et c'est le plus important, la valeur ajoutée brute est un indicateur d'activité économique mais pas un indicateur de création de richesses. La différence entre les deux, c'est simplement la dépréciation du matériel, l'amortissement du capital physique, ce que le comptable national appelle la <a href='https://www.insee.fr/fr/metadonnees/definition/c1115' target='_blank'>consommation de capital fixe (P51c)</a>. On calcule donc la valeur ajoutée nette au coût des facteurs :</p>
<table style='width:100%'>
<tr>
<td width:'60%'>Valeur ajoutée brute au coût des facteurs</td>
<td width:'20%' style='text-align:right'>2'171.7</td>
<td width:'20%' style='text-align:right'>98.0%</td>
</tr>
<tr>
<td width:'60%'>- Consommation de capital fixe (P51c)</td>
<td width:'20%' style='text-align:right'>486.3</td>
<td width:'20%' style='text-align:right'>22.0%</td>
</tr>
<tr>
<td width:'60%'>= Valeur ajoutée nette au coût des facteurs</td>
<td width:'20%' style='text-align:right'>1'685.3</td>
<td width:'20%' style='text-align:right'>76.0%</td>
</tr>
</table>
<p>C’est cette valeur ajoutée nette au coût des facteurs qui peut (et va effectivement) être répartie entre les salariés et « le capital ». C’est un point essentiel et souvent mal compris : quand les pneus de votre voiture s’usent parce que vous roulez, vous ne vous enrichissez pas. Les changer créera évidemment de l’activité (comptabilisée dans la valeur ajoutée brute et dans le PIB) mais ça ne créera pas de richesses nouvelles : la valeur ajoutée supplémentaire comptabilisée chez votre fournisseur de pneus vient simplement compenser la perte de valeur que vous avez subi. Il en va de même pour une entreprise. Quand, par exemple, la SNCF entretient ses rails et ses trains, elle ne gagne pas un centime : ses fournisseurs en profitent, bien sûr, mais pour elle, c’est un coût.</p>
Je cite <a href='https://www.comptanat.fr/principe/revenux.htm' target='_blank'>Francis Malherbe</a>, un des meilleurs experts français en matière de comptabilité nationale :
<p>« En fait, le produit intérieur brut est un bon indicateur d'activité mais un mauvais indicateur de la richesse nette créée car il ne tient pas compte de la dépréciation du capital. Inversement, le produit intérieur net est un bon indicateur de la richesse effectivement créée mais un moins bon indicateur d'activité que le produit intérieur brut car il ne tient pas compte de l'activité consacrée au maintien de la valeur du capital. »</p>
<p>Recalculons donc la part de la rémunération des salariés et celle du capital dans la valeur ajoutée nette au coût des facteurs :</p>
<table style='width:100%'>
<tr>
<td width:'60%'>= Valeur ajoutée nette au coût des facteurs</td>
<td width:'20%' style='text-align:right'>1'685.3</td>
<td width:'20%' style='text-align:right'>100.0%</td>
</tr>
<tr>
<td width:'60%'>- Rémunération des salariés (D1)</td>
<td width:'20%' style='text-align:right'>1'283.8</td>
<td width:'20%' style='text-align:right'>76.2%</td>
</tr>
<td width:'60%'>= Excédent brut d'exploitation (B2g+B3g) [3]</td>
<td width:'20%' style='text-align:right'>887.9</td>
<td width:'20%' style='text-align:right'>23.8%</td>
</table>
<p>La part des salariés vient de passer d'un peu moins de 58% à un peu plus de 76% : vous admettrez que ça fait une différence notable par rapport à ce qu'on lit ou entend habituellement. Et ce n'est pas fini parce qu'une analyse plus fine, par « secteurs institutionnels » au sens de l’Insée, nous réserve encore quelques suprises.</p>
<p>Vous ne serez sans doute pas étonnés d'apprendre que, pour les secteurs « Administrations publiques » (S13) et « Institutions sans but lucratif au service des ménages » (S15), la part des salariés dans la valeur ajoutée nette au coût des facteurs est à 100% ou presque. Vous serez sans doute plus surpris de savoir que, pour le secteur « Ménages y compris entrepreneurs individuels » (S14), on était à 14.9% en 2021 (et ça n'a jamais dépassé 25.3% depuis 1978). Il va de soi que les indépendants ne s’exploitent pas eux-mêmes ; ils semblent simplement préférer se rémunérer sur leurs (éventuels) bénéfices que sous forme de salaire. Ce sont les fameux « revenus mixtes » des entreprises individuelles que l'on assimile un peu vite à une rémunération du capital alors qu'ils sont surtout la rémunération d'un travail non-salarié (en 2021, ce secteur a produit près de 7 milliards d'heures de travail soit 16.2% du total) et que, même dans le cas d'un réel investissement en capital, ce dernier vient enrichir celui qui le fait (et ce, d'autant plus que nous raisonnons en net de consommation de capital fixe).</p>
<p>Restent donc les suspects habituels : les sociétés financières (S12) et non-financières (S11). On parle ici de toutes les entreprises [5] qui sont susceptibles d’employer des salariés autres que le patron (d’une entreprise individuelle). Au total, en 2021, elle ont créé 1'063.2 milliards d'euros de valeur ajoutée nette au coût des facteurs et versé pour 896.3 milliards de rémunération à leurs salariés : ça nous fait donc du 84.3%. Depuis qu’il est possible de calculer cette donnée (1978), le plus haut historique était en 1982 (88.1%), le plus bas en 1989 (75.3%) et, depuis, ça remonte régulièrement jusqu’au niveau observé en 2021 (dernière donnée disponible) : 84.3%.</p>
<p>Résumons : nous avons trois secteurs (Administrations publiques, Institutions sans but lucratif au service des ménages et Ménages y compris entrepreneurs individuels) dans lesquels la « part du capital » est logiquement de zéro. Dans le cas des administrations c'est tautologique [6], pour les associations c'est une évidence puisqu'il n'y a pas de capital à rémunérer et pour ménages et indépendants, il va de soi que tout investissement en capital est la propriété de celui qui le fait. Les sociétés, telles que définies ci-dessus (S11 et S12) sont donc nos seules supectes : en 2021, elles ont rémunéré leur capital à hauteur de 166.9 milliards d'euros [7] ce qui, rapporté aux 1'685.3 milliards de valeur ajoutée nette au prix des facteurs créés par notre économie cette année là, nous donne du 9.90%.</p>
<p>C'est-à-dire qu'à l'échelle nationale, la part du travail (salarié ou non) était de 90.10%.</p>
<p>Certains lecteurs jugeront peut être que 9.9% alloué à la rémunération du capital, c'est encore trop ; Il est donc temps de conclure sur quelques considérations d'ordre plus philosophique. D'abord, il faut bien comprendre que le capital désigne les actionnaires (y compris l’État qui est, par exemple, l’unique actionnaire de la SNCF) mais aussi les créanciers (principalement des banques et des investisseurs obligataires). Ensuite, il n'est pas inutile de rappeler qu'aucune théorie digne de ce nom n'a jamais proposé de ne pas rémunérer le capital. On a distuté de qui devait en être le propriétaire (des actionnaires privés, l’État, les salariés....) mais jamais il n'a été question de se passer de financements du capital : en l’absence de matériel roulant et de rail, la productivité d’un conducteur de train tombe à zéro.</p>
<p>Une comparaison entre les productivités horaires et rémunérations des agents de la fonction publique et celles des salariés des sociétés susmentionnées peut éclairer quelques lanternes :</p>
<table style='width:100%'>
<tr>
<td width:'40%'></td>
<td width:'20%' style='text-align:right'>VA/h [8]</td>
<td width:'20%' style='text-align:right'>Rem/h [9]</td>
<td width:'20%' style='text-align:right'>Ratio [6]</td>
</tr>
<tr>
<td width:'40%'>Agents de la fonction publique</td>
<td width:'20%' style='text-align:right'>34.36</td>
<td width:'20%' style='text-align:right'>34.32</td>
<td width:'20%' style='text-align:right'>99.9%</td>
</tr>
<td width:'60%'>Salariés des sociétés</td>
<td width:'20%' style='text-align:right'>41.53</td>
<td width:'20%' style='text-align:right'>35.01</td>
<td width:'20%' style='text-align:right'>84.3%</td>
</table>
<p>---
<br/>[1] Contrairement à la comptabilité privée qui mesure un chiffre d’affaires, c’est-à-dire les ventes effectivement réalisées hors taxe.
<br/>[2] Toutes les données en euros sont exprimées en euros courants base 2014.
<br/>[3] Le tableau de l'Insée distingue désormais l'Excédent brut d'exploitation (B2g) et le Revenu mixte brut (B3g) ; j'y reviens plus loin.
<br/>[4] Il faut bien sûr lire « valeur ajoutée <em>nette au coût des facteurs</em> »
<br/>[5] Les entreprises résidentes, évidemment, et ce sans tenir compte de qui en est propriétaire : ces secteurs incluent notamment les entreprises publiques.
<br/>[6] En comptabilité nationale, la production des administrations est évaluée par ses coûts : consommations intermédiaires + rémunération des fonctionnaires + consommation de capital fixe. Dans les données de la comptabilité nationale, on observe un petit écart de l'ordre de 300 millions d'euros (0.11% de la valeur ajoutée nette au coût des facteurs) que je ne parviens pas à expliquer.
<br/>[7] C’est l’Excédent Net d’Exploitation (l’Excédent Brut d’Exploitation au prix des facteurs moins la consommation de capital fixe).
<br/>[8] Valeur ajoutée nette au coût des facteurs par heure effectivement travaillée (données en euros, base 2014, pour l'année 2021).
<br/>[9] Rémunération horaire totale (salaire brut + charges patronales + intéressement, participation, abondements au titre de l'épargne salariale (etc...) (données en euros, base 2014, pour l'année 2021).</p>
Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com6tag:blogger.com,1999:blog-6602717398228748861.post-33186682717273066802022-11-22T15:04:00.002+01:002022-11-22T15:07:03.148+01:00What is the likelihood of a nuclear war?<p>My take on a question asked <a href="https://qr.ae/pvLDv8" target="_blank">on Quora</a>.</p>
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfXwx2-cpuHjQIVxEI2_-YkVCPyF3fMvckyi-yRxxHbB-D_hgR3OCshTBObJ40E-LdiN5DqNWnIULvlt7o51LIZmZKMMqoDKDIjLMxzoj7ZWWiJIX42NMy9akuoENN93HU4-fEK9nJAy2KBVLfeS3zpBDarq4Qrnn3inztEhuqMAc8O4OibG6ldVzl/s320/strange_game.gif" width="100%" />
<p>Nuclear warfare, rule #1: <em>nuclear weapons are terribly expensive</em>.</p>
<p>It cost a fuckload of money to buy them and it also cost a fuckload of money to maintain them — and the more nuclear weapons you have, of course, the more it costs. For instance, most nuclear warheads need 4-5 grams of tritium and, since the tritium content of the reservoir is depleted at a yearly rate of 5.5% it must be replenished. One gram of tritium is often reported to costs about $30’000. Think about the state of the Russian economy, the effect of sanctions, what we have observed on their conventional weapons and, perhaps most importantly, the endemic corruption of their military. Is there any tritium left in their nuclear warheads?</p>
<p>Nuclear warfare, rule #2: <em>there is no such thing as limited nuclear war</em>.</p>
<p>If you shoot first, the only likely outcome is a massive retaliatory strike. Putin knows it and every member of the Russian nuclear chain of command knows it. Should they shoot, Russia will cease to exist within minutes. So it’s basically suicide. Sure, Russia maybe has enough functioning missiles and nuclear warheads to inflict intolerable casualties on its targets. But using nuke, especially against a NATO member country, is just like pointing a gun to your head and pulling the trigger — except you don’t just kill yourself, but millions of your own citizens. It’s pure madness but, yes, Putin could go completely insane. Which leads us to:</p>
<p>Nuclear warfare, rule #3: <em>there is no such thing as a nuclear button</em>.</p>
<p>The big red button only exists in bad movies. Nobody is stupid enough to create such a shooting system. We don’t know what the actual procedures are, but we know for sure that they are all very highly secure. We don’t know how many people would be involved in the process but, if Putin orders a nuclear strike, at least one other guy will have to obey that order for the strike to be effective. Will he? Moreover, it is very likely that at least some of Putin's closest associates will be aware of the decision. How will they react? Will they just wait quietly for their own total annihilation? Will they try to flee, knowing we’ll get them soon or later? Or will they try something to stop Putin?</p>
<p>Does that mean the risk is zero? Of course not. Putin might develop suicidal tendencies, his entourage might prefer a nuclear apocalypse to a trial at the International Court of Justice, the guys in the nuclear chain of command might be fanatics, and some of the missiles might fly, hit their target and explode as expected. The probability is ridiculously low but it is not zero.</p>
<p>Now consider the alternative. What will most likely happen if we let Putin do? What will he do if we agree to give in to his blackmail? What kind of message are we sending to all warmongering authoritarian dictators? What kind of world will we been living in when this kind of peoples take it for granted that using nuclear weapons to force us into submission works?</p>
<p>Putin wants us to be afraid but the reality is that, behind his impenetrable mask of emotionless machine, he is more afraid than we are.</p>
Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com6tag:blogger.com,1999:blog-6602717398228748861.post-7171091117825005882019-10-30T16:42:00.000+01:002019-10-30T16:47:11.177+01:00Le prix de la baguette de 1954 à 2019<p>Le sujet n’en finit plus de faire débat : j’ai donc reconstruit une série du prix de la baguette (de 250g) en France (les données concernent Paris et l’agglomération parisienne jusqu’en 1991 et la France métropolitaine ensuite).</p>
<table width='100%'>
<tr>
<th width='20%' align='left'> </th>
<th colspan="2" align='right'>Baguette (250g)</th>
<th colspan="2" align='right'>1 Kg</th>
</tr>
<tr>
<th width='20%' align='left'>Année</th>
<th width='20%' align='right'>FRF</th>
<th width='20%' align='right'>EUR</th>
<th width='20%' align='right'>FRF</th>
<th width='20%' align='right'>EUR</th>
</tr>
<tr>
<td width='20%' align='left'>1954</td>
<td width='20%' align='right'>0.217</td>
<td width='20%' align='right'>0.033</td>
<td width='20%' align='right'>0.867</td>
<td width='20%' align='right'>0.132</td></tr>
<tr>
<td width='20%' align='left'>1955</td>
<td width='20%' align='right'>0.225</td>
<td width='20%' align='right'>0.034</td>
<td width='20%' align='right'>0.900</td>
<td width='20%' align='right'>0.137</td>
</tr>
<tr>
<td width='20%' align='left'>1956</td>
<td width='20%' align='right'>0.233</td>
<td width='20%' align='right'>0.036</td>
<td width='20%' align='right'>0.933</td>
<td width='20%' align='right'>0.142</td>
</tr>
<tr>
<td width='20%' align='left'>1957</td>
<td width='20%' align='right'>0.233</td>
<td width='20%' align='right'>0.036</td>
<td width='20%' align='right'>0.933</td>
<td width='20%' align='right'>0.142</td>
</tr>
<tr>
<td width='20%' align='left'>1958</td>
<td width='20%' align='right'>0.267</td>
<td width='20%' align='right'>0.041</td>
<td width='20%' align='right'>1.067</td>
<td width='20%' align='right'>0.163</td>
</tr>
<tr>
<td width='20%' align='left'>1959</td>
<td width='20%' align='right'>0.283</td>
<td width='20%' align='right'>0.043</td>
<td width='20%' align='right'>1.133</td>
<td width='20%' align='right'>0.173</td>
</tr>
<tr><td width='20%' align='left'>1960</td><td width='20%' align='right'>0.300</td><td width='20%' align='right'>0.046</td><td width='20%' align='right'>1.200</td><td width='20%' align='right'>0.183</td></tr>
<tr><td width='20%' align='left'>1961</td><td width='20%' align='right'>0.317</td><td width='20%' align='right'>0.048</td><td width='20%' align='right'>1.267</td><td width='20%' align='right'>0.193</td></tr>
<tr><td width='20%' align='left'>1962</td><td width='20%' align='right'>0.400</td><td width='20%' align='right'>0.061</td><td width='20%' align='right'>1.600</td><td width='20%' align='right'>0.244</td></tr>
<tr><td width='20%' align='left'>1963</td><td width='20%' align='right'>0.430</td><td width='20%' align='right'>0.066</td><td width='20%' align='right'>1.720</td><td width='20%' align='right'>0.262</td></tr>
<tr><td width='20%' align='left'>1964</td><td width='20%' align='right'>0.440</td><td width='20%' align='right'>0.067</td><td width='20%' align='right'>1.760</td><td width='20%' align='right'>0.268</td></tr>
<tr><td width='20%' align='left'>1965</td><td width='20%' align='right'>0.440</td><td width='20%' align='right'>0.067</td><td width='20%' align='right'>1.760</td><td width='20%' align='right'>0.268</td></tr>
<tr><td width='20%' align='left'>1966</td><td width='20%' align='right'>0.440</td><td width='20%' align='right'>0.067</td><td width='20%' align='right'>1.760</td><td width='20%' align='right'>0.268</td></tr>
<tr><td width='20%' align='left'>1967</td><td width='20%' align='right'>0.450</td><td width='20%' align='right'>0.069</td><td width='20%' align='right'>1.800</td><td width='20%' align='right'>0.274</td></tr>
<tr><td width='20%' align='left'>1968</td><td width='20%' align='right'>0.530</td><td width='20%' align='right'>0.081</td><td width='20%' align='right'>2.120</td><td width='20%' align='right'>0.323</td></tr>
<tr><td width='20%' align='left'>1969</td><td width='20%' align='right'>0.550</td><td width='20%' align='right'>0.084</td><td width='20%' align='right'>2.200</td><td width='20%' align='right'>0.335</td></tr>
<tr><td width='20%' align='left'>1970</td><td width='20%' align='right'>0.570</td><td width='20%' align='right'>0.087</td><td width='20%' align='right'>2.280</td><td width='20%' align='right'>0.348</td></tr>
<tr><td width='20%' align='left'>1971</td><td width='20%' align='right'>0.600</td><td width='20%' align='right'>0.091</td><td width='20%' align='right'>2.400</td><td width='20%' align='right'>0.366</td></tr>
<tr><td width='20%' align='left'>1972</td><td width='20%' align='right'>0.670</td><td width='20%' align='right'>0.102</td><td width='20%' align='right'>2.680</td><td width='20%' align='right'>0.409</td></tr>
<tr><td width='20%' align='left'>1973</td><td width='20%' align='right'>0.700</td><td width='20%' align='right'>0.107</td><td width='20%' align='right'>2.800</td><td width='20%' align='right'>0.427</td></tr>
<tr><td width='20%' align='left'>1974</td><td width='20%' align='right'>0.800</td><td width='20%' align='right'>0.122</td><td width='20%' align='right'>3.200</td><td width='20%' align='right'>0.488</td></tr>
<tr><td width='20%' align='left'>1975</td><td width='20%' align='right'>0.900</td><td width='20%' align='right'>0.137</td><td width='20%' align='right'>3.600</td><td width='20%' align='right'>0.549</td></tr>
<tr><td width='20%' align='left'>1976</td><td width='20%' align='right'>1.040</td><td width='20%' align='right'>0.159</td><td width='20%' align='right'>4.160</td><td width='20%' align='right'>0.634</td></tr>
<tr><td width='20%' align='left'>1977</td><td width='20%' align='right'>1.120</td><td width='20%' align='right'>0.171</td><td width='20%' align='right'>4.480</td><td width='20%' align='right'>0.683</td></tr>
<tr><td width='20%' align='left'>1978</td><td width='20%' align='right'>1.270</td><td width='20%' align='right'>0.194</td><td width='20%' align='right'>5.080</td><td width='20%' align='right'>0.774</td></tr>
<tr><td width='20%' align='left'>1979</td><td width='20%' align='right'>1.490</td><td width='20%' align='right'>0.227</td><td width='20%' align='right'>5.960</td><td width='20%' align='right'>0.909</td></tr>
<tr><td width='20%' align='left'>1980</td><td width='20%' align='right'>1.670</td><td width='20%' align='right'>0.255</td><td width='20%' align='right'>6.680</td><td width='20%' align='right'>1.018</td></tr>
<tr><td width='20%' align='left'>1981</td><td width='20%' align='right'>1.870</td><td width='20%' align='right'>0.285</td><td width='20%' align='right'>7.480</td><td width='20%' align='right'>1.14</td></tr>
<tr><td width='20%' align='left'>1982</td><td width='20%' align='right'>2.060</td><td width='20%' align='right'>0.314</td><td width='20%' align='right'>8.240</td><td width='20%' align='right'>1.256</td></tr>
<tr><td width='20%' align='left'>1983</td><td width='20%' align='right'>2.280</td><td width='20%' align='right'>0.348</td><td width='20%' align='right'>9.120</td><td width='20%' align='right'>1.39</td></tr>
<tr><td width='20%' align='left'>1984</td><td width='20%' align='right'>2.470</td><td width='20%' align='right'>0.377</td><td width='20%' align='right'>9.880</td><td width='20%' align='right'>1.506</td></tr>
<tr><td width='20%' align='left'>1985</td><td width='20%' align='right'>2.600</td><td width='20%' align='right'>0.396</td><td width='20%' align='right'>10.400</td><td width='20%' align='right'>1.585</td></tr>
<tr><td width='20%' align='left'>1986</td><td width='20%' align='right'>2.680</td><td width='20%' align='right'>0.409</td><td width='20%' align='right'>10.720</td><td width='20%' align='right'>1.634</td></tr>
<tr><td width='20%' align='left'>1987</td><td width='20%' align='right'>2.760</td><td width='20%' align='right'>0.421</td><td width='20%' align='right'>11.040</td><td width='20%' align='right'>1.683</td></tr>
<tr><td width='20%' align='left'>1988</td><td width='20%' align='right'>2.920</td><td width='20%' align='right'>0.445</td><td width='20%' align='right'>11.680</td><td width='20%' align='right'>1.781</td></tr>
<tr><td width='20%' align='left'>1989</td><td width='20%' align='right'>3.030</td><td width='20%' align='right'>0.462</td><td width='20%' align='right'>12.120</td><td width='20%' align='right'>1.848</td></tr>
<tr><td width='20%' align='left'>1990</td><td width='20%' align='right'>3.140</td><td width='20%' align='right'>0.479</td><td width='20%' align='right'>12.560</td><td width='20%' align='right'>1.915</td></tr>
<tr><td width='20%' align='left'>1991</td><td width='20%' align='right'>3.120</td><td width='20%' align='right'>0.476</td><td width='20%' align='right'>12.480</td><td width='20%' align='right'>1.903</td></tr>
<tr><td width='20%' align='left'>1992</td><td width='20%' align='right'>3.533</td><td width='20%' align='right'>0.539</td><td width='20%' align='right'>14.130</td><td width='20%' align='right'>2.154</td></tr>
<tr><td width='20%' align='left'>1993</td><td width='20%' align='right'>3.664</td><td width='20%' align='right'>0.559</td><td width='20%' align='right'>14.655</td><td width='20%' align='right'>2.234</td></tr>
<tr><td width='20%' align='left'>1994</td><td width='20%' align='right'>3.765</td><td width='20%' align='right'>0.574</td><td width='20%' align='right'>15.060</td><td width='20%' align='right'>2.296</td></tr>
<tr><td width='20%' align='left'>1995</td><td width='20%' align='right'>3.832</td><td width='20%' align='right'>0.584</td><td width='20%' align='right'>15.328</td><td width='20%' align='right'>2.337</td></tr>
<tr><td width='20%' align='left'>1996</td><td width='20%' align='right'>3.915</td><td width='20%' align='right'>0.597</td><td width='20%' align='right'>15.661</td><td width='20%' align='right'>2.388</td></tr>
<tr><td width='20%' align='left'>1997</td><td width='20%' align='right'>3.974</td><td width='20%' align='right'>0.606</td><td width='20%' align='right'>15.896</td><td width='20%' align='right'>2.423</td></tr>
<tr><td width='20%' align='left'>1998</td><td width='20%' align='right'>4.019</td><td width='20%' align='right'>0.613</td><td width='20%' align='right'>16.076</td><td width='20%' align='right'>2.451</td></tr>
<tr><td width='20%' align='left'>1999</td><td width='20%' align='right'>4.102</td><td width='20%' align='right'>0.625</td><td width='20%' align='right'>16.410</td><td width='20%' align='right'>2.502</td></tr>
<tr><td width='20%' align='left'>2000</td><td width='20%' align='right'>4.193</td><td width='20%' align='right'>0.639</td><td width='20%' align='right'>16.771</td><td width='20%' align='right'>2.557</td></tr>
<tr><td width='20%' align='left'>2001</td><td width='20%' align='right'>4.318</td><td width='20%' align='right'>0.658</td><td width='20%' align='right'>17.274</td><td width='20%' align='right'>2.633</td></tr>
<tr><td width='20%' align='left'>2002</td><td width='20%' align='right'>4.484</td><td width='20%' align='right'>0.684</td><td width='20%' align='right'>17.935</td><td width='20%' align='right'>2.734</td></tr>
<tr><td width='20%' align='left'>2003</td><td width='20%' align='right'>4.657</td><td width='20%' align='right'>0.710</td><td width='20%' align='right'>18.629</td><td width='20%' align='right'>2.840</td></tr>
<tr><td width='20%' align='left'>2004</td><td width='20%' align='right'>4.834</td><td width='20%' align='right'>0.737</td><td width='20%' align='right'>19.334</td><td width='20%' align='right'>2.948</td></tr>
<tr><td width='20%' align='left'>2005</td><td width='20%' align='right'>4.921</td><td width='20%' align='right'>0.750</td><td width='20%' align='right'>19.684</td><td width='20%' align='right'>3.001</td></tr>
<tr><td width='20%' align='left'>2006</td><td width='20%' align='right'>5.029</td><td width='20%' align='right'>0.767</td><td width='20%' align='right'>20.116</td><td width='20%' align='right'>3.067</td></tr>
<tr><td width='20%' align='left'>2007</td><td width='20%' align='right'>5.216</td><td width='20%' align='right'>0.795</td><td width='20%' align='right'>20.865</td><td width='20%' align='right'>3.181</td></tr>
<tr><td width='20%' align='left'>2008</td><td width='20%' align='right'>5.449</td><td width='20%' align='right'>0.831</td><td width='20%' align='right'>21.794</td><td width='20%' align='right'>3.323</td></tr>
<tr><td width='20%' align='left'>2009</td><td width='20%' align='right'>5.487</td><td width='20%' align='right'>0.836</td><td width='20%' align='right'>21.947</td><td width='20%' align='right'>3.346</td></tr>
<tr><td width='20%' align='left'>2010</td><td width='20%' align='right'>5.491</td><td width='20%' align='right'>0.837</td><td width='20%' align='right'>21.964</td><td width='20%' align='right'>3.348</td></tr>
<tr><td width='20%' align='left'>2011</td><td width='20%' align='right'>5.615</td><td width='20%' align='right'>0.856</td><td width='20%' align='right'>22.461</td><td width='20%' align='right'>3.424</td></tr>
<tr><td width='20%' align='left'>2012</td><td width='20%' align='right'>5.675</td><td width='20%' align='right'>0.865</td><td width='20%' align='right'>22.702</td><td width='20%' align='right'>3.461</td></tr>
<tr><td width='20%' align='left'>2013</td><td width='20%' align='right'>5.697</td><td width='20%' align='right'>0.869</td><td width='20%' align='right'>22.789</td><td width='20%' align='right'>3.474</td></tr>
<tr><td width='20%' align='left'>2014</td><td width='20%' align='right'>5.699</td><td width='20%' align='right'>0.869</td><td width='20%' align='right'>22.795</td><td width='20%' align='right'>3.475</td></tr>
<tr><td width='20%' align='left'>2015</td><td width='20%' align='right'>5.667</td><td width='20%' align='right'>0.864</td><td width='20%' align='right'>22.669</td><td width='20%' align='right'>3.456</td></tr>
<tr><td width='20%' align='left'>2016</td><td width='20%' align='right'>5.690</td><td width='20%' align='right'>0.868</td><td width='20%' align='right'>22.762</td><td width='20%' align='right'>3.470</td></tr>
<tr><td width='20%' align='left'>2017</td><td width='20%' align='right'>5.695</td><td width='20%' align='right'>0.868</td><td width='20%' align='right'>22.778</td><td width='20%' align='right'>3.473</td></tr>
<tr><td width='20%' align='left'>2018</td><td width='20%' align='right'>5.744</td><td width='20%' align='right'>0.876</td><td width='20%' align='right'>22.975</td><td width='20%' align='right'>3.503</td></tr>
<tr><td width='20%' align='left'>2019</td><td width='20%' align='right'>5.763</td><td width='20%' align='right'>0.879</td><td width='20%' align='right'>23.053</td><td width='20%' align='right'>3.514</td></tr>
</table>
<p>Sources:</p>
<p>De 1954 à 1989, j’ai utilisé le très utile <a href="https://gallica.bnf.fr/ark:/12148/bpt6k6243943k/f297.item" target="_blank"><em>Annuaire rétrospectif de la France — séries longues 1948-1988</em></a> qui nous donne les prix de la baguette en moyenne annuelle, à Paris et dans l’agglomération parisienne, de 1954 à 1989. Toutes les données sont en nouveaux francs mais le poids de la baguette varie de 300 grammes jusqu’en 1961 à 250 grammes ensuite.</p>
<p>Pour les années 1990 et 1991, j’ai utilisé l’<a href="https://gallica.bnf.fr/ark:/12148/bpt6k6244234h/f435.item" target="_blank"><em>Annuaire statistique de la France 1991-92</em></a>. Les données sont toujours des moyennes annuelles et ne concernent encore que Paris et l’agglomération parisienne. Le poids d’une baguette est de 250 grammes.</p>
<p>Enfin, depuis 1992, l’Insee met à jour <a href="https://www.insee.fr/fr/statistiques/serie/000442423" target="_blank">une série</a> chronologique mensuelle du prix de la baguette exprimé en euros pour 1 kilogramme de pain en France métropolitaine. J’ai simplement calculé la moyenne annuelle de ces données. Les données de 2019 sont arrêtées au mois de septembre.</p>
Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com291tag:blogger.com,1999:blog-6602717398228748861.post-42665504665333420752018-12-23T20:55:00.000+01:002018-12-23T20:55:33.613+01:00Cheval de fer, acte II<p><em>La première partie <a href="http://ordrespontane.blogspot.com/2013/04/cheval-de-fer-acte-i.html">est ici.</a></em></p>
<p>Quand John Kennedy s’y était installé au tout début des années 1790, Manchester n’était encore qu’un gros bourg de 50 000 habitants et on venait tout juste d’installer la première machine à vapeur dans une filature de coton [1]. Aujourd’hui, trente ans plus tard, il avait du mal à reconnaitre sa ville d’adoption : on y comptait désormais plus de 200 machines à filer, la plupart animées par les fameux moteur à vapeur de <i>Boulton & Watt</i>, et la population atteignait maintenant les 125 000 âmes. S’il y a bien une ville d’Angleterre qui a vu son destin basculer avec la révolution industrielle, c’est Manchester. En quelques décennies, cette bourgade sans histoire était devenue la ville la plus industrialisée du royaume — et donc du monde — et ce, principalement grâce à son industrie textile pour ne pas dire cotonnière [2]. Kennedy est bien placé pour le savoir : des filatures de coton, son associé et lui en possèdent trois sur Union Street — d’où l’origine de leurs fortunes.</p>
<p>Naturellement, le coton ne pousse pas au pied des Pennines. Si le Lancashire est une région idéale pour y installer les moteurs à vapeur qui font tourner les <a href="http://en.wikipedia.org/wiki/Spinning_mule"><i>spinning mules</i></a>, la matière première, elle, doit être importée des colonies de l’Empire : l’Inde d’abord, puis les Caraïbes et — bien sûr — les États-Unis. C’est-à-dire que pour faire tourner l’industrie manchestérienne et, incidemment, exporter les produits finis il faut un port. Or, il se trouve que le port le plus proche est situé là où la Mersey se jette dans la mer d’Irlande : c’est Liverpool. C’est ainsi qu’en ce début du XIXe siècle le sort de ces deux villes va se trouver inextricablement lié : en 1790, le nombre de balles de coton qui débarquaient à Liverpool pour être acheminées à Manchester dépassait péniblement la centaine ; en 1820, on en comptera 458 693 soit à peu près 104 000 tonnes [3].</p>
<p>Nous voilà donc avec deux villes et au milieu, un problème. Un problème d’une grosse cinquantaine de kilomètres : comment acheminer matières premières et produits finis entre le port de Liverpool et les usines de Manchester ? Au siècle précédent, on avait bien aménagé deux canaux — la Mersey & Irwell Navigation (1724-34) et le canal de Bridgewater (1761) — mais avec l’explosion du trafic, c’est derniers se sont rapidement révélés insuffisants : les industriels de Manchester et les commerçants de Liverpool avaient le choix entre faire la queue et payer fort cher ou passer par la route et payer encore plus cher. Bref, ça râlait sec et parmi ceux qui râlaient le plus fort, il y avait Joseph Sandars, un riche marchand de blé de Liverpool, qui avait fait savoir à qui voulait l’entendre qu’il financerait tout projet de nature à régler le problème.</p>
<figure data-orig-width="500" data-orig-height="243" data-orig-src="https://66.media.tumblr.com/869d03aa96b7b4fcaab4182e4ed84c0a/tumblr_inline_ncntx4vsR91rr84ud.png" class="tmblr-full"><img src="https://66.media.tumblr.com/d86ca467055481d874e2cd642b5799e0/tumblr_inline_pk0aegWmzP1rr84ud_540.png" alt="image" data-orig-width="500" data-orig-height="243" data-orig-src="https://66.media.tumblr.com/869d03aa96b7b4fcaab4182e4ed84c0a/tumblr_inline_ncntx4vsR91rr84ud.png"></figure><p><i>Le tracé de la ligne</i></p>
<p>Or, William James a une solution. Depuis que Richard Trevithick <a href="http://ordrespontane.blogspot.fr/2013/04/cheval-de-fer-acte-i.html">a démontré</a> la faisabilité technique de la chose en 1804, il est intimement convaincu que l’idée qui consiste à faire tirer des wagons sur des rails par une machine à vapeur est promise à un immense avenir. D’ailleurs, ça fait maintenant une bonne dizaine d’années que les mines du nord de l’Angleterre mettent leurs shetlands à la retraite et les remplacent par les premiers modèles de locomotives [4] et un certain George Stephenson, l’ingénieur résident [5] de la mine de Killingworth (au nord de Newcastle), passe même pour être le plus grand spécialiste de ce genre de machines. Mais James voit plus loin : pour lui, le train a vocation à sortir des mines pour devenir une industrie à part entière ; ça fait quelques années qu’il prospecte un peu partout pour trouver un terrain d’application et il vient justement de signer un accord de distribution avec le fameux Stephenson.</p>
<p>Alors quand les déclarations de Sandars parviennent à ses oreilles, James saute sur l’occasion et fonce droit à Liverpool : et si on construisait une ligne de chemin de fer entre Liverpool et Manchester ? Nous sommes en 1822 et James va décrocher le gros lot : non seulement Sandars est immédiatement séduit par l’idée mais il va rapidement réunir autour de lui un premier tour de table constitué de marchands et d’industriels des deux villes prêts à se lancer dans le projet — au nombre desquels, bien sûr, notre ami John Kennedy. Le 20 mai 1824, Sandars, Kennedy et leurs associés forment la <i>Liverpool & Manchester Railway Company</i> ; c’est le maire de Liverpool lui-même qui en deviendra le premier président et c’est George Stephenson qui en sera nommé l’ingénieur en chef [6].</p>
<p>Mais avant de poser le premier rail, il est une formalité à laquelle ils ne peuvent échapper : ils doivent obtenir une autorisation du Parlement britannique. À l’époque, ces choses-là prennent la forme d’une pétition dans laquelle les actionnaires justifient de l’utilité du projet dans lequel ils se lancent ; pétition qui peut faire l’objet d’une opposition si une tierce partie voit un inconvénient à ce que ledit projet voit le jour. Et de l’opposition ils vont en avoir. D’abord, il y a les propriétaires des canaux qui voient naturellement venir d’un très mauvais œil cette concurrence inattendue et, parmi eux, le Marquis de Stafford qui a hérité des revenus du canal de Bridgewater et se trouve être, accessoirement, l’homme le plus riche du monde. Ensuite et comme si ça ne suffisait pas, les contes de Derby et de Sefton vont également rentrer en guerre contre le projet au motif qu’ils ne souhaitent pas voir de vulgaires manants, fussent-ils propulsés à la vapeur, traverser leurs propriétés.</p>
<figure data-orig-width="500" data-orig-height="471" data-orig-src="https://66.media.tumblr.com/38d756e3579a1b76d24600cb7fec56dd/tumblr_inline_ncntzvW0nF1rr84ud.png" class="tmblr-full"><img src="https://66.media.tumblr.com/0e837b63a5473feb6c08d4ca6c46d4ef/tumblr_inline_pk0aegHFq91rr84ud_540.png" alt="image" data-orig-width="500" data-orig-height="471" data-orig-src="https://66.media.tumblr.com/38d756e3579a1b76d24600cb7fec56dd/tumblr_inline_ncntzvW0nF1rr84ud.png"></figure><p><i>Une reproduction de la Rocket de Stephenson</i></p>
<p>La bataille juridique va durer dix-sept mois et coûter, selon les sources de l’époque, pas moins de 70 000 livres aux deux parties (à une époque où un anglais moyen gagnait à peine plus 30 livres <i>par an</i>). Les opposants vont contester un par un tous les aspects techniques du projet, invoquer l’intérêt général à toutes les sauces, se livrer à des considérations esthétiques sur les locomotives et même suggérer que le corps humain n’était pas capable d’encaisser de telles accélérations [7]. Bref, ils vont parler de tout sauf de leurs véritables motivations et faire un tel étalage de mauvaise foi que les deux chambres, finalement, avaliseront le projet en avril 1826.</p>
<p>Le 29 mai 1826 se tient la première réunion générale des souscripteurs en vue du lancement des travaux et il est une chose qui est très claire dans l’esprit de tous : la ligne Liverpool-Manchester est le plus gigantesque projet industriel jamais entrepris en Angleterre et donc dans le monde. Il va falloir acheter les terrains, creuser des montagnes (le mont Olive), élever des ponts, percer des tunnels (notamment sous Liverpool), trouver un moyen de traverser les tourbières de Chat Moss (projet réputé impossible à l’époque), poser des rails, construire les ouvrages d’art, acheter wagons et locomotives et, comme toujours, garder un peu de trésorerie pour démarrer. Au total et selon les estimations les plus fiables que votre serviteur ait trouvé, ils en ont eu pour plus de 1,2 millions de livres sterling de l’époque. Pour un anglais moyen, ça représentait 40 745 années de revenus.</p>
<p>Il faut bien mesurer que jusqu’à la fin du XVIIIe siècle, ce qui limitait la taille d’un projet c’était la fortune personnelle de celui qui l’entreprenait. Typiquement, le canal de Bridgewater avait été construit par le duc éponyme ; lequel avait tout financé sur ces propres deniers. Dans ce monde-là, la ligne Liverpool-Manchester n’aurait jamais pu voir le jour pour la bonne et simple raison que personne n’était assez riche pour mettre une telle somme sur la table d’un projet aussi risqué. Or, justement, ce qui a changé en ce début du XIXe siècle, c’est le développement des marchés financiers. Pour financer la ligne, les directeurs de la compagnie vont vendre 5 100 actions de 100 livres à plus de 300 actionnaires puis, au travers de plusieurs augmentations de capital, collecter encore près de 300 000 livres avec des actions de 25 livres et enfin, emprunter les 400 000 livres qui manquaient encore pour boucler le budget.</p>
<p>Ce n’est pas un hasard si c’est en Angleterre qu’un tel projet a pu voir le jour : c’est l’Angleterre, bien avant tous les autres pays du monde, qui a créé le cadre institutionnel qui a fait en sorte qu’un homme puisse avoir intérêt à investir dans son outil de travail. C’est en Angleterre que ce simple principe de droit a permis le développement de ce que nous appelons aujourd’hui la révolution industrielle : le moment de l’histoire humaine où, pour la première fois, un fils pouvait espérer vivre mieux que son père. Et c’est logiquement en Angleterre qu’on a vu émerger la première des classes moyennes, une épargne et donc une capacité de financement ; capacité de financement qui a permis à un projet aussi fou que la Liverpool & Manchester Railway Company d’exister.</p>
<p>L’ouverture de la ligne a eu lieu le 15 septembre 1830 et ce fût immédiatement un immense succès mais pas pour les raisons escomptées : là où ses promoteurs espéraient transporter du fret, ce sont finalement les passagers qui ont fait les beaux jours de la compagnie [8]. De fait, les actionnaires de la ligne se verseront pendant des années des dividendes mirifiques de près de 10% du capital investis. Mais là n’est pas l’essentiel : si la Liverpool & Manchester est restée dans l’histoire comme l’acte de naissance de l’industrie ferroviaire, ce n’est pas parce qu’elle a transporté plus de gens que de coton, ce n’est pas non plus à cause de ses dimensions ni parce que c’était une entreprise indépendante — la <i>Stockton & Darlington Railway</i>, ouverte en 1825, mériterait alors les honneurs de l’histoire. Non, si la Liverpool & Manchester est si importante, au-delà même du train, c’est parce qu’elle a prouvé que les techniques de financement moderne avaient repoussé les limites du possible ; le capitalisme moderne était né.</p>
<figure data-orig-width="500" data-orig-height="364" data-orig-src="https://66.media.tumblr.com/e5a3d79fe2b89dcf99cad5e95ddcdb05/tumblr_inline_ncntz0fBPF1rr84ud.jpg" class="tmblr-full"><img src="https://66.media.tumblr.com/ecd1e8c65e690f68a3131346320ec2c6/tumblr_inline_pk0aehqV5W1rr84ud_540.jpg" alt="image" data-orig-width="500" data-orig-height="364" data-orig-src="https://66.media.tumblr.com/e5a3d79fe2b89dcf99cad5e95ddcdb05/tumblr_inline_ncntz0fBPF1rr84ud.jpg"></figure><p><i>Station de Liverpool, le 15 septembre 1830</i></p>
<p>--- <br>[1] La <i>Piccadilly Mill</i> de Peter Drinkwater construite en 1789. <br>[2] On estime que, vers 1830, le Lancashire produisait 85% du coton manufacturé à l’échelle mondiale. <br>[3] Et c’est loin d’être fini : en 1837, on en dénombrera 1 033 773 soit environ 235 000 tonnes. <br>[4] John Blenkinsop et Matthew Murray à Middleton en 1812, Christopher Blackett et William Hedley à Wylam en 1813 (la <i>Puffing Billy</i>), George Stephenson et sa <i>Blücher</i> dans la mine de Killingworth en 1814. <br>[5] L’ingénieur <i>résident</i> et un salarié de la mine chargé de concevoir les machines qu’elle utilise ; à l’époque, on faisait aussi appel à des cabinets d’ingénieurs dont les plus célèbres étaient <i>Boulton & Watt</i> (encore eux) et <i>Fenton, Murray & Wood</i> (qui sont intervenus à Middleton, voir note précédente). <br>[6] Malheureusement pour lui, James a fait faillite entre temps ce qui, à l’époque, vous amenait droit à la case prison : raison pour laquelle il est contraint de sortir du projet. <br>[7] En l’occurrence une vingtaine de kilomètres à l’heure — ce qui correspond en gros à la vitesse d’un cheval au galop. <br>[8] Les propriétaires des canaux, finalement déboutés par le Parlement, se sont empressés de baisser leurs tarifs.</p>Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com109tag:blogger.com,1999:blog-6602717398228748861.post-52343261649773390152018-12-10T17:28:00.003+01:002018-12-13T10:15:21.866+01:00La loi Pompidou-Giscard (encore)<p>« Un mensonge fera le tour du monde avant que la vérité ait eu le temps de mettre ses bottes. »
<br/>— Charles Spurgeon</p>
<p>« Le Trésor public ne peut être présentateur de ses propres Effets à l’escompte de la Banque de France. »
<br/>— Loi sur la Banque de France du 3 janvier 1973</p>
<p>Depuis quelques années, cet article de la loi N°73-7 sur la Banque de France du 3 janvier 1973, l’<a href="https://www.banque-france.fr/sites/default/files/arrete.pdf#page=375" target="_blank">article 25</a> pour être précis, fait l’objet d’une polémique alimentée par les extrêmes de droite comme de gauche. Pour ne citer que les principaux : Nicolas Dupont-Aignan, Marine le Pen, Alain Soral, François Asselineau, Jacques Cheminade et Jean-Luc Mélenchon estiment tous, à les écouter, que c’est cette simple phrase qui serait à l’origine de notre dette publique — laquelle serait dès lors illégitime.</p>
<p>Leurs analyses, essentiellement convergentes, peuvent se résumer comme suit : par cet article, la loi de 1973 interdit à l’État de se financer gratuitement (ou quasi-gratuitement) auprès de la Banque de France. Dès lors, l’État n’a eu d’autre choix que de se financer sur les marchés financiers (ou auprès des banques) et donc de payer des intérêts — lesquels expliquent le niveau actuel de la dette publique. À ce premier point, certains n’hésitent pas à rajouter que, ce faisant, Georges Pompidou et Valéry Giscard d’Estaing ont sciemment vendu les intérêts de la France aux banques — raison pour laquelle cette loi est appelée <em>loi Pompidou-Giscard</em> (ou <em>Pompidou-Giscard-Rothschild</em> en référence au fait que M. Pompidou a travaillé pour la Banque Rothschild [1].)</p>
<p>J’ai déjà eu l’occasion de le <a href="http://ordrespontane.blogspot.com/2014/07/la-loi-de-1973.html">dire</a> <a href="http://ordrespontane.blogspot.com/2014/07/la-loi-de-1973-shorter.html">ici</a> mais <a href="https://twitter.com/ordrespontane/status/1071731726798311425" target="_blank">il faut manifestement le répéter</a> : c’est absolument, irrémédiablement et sans l’ombre d’un doute faux. Entendez-moi bien : il n’y a même pas de débat possible. Tout ce que racontent les personnes susmentionnées à propos de cette loi et de ses présumées conséquences est au mieux la preuve de leur totale incompétence, au pire, un tissu de mensonges.</p>
<h5>La vieille dame poussiéreuse</h5>
<p>Lorsqu’il présente ce projet de loi <a href="http://www.senat.fr/comptes-rendus-seances/5eme/pdf/1972/11/s19721102_1895_1934.pdf#page=2" target="_blank">devant le Sénat</a> le 2 novembre 1972, Valéry Giscard d’Estaing, ministre de l’économie et des finances, est assez loin de déclencher une révolution : « La réforme qui vous est proposée aujourd’hui, dit-il, ne vise pas et ne prétend pas bouleverser le fonctionnement de la Banque de France. Il s’agit essentiellement d’une œuvre de codification, de mise à jour et de clarification qui vise à doter l’institut d’émission de statuts adaptés à la réalité financière actuelle et à l’évolution de nos pratiques contemporaines. »</p>
<p>De fait, les statuts de cette vieille dame datent de 1936 — de la loi du 24 juillet 1936, nous en reparlerons — et depuis, le moins que l’on puisse dire, c’est que de l’eau a coulé sous les ponts : une guerre mondiale, une nationalisation (loi du 2 décembre 1945 [2]), les accords de Bretton Woods qui ont vécu, le Serpent monétaire européen qui commence à peine à fonctionner et, naturellement, une évolution profonde des pratiques des banquiers centraux — au moment où Giscard d’Estaing s’exprime, la Banque de France n’utilise déjà plus la technique de l’escompte que de façon marginale et lui préfère depuis février 1971 les opérations dites d’<em>open-market</em>. Bref, un bon coup de dépoussiérage s’impose.</p>
<p>Quid de l’article 25 ? Eh bien lors de la <a href="http://www.senat.fr/comptes-rendus-seances/5eme/pdf/1972/11/s19721102_1895_1934.pdf" target="_blank">première lecture au Sénat</a> (2 novembre 1972) et de la <a href="http://archives.assemblee-nationale.fr/4/cri/1972-1973-ordinaire1/067.pdf" target="_blank">première lecture</a> à <a href="http://archives.assemblee-nationale.fr/4/cri/1972-1973-ordinaire1/068.pdf" target="_blank">l’Assemblée Nationale</a> (28 novembre 1972), on n’en trouve pas la moindre trace ou, plutôt, il y a bien un article 25 mais ce n’est pas celui qui nous intéresse.</p>
<h5>Une sage précaution</h5>
<p>Ce n’est que lors de la <a href="http://www.senat.fr/comptes-rendus-seances/5eme/pdf/1972/12/s19721214_3087_3126.pdf#page=10" target="_blank">seconde lecture au Sénat</a>, le 14 décembre 1972, qu’un amendement propose de compléter l’article 29 en y précisant que « le Trésor public ne peut présenter ses propres effets au réescompte de l’institut d’émission. » Cet amendement, première apparition du fameux article, est le fait de M. Yvon Coudé du Foresto, sénateur vétéran et par ailleurs rapporteur général de la commission des finances.</p>
<p>L’intéressé s’explique : « Je ne suis pas du tout hostile au texte de l’Assemblée nationale, mais notre attention a été attirée sur le fait qu’il serait possible, par le biais de la présentation de bons du Trésor au réescompte de l’institut d'émission, de tourner la législation sur les émissions de monnaie ou de quasi-monnaie.
<br/>« C’est la raison pour laquelle nous avons tenu à préciser que le Trésor public ne peut présenter ses propres effets au réescompte de l’institut d’émission. Je pense que c’est une sage précaution et je serai certainement beaucoup plus intransigeant au sujet de cet amendement que sur les autres, monsieur le secrétaire d’État. »</p>
<p>Jean Taittinger, secrétaire l’État chargé du budget qui représente le gouvernement, répond : « Cet amendement énonce une règle relative à la politique de gestion de la trésorerie publique. Or, il s’agit d’un projet de loi sur la Banque de France et non sur le Trésor. Rappeler cette règle-là et pas d’autres pourrait laisser penser qu’il y a un problème ou un risque dans le domaine considéré, ce qui ne semble pas le cas.
<br/>« L’amendement laisserait par ailleurs supposer que la Banque pourrait accepter de se prêter à la pratique que l’on condamne, ce qui n’est pas flatteur pour elle. »
<br/>« Cependant, dans un souci de conciliation, j’accepte volontiers l’amendement de la commission. »</p>
<p>Cette réponse de M. Taittinger permet de souligner deux choses importantes : d’une part, elle confirme que cette disposition n’est pas d’origine gouvernementale puisque le représentant du gouvernement se contente de ne pas s’y opposer <em>dans un souci de conciliation</em> — bref, MM. Giscard d’Estaing et Pompidou n’y sont pour rien. D’autre part, et c’est le plus important, le secrétaire d’État laisse très clairement entendre que le fait, pour le Trésor, de présenter ses propres effets à l’escompte de la Banque de France et une pratique proscrite et même franchement honteuse.</p>
<h5>Rien de nouveau</h5>
<p>Et pour cause : c’est effectivement une pratique interdite depuis au moins le 24 juillet 1936 et la loi <em>Tendant à modifier et à compléter les Lois et statuts qui régissent la Banque de France</em>. Dans son <a href="https://www.banque-france.fr/sites/default/files/arrete.pdf#page=209" target="_blank">article 13</a>, on peut lire « tous les Effets de la dette flottante émis par le Trésor public et venant à échéance dans un délai de trois mois au maximum sont admis sans limitation au réescompte de l’Institut d’Émission, sauf au profit du Trésor public. » Signé par Albert Lebrun, président de la République, Léon Blum, président du Conseil et Vincent Auriol, ministre des finances.</p>
<p>De fait, en 1972, personne n’y trouve rien à redire et l’amendement de M. Coudé du Foresto est adopté dans l’indifférence générale.</p>
<p>De <a href="http://archives.assemblee-nationale.fr/4/cri/1972-1973-ordinaire1/086.pdf#page=4" target="_blank">retour à l’Assemblée Nationale</a> le 18 décembre 1972, Jean Capelle, député UDR de la 2e circonscription de la Dordogne, en modifie légèrement le texte : « Le Trésor public ne peut être présentateur de ses propres effets à l’escompte de la Banque de France » et propose d’en faire un article à part entière à insérer après l’article 24. Guy Sabatier, rapporteur général de la commission des finances, et Jean Taittinger, secrétaire d’État chargé du budget, y sont favorables. L’amendement est adopté.</p>
<p>le jour même, enfin, lors d’une <a href="http://www.senat.fr/comptes-rendus-seances/5eme/pdf/1972/12/s19721218_3183_3210.pdf#page=8" target="_blank">troisième lecture au Sénat</a> : M. Coudé du Foresto s’étonne avec humour de cette modification qu’il pense être d’origine gouvernementale. Jean Taittinger lui explique que non. On passe à autre chose.</p>
<p>Voilà d’où vient, sources à l’appui, ce fameux article 25 : c’est une simple mesure de précaution introduite par la commission des finances du Sénat pour réinscrire dans le marbre de la loi un principe déjà admis par tout le monde depuis au moins 1936. Et pour cause…</p>
<h5>Escompter des effets</h5>
<p>Le fait est que « le Trésor public ne peut être présentateur de ses propres Effets à l’escompte de la Banque de France, » pour la plupart des gens, c’est <a href="https://twitter.com/ordrespontane/status/1071731397981859840" target="_blank">parfaitement incompréhensible</a>. Rassurez-vous, ça n’a rien d’anormal : des générations entières ont vécu de longues et saines vies sans avoir la moindre idée de ce signifie présenter des <em>effets</em> à l’<em>escompte</em> d’une banque. Sauf que là, dans le contexte, une rapide explication s’impose.</p>
<p>L’escompte, pour faire simple, c’est une antique technique bancaire qui permet aux entreprises de se procurer de la trésorerie auprès des banques en leur refourguant une créance — typiquement une créance sur un client. On ne parle donc pas de financement à long terme mais de gestion de trésorerie. Quant aux « Effets » du Trésor évoqués par l’article 25, ce sont des bons du Trésor — c’est-à-dire des obligations émises par le Trésor ; parce que oui, au risque d’en étonner quelques-uns, l’État empruntait de l’argent sur les marchés financiers bien avant 1973.</p>
<p>Et donc, « le Trésor public ne peut être présentateur de ses propres Effets à l’escompte de la Banque de France », ça signifie que le Trésor ne peut pas émettre une dette sur lui-même et s’en servir pour présenter cette dernière à l’escompte de la Banque de France. En gros, c’est comme si vous écriviez une reconnaissance de dettes à vous-même et alliez voir votre banque pour lui demander de vous racheter ce papier. C’est-à-dire qu’on ne fait ici que ré-interdire un bidouillage parfaitement malsain ; bidouillage qui, semble-t-il et comme le rappelait M. Coudé du Foresto, aurait permis au Trésor fût un temps de « tourner la législation sur les émissions de monnaie ou de quasi-monnaie. »</p>
<h5>L’article 19</h5>
<p>Et ce, d’autant plus que, contrairement à ce que racontent les Dupont-Aignan, le Pen, Mélenchon et autres Asselineau, cette loi n’interdit absolument pas au Trésor d’emprunter — y compris gratuitement — de l’argent à la Banque Centrale. Une simple lecture du texte intégral de la loi permet de découvrir <a href="https://www.banque-france.fr/sites/default/files/arrete.pdf#page=374" target="_blank">l’article 19</a> qui stipule que « les conditions dans lesquelles l’État peut obtenir de la Banque des avances et des prêts sont fixées par des Conventions passées entre le Ministre de l’Économie et des Finances et le Gouverneur, autorisé par délibération du Conseil général. Ces Conventions doivent être approuvées par le Parlement. »</p>
<p>De fait, la convention du 17 septembre 1973, passée entre le ministre de l’économie et des finances (Valéry Giscard d’Estaing) et le gouverneur de la Banque de France (Olivier Wormser) et approuvée par la <a href="http://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000000875643" target="_blank">loi 73-1121 du 21 décembre 1973</a> fixe les modalités des concours de trésorerie apportés par la banque centrale au Trésor : ce dernier peut emprunter jusqu’à 20,5 milliards de francs dont 10,5 milliards gratuitement et 10 milliards sur lesquels il paiera des intérêts très faibles [3].</p>
<p>Mais à quoi correspond ce montant ? Pourquoi limiter les prêts de la banque centrale au Trésor à 20,5 milliards de francs ? La réponse est extrêmement simple : c’est tout simplement l’officialisation de ce qui existait avant. C’est ainsi que le rapporteur général (Maurice Papon !) <a href="http://archives.assemblee-nationale.fr/5/cri/1973-1974-ordinaire1/096.pdf#page=6" target="_blank">le présente</a> et c’est effectivement la conclusion à laquelle on arrive en <a href="http://piketty.pse.ens.fr/files/Monnet2012.pdf#page=169" target="_blank">étudiant les séries historiques</a> : les 10,5 milliards gratuits c’est simplement la limite précédente des avances directes de la Banque de France à l'État et les 10 milliards par chers correspondent à une évaluation du maximum de ce que le Trésor empruntait de façon opaque.</p>
<p>Accessoirement, la loi prévoit une règle qui permette de faire évoluer ses plafonds. Dans <a href="https://gallica.bnf.fr/ark:/12148/bpt6k6495927z/f93.image" target="_blank">son compte rendu de 1974</a>, par exemple, la Banque de France précise que le plafond des concours gratuits au Trésor est passé à 13,7 milliards de francs le 31 janvier 1974. Le 23 janvier 1992, quelques jours avant la signature de l’accord de Maastricht qui mettra un terme définitif au financement des États par leurs banques centrales, il <a href="https://gallica.bnf.fr/ark:/12148/bpt6k6496701b/f230.image" target="_blank">était encore porté</a> à 40,3 milliards.</p>
<h5>Le patient zéro</h5>
<p>Bref, tout est faux. L’article 25 de la loi de 1973 n’est que la réaffirmation d’un principe déjà communément admis depuis au moins 1936 et le reste de la loi ne fait que codifier et encadrer les relations du Trésor avec la banque centrale sans rien changer au financement du Trésor si ce n’est le mode opératoire. Une question reste néanmoins en suspens : par quelle sorte de miracle cette imbécilité a pu se frayer un chemin jusque dans les programmes [4] de plusieurs candidats aux élections présidentielles ?</p>
<p>Je tiens à avertir ici le lecteur que la partie sérieuse est terminée et que la suite pique un peu les yeux. Vous poursuivez à vos risques et périls.</p>
<p>Même s’il semble exister des sources plus anciennes et avec toute la prudence qui s’impose dans ce genre d’exercices, il semble bien que le patient zéro, celui qui, plus que tout autre, a contribué à populariser cette fumisterie soit un certain André-Jacques Holbecq (a.k.a. AJH ou Stilgar).</p>
<p>Ne cherchez pas M. Holbecq dans les annuaires académiques : c’est un ancien pilote d’Air France qui, une fois à la retraite, s’est livré corps et âme à ses deux grandes passions : l’ufologie (il passe pour un des plus grands spécialistes du langage ummite [5]) et l’économie, option anticapitaliste, version <em>new age</em>. Sur ce second thème, il publie pas moins de <a href="http://plus.wikimonde.com/wiki/Andr%C3%A9-Jacques_Holbecq#Ouvrages" target="_blank">9 bouquins</a> de 2002 à 2014 et multiplie les blogs et sites sur lesquels il développe son concept personnel : l’<em>écosociétalisme</em>.</p>
<p>Or voilà, chemin faisant et sans doute au début de l’année 2007 [7], M. Holbecq découvre le ‘pot aux roses’. Sur <a href="http://www.societal.org/docs/dette-publique.htm" target="_blank">son site principal du moment</a>, il écrit : « Depuis 1973 (l’article 25 de la loi du 3 janvier précise que ‘Le trésor public ne peut être présentateur de ses propres effets à l’escompte de la Banque de France’. Ce qui signifie que notre pays s’est interdit de permettre à la Banque de France de financer le Trésor Public… » Nous y voilà !</p>
<h5>Comme une traînée de poudre</h5>
<p>Très rapidement, notre ufologue va faire partager sa découverte au plus grand nombre possible et notamment à l’inénarrable <a href="https://fr.wikipedia.org/wiki/%C3%89tienne_Chouard" target="_blank">Étienne Chouard</a>, qui, ‘découvrant’ le scandale à son tour, <a href="http://etienne.chouard.free.fr/Europe/forum/index.php?2007/05/01/72-non-ce-n-est-pas-trop-cher-le-financement-des-besoins-collectifs-est-rendu-sciemment-ruineux" target="_blank">le relaie sur son site</a> en mai 2007. S’installe alors entre nos deux compères un tango bien huilé : Chouard fait la promotion des <em>travaux</em> de Holbecq et ce dernier utilise l’aura d’<em>économiste</em> [8] de Chouard pour donner du poids à ses conclusions.</p>
<p>Mais à ce stade, alors qu’André-Jacques Holbecq s’apprête à publier un bouquin [9] pour populariser ses idées, l’affaire peine encore à décoller : il lui faut une plateforme plus médiatique ; plateforme qu’il va trouver avec le blog de <a href="https://fr.wikipedia.org/wiki/Paul_Jorion" target="_blank">Paul Jorion</a>. Il y débarque en avril 2008 et s’y lance dans un grand débat sur la monnaie [10] grâce auquel, petit à petit, il se constitue une audience.</p>
<p>Et là, c’est le drame : début 2010, un certain nombre de bloggeurs souverainistes — dont, notamment, des proches de Nicolas Dupon-Aignan [11] — tombent dessus et s’empressent de relayer l’info. En quelques mois c’est une traînée de poudre : le scandale de la loi de 1973 est dans tous les discours de Marine le Pen à Jean-Luc Mélenchon. La légende urbaine est lancée et, conformément à la <a href="http://ordrespontane.blogspot.com/2014/07/brandolinis-law.html" target="_blank">loi de Brandolini</a>, elle devient pratiquement impossible à réfuter.</p>
<h5>Épilogue</h5>
<p>La conclusion de tout ça, c’est que cette loi n’a pas empêché le Trésor d’emprunter gratuitement à la Banque de France et n’est donc absolument pour rien dans notre dette publique. Si nous sommes endettés, c’est simplement parce que depuis plus de 40 ans maintenant, tous nos gouvernements, de droite comme de gauche, ont systématiquement voté des budgets déficitaires. Si nous sommes endettés, c’est parce que la simple idée d’exercer un seul budget à l’équilibre — sans même parler d’excédents — est systématiquement qualifié de politique d’austérité, à commencer — comble de l’ironie — par ceux-là même qui estiment que la dette publique est illégitime.</p>
<p>De ce qui précède, j’ose espérer que le lecteur attentif aura retenu au moins une chose : toute personne, physique ou morale, qui relaie ce hoax lamentable est au mieux parfaitement incompétente et au pire un menteur.</p>
<p>---
<br/>[1] C’est tout à fait exact : M. Pompidou a été directeur de Rothschild frères de 1954 à 1958.
<br/>[2] Jusque-là, la Banque de France appartenait à des actionnaires tout ce qu’il y a de plus privés (c’est d’ailleurs l’origine du mythe des « <a href="https://fr.wikipedia.org/wiki/Deux_cents_familles" target="_blank">deux-cents familles</a>, » en référence aux principaux actionnaires de la banque) et si vous voulez en savoir plus sur les origines de l’institution, <a href="http://ordrespontane.blogspot.com/2015/07/sa-banque.html">j’en parle ici</a>.
<br/>[3] En l’occurrence, le « taux le plus bas pratiqué par la banque à l’occasion de ses interventions les plus récentes, au jour le jour ou à très court terme, sur le marché monétaire. »
<br/>[4] Par exemple, l’abrogation de cette loi est toujours présente dans <a href="http://www.nda-2017.fr/theme/economie-travail" target="_blank">le programme de Nicolas Dupont-Aignan</a> (ce qui est parfaitement idiot puisqu’elle a déjà été abrogée en 1993.)
<br/>[5] C’est notamment le créateur du site <a href="http://ummo-sciences.org/" target="_blank">ummo-sciences.org</a> (<a href="https://rr0.org/people/h/HolbecqAndreJacques.html" target="_blank">source</a>) et il a préfacé <em>Ummo, un Dieu venu d'ailleurs ?</em> (Agnières, JMG éditions, « Science-conscience », 2004) de Christel Seval.
<br/>[6] Au moins <a href="http://sapiensweb.free.fr/" target="_blank">sapiensweb</a>, <a href="http://yhad.fr/" target="_blank">yhad.fr</a>, <a href="http://www.societal.org/" target="_blank">societal.org</a> (et <a href="http://wiki.societal.org" target="_blank">le wiki associé</a>), <a href="http://www.fauxmonnayeurs.org/" target="_blank">fauxmonnayeurs.org</a> et son blog officiel : <a href="postjorion.wordpress.com" target="_blank">postjorion</a>.
<br/>[7] L’article a été remanié (d’où les dates postérieures) mais Chouard <a href="http://etienne.chouard.free.fr/Europe/forum/index.php?2007/05/01/72-non-ce-n-est-pas-trop-cher-le-financement-des-besoins-collectifs-est-rendu-sciemment-ruineux" target="_blank">poste un lien qui pointe dessus</a> le 14 juin 2007 à 22:44.
<br/>[8] En l’occurrence, M. Chouard n’a qu’une maîtrise en droit et ses lettres de noblesse d’économiste, il les doit à son poste de professeur d’économie-gestion et de droit fiscal, puis d’informatique, au lycée Marcel-Pagnol à Marseille.
<br/>[9] <em>La dette publique, une affaire rentable</em> (éditions Yves Michel, 2008) avec Philippe Derruder.
<br/>[10] Il intervient d’abord sous le pseudo de <em>Stilgar</em> avant de révéler son véritable nom (tout <a href="http://etienne.chouard.free.fr/Europe/messages_recus/Blog_de_Paul_Jorion_Monnaie.pdf" target="_blank">l’historique des messages est ici</a>).
<br/>[11] Je ne cite pas de noms ici dans la mesure où, se rendant compte qu’ils avaient relayé une théorie du complot parfaitement indéfendable, ils ont tous fait amende honorable — et certains se sont même donnés un mal de chien pour remettre les pendules à l’heure.</p>
<h5>Notes complémentaires</h5>
<ol>
<li>Je dis, sans insister dessus, que l’escompte est un moyen de se procurer de la trésorerie. C’est important : en présentant ses propres bons à l’escompte de la Banque de France, le Trésor n’aurait pu, si c’était autorisé, qu’emprunter à court terme — juste de quoi compenser des décalages de trésorerie entre le paiement des traitements des fonctionnaires et la perception du produit de l’impôt, par exemple. Cette technique ne permettait donc pas de financer des investissements à long terme. Par ailleurs, il est bien évident que la Banque de France aurait chargé un intérêt (en payant moins cher que ce que le bon présenté valait vraiment).</li>
<li>Je passe rapidement, en introduction, sur l’idée selon laquelle ce sont les banques qui prêteraient à l’État. C’est évidemment ridicule : aucune banque n’a intérêt à financer l’État pour la bonne est simple raison que l’État se finance toujours moins cher qu’une banque privée (elles y perdraient donc de l’argent). Pour la même raison, l’État n’a aucun intérêt à emprunter aux banques : les marchés financiers lui réservent de bien meilleures conditions. La seule raison qui, aujourd’hui, pousse les banques à détenir des obligations d’État, c’est la règlementation : elles en ont besoin pour pouvoir emprunter auprès de la BCE.</li>
<li>Certains commentateurs, sur Twitter, affirment que Jean-Luc Mélenchon n’a jamais relayé cette intox. Je cite ici un extrait du <a href="http://www.jean-luc-melenchon.fr/brochures/humain_dabord.pdf#page=12" target="_blank">programme du Front de Gauche et de Jean-Luc Mélenchon</a> lors des présidentielle et législatives de 2012 : « Par ailleurs, dès 1973 l’État a renoncé à sa prérogative de battre monnaie. Ne pouvant se financer directement ni auprès de la Banque de France ni aujourd’hui auprès de la BCE, il est ainsi obligé de s’adresser aux banques privées, qui prélèvent des intérêts au passage. »</li>
<li>Depuis l’introduction du nouveau franc (1er janvier 1960), trois postes du bilan de la Banque de France retracent les avances gratuites consenties par la Banque de France au Trésor : les « Prêts à l’État », les « Avances à l’État » et les « Bons du Trésor sans intérêt ». Les <a href="https://www.banque-france.fr/la-banque-de-france/histoire/annuaire-historique/situation-hebdomadaire-de-la-banque-de-france-1898-1974/concours-au-tresor" target="_blank">situations hebdomadaires de la Banque de France</a> permettent de vérifier que, du 31 décembre 1959 au 20 décembre 1973, ces trois comptes cumulés varient entre 6.2 et 11 milliards de francs avec une moyenne à 9.2 milliards. Le 21 décembre 1973, la loi 73-1121 approuve la convention passée entre le ministère des finances et la Banque de France : les trois comptes <a href=éhttps://gallica.bnf.fr/ark:/12148/bpt6k6493342z/f133.item" target="_blank">sont regroupés en un seul compte</a> intitulé « Concours au Trésor Public » et, comme expliqué plus haut, la convention fixe une limite de 20,5 milliards de francs dont 10,5 sans intérêts. Dès le 17 janvier 1974, le compte « Concours au Trésor Public » passe à 10,5 milliards de francs. À partir de ce moment, le Trésor va emprunter très précisément l’enveloppe gratuite prévue par les conventions successives (laquelle variera à la hausse comme à la baisse au grès des besoins). En revanche, il semble que l’État n’ai pas utilisé les 10 milliards supplémentaires (et payants) : c’est sans doute qu’il trouvait moins cher ou plus pratique de ses financer directement sur les marchés.</li>
<li>S’agissant de la pratique que cherche à proscrire l’article 25 de la loi de 1973 (et l’article 13 de la loi de 1936), il semble qu’elle ait eu cours entre mars 1915, en pleine première Guerre Mondiale, jusqu’en juin 1928, au moment de la dévaluation qui introduit le franc Poincaré (1/5e du franc germinal). Elle a donc probablement contribué à tuer le franc germinal (la base monétaire exprimées en points de PIB, <a href="https://www.economie.gouv.fr/files/ww1_duchaussoy_monnet.pdf#page=7" target="_blank"> a été multipliée par deux</a> rien qu’entre 1913 et 1920 !) : raison probable pour laquelle on a voulu l’interdire (d’autant plus que, selon <a href="https://www.economie.gouv.fr/files/ww1_duchaussoy_monnet.pdf#page=15" target="_blank">Vincent Duchaussoy et Éric Monnet</a>, elle l’était déjà en 1915 !) Notez qu’une autre ligne semble prendre la suite : les « Bons négociables de la <a href="https://www.persee.fr/doc/ecofi_0987-3368_1991_hos_1_1_1783" target="_blank">Caisse Autonome d’Amortissement</a> » et disparait à son tour en 1952.</li>
<li>De 1960 à 1973, les relations entre la Banque de France et le Trésor <a href="https://laviedesidees.fr/L-Etat-livre-aux-financiers.html" target="_blank">sont fondée</a> sur la convention de trésorerie du 29 octobre 1959. Cette dernière prévoit deux types de financement : les <em>prêts à l’État</em> et les <em>avances à l’État</em>. Au moment où la loi de 1973 est votée, ces deux dispositifs essentiellement gratuits <a href="http://www.senat.fr/rap/1973-1974/i1973_1974_0090.pdf" target="_blank">sont respectivement limités</a> à 5.45 milliards de francs (convention du 3 mai 1962) et 3.452 milliards (convention du 4 décembre 1969). Par ailleurs, en application des conventions des 8 juin 1972 et 7 juin 1973, la Banque de France détient également entre 1.46 et 1.57 milliards d’<em>Bons du Trésors sans intérêts</em>. Au total, de 1960 à 1973, ces trois sources de financement gratuit (ou presque : la Banque de France prélevait tout de même une commission de 0.125%) représentent entre 6.2 et 11 milliards (moyenne à 9.2). Lorsque la loi est votée, on en est à un peu moins de 10.5 milliards de francs : c’est précisément le montant qui est retenu par la convention du 17 septembre 1973. À ces mécanismes officiels s’ajoutent deux sources plus opaques et sur lesquelles le Trésor paie des intérêts (la <em>mobilisation des obligations cautionnées</em> et la <em>mobilisation d’effets représentatifs de prêts spéciaux à la construction</em> par l’intermédiaire de la Caisse des Dépôts et Consignations) pour un montant estimé à 10 milliards en 1973. Ça nous fait donc bien un total de 20.5 milliards dont 10.5 sans intérêts.</li>
</ol>
Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com323tag:blogger.com,1999:blog-6602717398228748861.post-8196292618442761112018-06-30T10:18:00.001+02:002018-06-30T10:18:56.075+02:00Monty Hall sans maths<p>Règle du jeu : on va vous proposer 3 enveloppes dont deux sont vides et une contient un billet de €100. Dans un deuxième temps, l’organisateur, qui sait où se trouve le billet et ne souhaite pas vous révéler sa position, va ouvrir une enveloppe qu’il sait être vide et qui n’est pas celle que vous avez en main. À ce stade, vous aurez le choix entre (i) rester sur votre choix initial ou (ii) changer d’avis et prendre l’enveloppe qui reste.</p>
<p>Le jeu commence : par hypothèse, vous ouvrez l’enveloppe 1 et l’organisateur ouvre l’enveloppe 2 (qui est donc vide). Vous avez donc le choix entre garder l’enveloppe 1 ou changer pour l’enveloppe 3. Que faites-vous ?</p>
<p>Vous êtes sans doute nombreux à avoir reconnu le <a href="https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_Monty_Hall" target="_blank">problème de Monty Hall</a> et donc, à savoir qu’il faut changer : le billet a deux fois plus de chances de se trouver dans l’enveloppe 3 que dans l’enveloppe 1.</p>
<p>Ce résultat a beau être un grand classique des probabilités, à chaque fois qu’on pose le problème la solution donne systématiquement lieu à des débats byzantins (avec, notamment, les inévitables critiques de l’énoncé). Je vous propose donc quelques démonstrations intuitives (i.e. sans maths) pour tenter de clore le débat.</p>
<p>Version courte : au départ du jeu, la probabilité pour que le billet soit dans l’enveloppe 1 est de 1/3. Comme il ne peut se trouver que dans l’enveloppe 1 ou dans l’enveloppe 3, la probabilité qu’il se trouve dans la 3ème, c’est nécessairement les 2/3 restants.</p>
<p>Pas convaincu ? Imaginez qu’au lieu de 3 enveloppes, il y en avait 100. Vous en avez sélectionné une (1 chance sur 100 d’avoir vu juste du premier coup) et l’organisateur vous démontre que 98 autres sont vides. Vous avez donc le choix entre votre pari initial et une sélection de 98 enveloppes sur 99 faite par l’organisateur...</p>
<p>Toujours pas ? Considérez tous les scénarios possibles :</p>
<p>(i) Le billet est dans l’enveloppe 1 (1 chance sur 3). Dans ce cas, l’organisateur peut ouvrir l’enveloppe 2 (1 chance sur 2) ou l’enveloppe 3 (1 chance sur 2 aussi). Ces deux scénarios ont donc une probabilité de 1/6.</p>
<p>(ii) Le billet est dans l’enveloppe 2 (1 chance sur 3). Si ça avait été le cas, l’organisateur ne pouvait ouvrir que l’enveloppe 3 (sinon, il révélait de facto la position du billet). Comme nous savons que le billet n’est pas dans l’enveloppe 2, on peut éliminer ce scénario.</p>
<p>(iii) Le billet est dans l’enveloppe 3 (1 chance sur 3). Si c’est le cas, pour les même raisons que précédemment, l’organisateur ne peut ouvrir que l’enveloppe 2 (probabilité de 100%). Dès lors, ce scénario a 1 chance sur 3 de se réaliser.</p>
<p>Partant de là, considérez les deux cas dans lesquels l’organisateur ouvre l’enveloppe 2 : dans le scénario (i) ça correspond à une probabilité de 1/6 tandis que dans le scénario (iii) la probabilité est de 1 chance sur 3 — le double.</p>
<p>Le truc de Monty Hall, c’est que l’organisateur fait une sélection consciente parmi les enveloppes que vous n’avez pas choisies au départ : il en ouvre une qu’il sait être vide. C’est cette action de l’organisateur qui créé une asymétrie dans nos probabilités : quand il ouvre l’enveloppe 2, il ne fait pas qu’éliminer cette enveloppe ; il nous donne aussi une information sur la position du billet entre les enveloppes 1 et 3 (parce que si elle était dans l’enveloppe 1, il aurait tout aussi bien pu ouvrir l’enveloppe 3.)</p>
<p>A contrario, si l’organisateur choisissait une enveloppe au hasard (et tombait par chance sur une enveloppe vide), les probabilités seraient bien de 50% pour chacune des enveloppes restantes.</p>
<p>Et si tout ce qui précède ne suffit pas, il nous reste à simuler un grand nombre de jeu de Monty Hall pour voir quelle est la stratégie gagnante. En supposant un gain de 1 lorsque vous trouvez le billet (zéro dans le cas contraire), voilà une petite fonction sous R qui fait le job :</p>
<pre>monty.hall = function() {
v <- 1:3
init <- sample(v, 1)
play <- sample(v, 1)
orga <- sample(v[-c(init, play)], 1)
keep <- as.integer(init == play)
swth <- as.integer(! keep)
c(keep, swth)
}</pre>
<p>Reste à tester ça un million de fois pour voir quelle est la meilleure stratégie :</p>
<pre>n <- 1e6
res <- replicate(n, monty.hall())
rowSums(res)/n</pre>
<p>Vu ?</p>
Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com43tag:blogger.com,1999:blog-6602717398228748861.post-62375838158506929602018-02-14T16:23:00.000+01:002018-02-14T16:23:13.358+01:00 ChallengeR #8 - Solutions<p>Votre <a href="http://ordrespontane.blogspot.fr/2018/02/challenger-8.html">mission</a> consistait donc à trouver un moyen de faire en sorte que :</p>
<pre>> x == 0
[1] TRUE
> x + 1 == 2
[1] TRUE
> x / 2 == 1
[1] TRUE
> x
[1] 3
> 3 - x
[1] 3
></pre>
<p>Et vous deviez faire ça sans utiliser d’autres fonctions que celles fournies dans les packages de base de R.</p>
<p>Il y a deux façons de faire ça. La première consiste à modifier le comportement des opérateurs utilisés ci-dessus ; c'est ce qu'on proposé <a href="https://twitter.com/sassien" target="_blank">@sassien</a> et <a href="https://twitter.com/navarre_julien" target="_blank">@navarre_julien</a> avec, respectivement :</p>
<pre>'==' <- function(a,b) {TRUE}
'+' <- function(a,b) {a/3+b}
'/' <- function(a,b) {(a-1)/b}
'-' <- function(a,b) {a}
x <- 3
</pre>
<p>Ou, plus minimaliste :</p>
<pre>x <- 3
'==' <- function(x, y) T
'-' <- function(x, y) y</pre>
<p>L'autre, un brin plus ésotérique et proposée par <a href="https://twitter.com/AlekVladNevski" target="_blank">@AlekVladNevski</a>, consiste à faire varier la valeur de <code>x</code> à chaque évaluation avec <code>makeActiveBinding</code> (c'est la solution du <a href="https://twitter.com/_ColinFay/status/955156032728256515" target="_blank">quiz de @_ColinFay</a>) :</p>
<pre>f = function(){i <<- (i+1)%%4; return(i);}
makeActiveBinding(sym = "x", env = .GlobalEnv, fun = f)
i <- -1</pre>
<p>Notez enfin qu'il y a une autre méthode pour faire presque la même chose en utilisant <code>addTaskCallback</code> :</p>
<pre>foo <- function(total) {
i <- 0
function(expr, value, ok, visible) {
i <<- i + 1
x <<- (x + 1) %% 4
i < total
}
}
x <- -1
n <- addTaskCallback(foo(10))</pre>
<p>Pour Challenger #9, vous voudrez bien me laisser un peu de temps. J’ai du pain sur la planche.</p>
Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com9tag:blogger.com,1999:blog-6602717398228748861.post-86796195549592373662018-02-02T17:49:00.000+01:002018-02-02T17:49:24.476+01:00ChallengeR #8<p>Lors d’un <a href="http://ordrespontane.blogspot.fr/2018/01/challenger-7.html" target="_blank">épisode précédent</a>, vous deviez coder une fonction <code>month.end</code> qui, comme son nom le suggère, renvoie le dernier jour du mois de toutes les dates passées en argument tout en utilisant le moins de caractères possibles — sachant que (i) je ne compte que le corps de la fonction et (ii) les espaces, indentations et retours à la ligne ne sont pas considérés comme des caractères).</p>
<p>Et les vainqueurs de ce ChallengeR sont <a href="https://twitter.com/AlekVladNevski" target="_blank">@AlekVladNevski</a>, <a href="https://twitter.com/navarre_julien" target="_blank">@navarre_julien</a> et <a href="https://twitter.com/_pvictorr" target="_blank">@_pvictorr</a> avec 45 caractères ! @AlekVladNevski nous propose :</p>
<pre>month.end <- function(x){
d=as.Date
c=cut
m="month"
d(c(d(c(x,m))+32,m))-1
}</pre>
<p>Avec une méthode similaire, @navarre_julien :</p>
<pre>month.end <- function(x) {
f = function(x) as.Date(cut(x, "mo"))
f(f(x) + 32) - 1
}</pre>
<p>Enfin, @_pvictorr utilise une autre approche qui présente l'avantage indéniable d'être significativement plus rapide :</p>
<pre>month.end <- function(x) {
x = as.POSIXlt(x)
x$mon = x$mo + 1
x$mday = 1
as.Date(x) - 1
}</pre>
<p>Bravo à tous les 3 !</p>
<h3>Challenger #8</h3>
<p>Dans la veine du casse-tête <a href="https://twitter.com/_ColinFay/status/955156032728256515" target="_blank">proposé par @_ColinFay</a> il y a quelques jours, je vous propose de trouver un moyen de faire en sorte que :</p>
<pre>> x == 0
[1] TRUE
> x + 1 == 2
[1] TRUE
> x / 2 == 1
[1] TRUE
> x
[1] 3
> 3 - x
[1] 3
></pre>
<p>Et vous devez faire ça sans utiliser d’autres fonctions que celles fournies dans les packages de base de R. Vous avez jusqu’à vendredi prochain (le 09/02).</p>
<form id="code_form" action="https://script.google.com/macros/s/AKfycbwwRKRjUzz-7i22ULA-4OK1qRFI3du9bpEwkAPsPICZThxUVsw-/exec">
<input type="hidden" id="challenge" name="challenge" value="C8">
Votre @username sur Twitter :<br>
<input type="text" name="username" id="username" style="width:200px"><br>
<br>
Coller votre code ici :<br>
<textarea name="rcode" id="rcode" style="width:100%; height:200px"></textarea><br>
<br>
<input type="submit" id="submit_code" value="Valider">
</form>
<p><span id="confirm_msg">Validez pour enregistrer votre réponse.</span></p>
<!-- jQuery / JavaScript -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
// References:
var $form = $('#code_form');
var $conf = $('#confirm_msg');
var $subm = $('#submit_code');
// Submit function:
$form.submit(function(){
$.post($(this).attr('action'), $(this).serialize(), function(response){
// On success, clear all inputs;
$form.trigger('reset');
// Write a confirmation message:
$conf.html("Réponse enregistrée !");
// Disable the submit button:
$subm.prop('disabled', true);
},'json');
return false;
});
});
</script>Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com2tag:blogger.com,1999:blog-6602717398228748861.post-31765493002183584752018-01-26T17:14:00.003+01:002018-01-28T17:26:59.567+01:00ChallengeR #7<p>Vous <a href="https://ordrespontane.blogspot.fr/2018/01/challenger-6.html">deviez donc</a> coder une fonction <code>nbchar</code> qui compte le nombre de caractères (hors espaces, indentations et retours à la ligne) du corps d'une autre fonction R sachant que le gagnant serait celui pour qui <code>nbchar(nbchar)</code> serait le plus petit possible.</p>
<p>Et le gagnant de ce ChallengeR #6 est <a href="https://twitter.com/_colinfay" target="_blank">@_ColinFay</a> qui nous propose :</p>
<pre>nbchar <- function(f){
sum(nchar(gsub("[[:blank:]]+", "", body(f)))[-1])
}</pre>
<p>Ce qui donne donc :</p>
<pre>> nbchar(nbchar)
[1] 47
></pre>
<p>Colin me fait remarquer, à juste titre, que je n'ai pas précisé que vous n'aviez pas le droit d'utiliser une fonction externe. Auquel cas il propose :</p>
<pre>x <- function(f){
sum(nchar(gsub("[[:blank:]]+", "", body(f)))[-1])
}
nbchar <- function(f){
x(f)
}</pre>
<p>Soit 4 caractères. Nous allons quand même retenir la première version :)</p>
<p>Notez aussi celle de <a href="https://twitter.com/navarre_julien" target="_blank">@navarre_julien</a> :
<pre>nbchar <- function(f) {
sum(nchar(gsub("\\s", "", deparse(body(f)))))
}</pre>
<p>Elle présente l'inconvénient de compter les accolades au début et à la fin du corps mais utilise une expression régulière bien plus courte (<code>\\s</code>). En mixant les deux, vous pouviez faire :</p>
<pre>nbchar <- function(f) {
sum(nchar(gsub("\\s", "", body(f)[-1])))
}</pre>
<p>Et je ne crois pas qu'on puisse espérer faire plus court.</p>
<h3>Challenger #7</h3>
<p>Votre mission, si vous l’acceptez consiste à trouver une fonction <code>month.end</code> qui, comme son nom le suggère, renvoie le dernier jour du mois de toutes les dates passées en argument. Par exemple :</p>
<pre>> x <- seq(as.Date("1999-01-01"), by = 22, len = 10)
> month.end(x)
[1] "1999-01-31" "1999-01-31" "1999-02-28" "1999-03-31" "1999-03-31"
[6] "1999-04-30" "1999-05-31" "1999-06-30" "1999-06-30" "1999-07-31"
></pre>
<p>Sera déclaré vainqueur celui ou celle qui produira la fonction la plus minimaliste (au sens de <code>nbchar</code>) sachant que (i) vous n’avez droit qu’aux packages par défaut de R et (ii) vous ne pouvez pas faire appel à des fonctions externes (poke Colin).</p>
<p>Postez vos réponses ci-dessous ; vous avez jusqu’à vendredi prochain. <b>Update</b> : votre fonction doit impérativement retourner un objet <code>Date</code>. Les meilleurs sont en dessous de 50 caractères !</p>
<form id="code_form" action="https://script.google.com/macros/s/AKfycbwwRKRjUzz-7i22ULA-4OK1qRFI3du9bpEwkAPsPICZThxUVsw-/exec">
<input type="hidden" id="challenge" name="challenge" value="C7">
Votre @username sur Twitter :<br>
<input type="text" name="username" id="username" style="width:200px"><br>
<br>
Coller votre code ici :<br>
<textarea name="rcode" id="rcode" style="width:100%; height:200px"></textarea><br>
<br>
<input type="submit" id="submit_code" value="Valider">
</form>
<p><span id="confirm_msg">Validez pour enregistrer votre réponse.</span></p>
<!-- jQuery / JavaScript -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
// References:
var $form = $('#code_form');
var $conf = $('#confirm_msg');
var $subm = $('#submit_code');
// Submit function:
$form.submit(function(){
$.post($(this).attr('action'), $(this).serialize(), function(response){
// On success, clear all inputs;
$form.trigger('reset');
// Write a confirmation message:
$conf.html("Réponse enregistrée !");
// Disable the submit button:
$subm.prop('disabled', true);
},'json');
return false;
});
});
</script>Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com3tag:blogger.com,1999:blog-6602717398228748861.post-63544578480773680852018-01-26T11:44:00.003+01:002018-12-12T12:07:11.843+01:00Qui achète des obligations à taux négatifs ?<p>En novembre dernier, Veolia a emprunté pour 500 millions d’euros sur les marchés via l’émission d’une obligation qui arrivera à maturité le 23 novembre 2020 (dans 3 ans). Jusqu’ici, rien d’extraordinaire : avec un endettement financier de l’ordre de 8.5 milliards d’euros, Veolia est un intervenant régulier sur le marché du crédit et les notes des agences — BBB selon Standard & Poor’s et Baa1 selon Moody’s — si elles ne témoignent pas d’une qualité de crédit exceptionnelle, place tout de même le groupe dans la catégorie des émetteurs dits <em>investment grade</em>.</p>
<p>Ce que cette émission a d’extraordinaire, c’est que le taux coupon proposé par Veolia à ses créanciers Le taux d’intérêt que le groupe se propose de payer sur lesdits 500 millions d’euros était d’exactement 0% ! — c’est-à-dire le taux d’intérêt que le groupe se propose de payer sur lesdits 500 millions d’euros — était d’exactement zéro pourcent (0%) ! Mieux encore : cette proposition a eu un tel succès (Veolia a reçu 4 fois plus d’offres qu’initialement demandé) qu’elle s’est finalement vendue à 100.078 ce qui se traduit par un taux d’intérêt de -0.026%.</p>
<p>Concrètement, cela signifie que les investisseurs ont payé 100 078 euros pour une obligation qui ne leur versera pas le moindre intérêt et sera remboursée 100 000 euros dans 3 ans. On est naturellement en droit de se demander qui, avec de telles conditions, irait prêter à Veolia.</p>
<p>Une explication possible consiste à supposer que les investisseurs anticipent une importante déflation ; c’est-à-dire qu’ils pensent qu’un euro dans quelques années aura plus de valeur (de pouvoir d’achat) qu’un euro actuel de tel sorte que le taux réel, ajusté de la déflation à venir, serait en réalité positif. C’est une façon intéressante de voir les choses mais elle souffre néanmoins d’une faille importante. Si tel est le cas, si les investisseurs anticipaient effectivement une importante déflation, ils avaient une solution à la fois simple et plus rémunératrice : ne pas investir du tout.</p>
<p>Il y a, en réalité, deux facteurs qui expliquent le succès de l’obligation Veolia.</p>
<p>Le premier, est de nature réglementaire : il se trouve que la réglementation impose aux gérants de fonds (les OPCVM en droit français) de ne pas détenir plus de 10% de liquidités. En d’autres termes, quelles que soient les conditions du marché, nous sommes légalement tenus d’investir au minimum 90% des actifs qui nous sont confiés. Or, dans un environnement où les taux des obligations d’État sont très largement en territoire négatif (à l’heure où j’écris ces lignes, les obligations d’État françaises à 3 ans affichent un taux d’environ -0.25%), l’obligation Veolia est une des moins mauvaises options disponibles.</p>
<p>Deuxième élément d’explication : quand la Banque Centrale Européenne pratique des taux d’intérêts négatifs sur les avoirs que les banques détiennent auprès d’elle, ces dernières font la même chose avec nous. Concrètement, si le compte bancaire en euro d’un fonds est créditeur, il se verra appliquer un taux égal à celui du taux de dépôt au jour le jour de la BCE (la Overnight Deposit Facility) soit, actuellement, -0.40%. C’est-à-dire que, même si nous pouvions ne pas investir, nos liquidités subiraient un taux nettement plus négatif que celui de l’obligation Veolia.</p>
<p>---
<br/>[1] Note technique : le prix d’une obligation est toujours exprimé en pourcentage du pair lequel est, pour faire simple, le capital qui sera remboursé à maturité. Dans le cas qui nous intéresse, par exemple, c’est 100.078% de 100 000 euros soit 100 078 euros.</p>
Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com1tag:blogger.com,1999:blog-6602717398228748861.post-78137302405931180142018-01-24T14:31:00.001+01:002018-01-24T14:31:49.939+01:00Combien valent vos droits à la retraite ?<p>Officiellement, rien du tout. Les statistiques que l’on voit circuler sur le patrimoine des français comme les lois fiscales considèrent que les droits acquis pour le versement d’une rente garantie par l’État ne valent absolument rien. C’est évidemment stupide : ce n’est pas parce que vous ne pouvez pas vendre vos droits qu’ils n’ont pas, en réalité, une valeur économique.</p>
<p>La réalité étant, comme toujours en France, infiniment complexe et changeante, je vais illustrer ce raisonnement avec un exemple honteusement simplifié : nous allons estimer la valeur économique d’une rente fictive de 1 000 euros par mois, payable à partir du 22 mars 2018 jusqu’au 22 janvier 2048 (soit un peu moins de 30 ans) et garantie par un État noté AAA de la zone euro [1].</p>
<p>Le raisonnement financier classique consiste à se poser une question toute simple : « combien faudrait-il investir aujourd’hui pour reproduire les mêmes effets ? » Les effets, en l’occurrence, sont les suivants : nous sommes, par hypothèse, le 22 janvier 2018 et, à partir du 22 mars 2018, vous allez toucher 1 000 euros tous les mois jusqu’au 22 janvier 2048 et ce, avec une garantie d’État.</p>
<p>Pour reproduire cette série de cash-flows avec une certitude équivalente, il n’y a pas cinquante solutions : vous allez devoir investir sur des obligations dites zéro-coupon ; c’est-à-dire des obligations qui remboursent le capital et les intérêts en une seule fois, quand elles arrivent à échéance [2].</p>
<p>Concrètement, pour assurer votre premier versement de 1 000 euros dans 3 mois, vous allez devoir acheter une obligation zéro-coupon qui arrive à maturité le 22 mars 2018, pour le second versement vous achèterez une autre obligation qui arrivera à échéance le 22 avril 2018 et ainsi de suite jusqu’au 22 janvier 2048. Au total, ça vous fera un portefeuille de 358 obligations [3] ; chacune assurant, lorsqu’elle arrivera à maturité, un paiement de 1 000 euros exactement.</p>
<p>La question est donc de savoir combien vous devrez investir sur chacune de ces obligations ce qui, naturellement, dépend des taux d’intérêt et, plus précisément des taux <em>spot</em> (le taux des obligations zéro coupon) avec une garantie similaire à celle d’un État noté AAA. Fort heureusement pour nous, la Banque Centrale Européenne met cette information à notre disposition <a href="https://www.ecb.europa.eu/stats/financial_markets_and_interest_rates/euro_area_yield_curves/html/index.en.html" target="_blank">sur son site</a>.</p>
<p>Par exemple, vous pouvez facilement vérifier qu’au 22 janvier 2018, le taux des obligations zéro coupon notée AAA à 30 ans (c’est-à-dire remboursable le 22 janvier 2048) était d’environ 1.3889%. Pour vous assurer de toucher exactement 1 000 euros le 22 janvier 2048, vous auriez donc dû investir la valeur actualisée ($C_0$) de 1 000 ($C_t$) à ce taux ($k$) sur 30 ans ($t$) [4] :</p>
$$C_0 = C_t \times e^{-tk}$$
<p>Sous R :</p>
<pre>> Ct <- 1000
> t <- 30
> k <- 1.389/100
> Ct*exp(-t*k)
[1] 659.2187
></pre>
<p>Pour vous assurer de toucher vos 1 000 le 22 janvier 2048, il fallait donc acheter pour environ 659.22 euros d’obligation zéro coupon arrivant à maturité à cette date. Reste à faire le même calcul pour tous les 357 autres paiements futurs. Toutes les données dont vous avez besoin <a href="https://gist.githubusercontent.com/gnicoulaud/e5ba5628dd0ac86dac3db6cae03dbec1/raw/0fc1b1517e6aca5ecd421299ae53c0e27300b4dd/EUR_spot.R" target="_blank">sont ici</a> (remplacez <code>url</code> par ce lien dans le code ci-dessous).</p>
<pre># Chargez tous les taux ZC en mémoire :
source(url)
# Montant à récupérer chaque mois :
Ct <- 1000
# Temps qui nous sépare de chaque paiement en années :
t <- yc$x/12
# Taux spot :
k <- yc$y
# Et nous devons investir...
sum(Ct*exp(-t*k))</pre>
<p>Ce qui nous fait un peu plus de 307 115 euros. C'est le montant que vous auriez dû investir sur des zéro coupon, le 22 janvier 2018, pour reproduire les paiements de notre rente fictive et c’est donc la valeur économique réelle de ladite rente. C’est-à-dire que, si vous pouviez vendre vos droits, c’est à ce prix qu’elle se négocierait : plus, vous faites une affaire ; moins, vous vous faites avoir.</p>
<p>Évidemment, ma rente fictive n’est pas tout à fait équivalente à des droits à la retraites. Pour commencer, elle garantit (presque) 30 ans de paiements à quiconque en est propriétaire — y compris vos éventuels héritiers si vous avez passé l’arme à gauche trop tôt — là où vos droits à la retraite sont garantis à vie mais ne bénéficierons à ceux qui restent que dans des conditions très restrictives et compliquées. Ensuite, elle ne sera pas réévaluée en cas d’inflation : vous vous êtes assuré de toucher 1 000 euros, quelle que soit la valeur de l’euro dans 10, 20 ou 30 ans, y-compris si l'euro ne vaut plus rien.</p>
<p>Enfin et peut être surtout, il existe une autre différence notable entre cette rente fictive et des droits à la retraites : propriétaire de ce portefeuille d’obligations, vous êtes tout à fait officiellement à la tête d’un patrimoine financier de 307 115 euros (notamment aux yeux de l’administration fiscale) tandis qu’avec vos droits à la retraite, vous êtes présumé pauvre comme Job.</p>
<p>Quand vous considérez les statistiques mondiales sur le patrimoine des uns et des autres, c’est un élément à prendre en compte : sauf erreur de ma part, les fonds de pensions de nos amis américains (par exemple) sont intégrés dans le calcul de leur patrimoine tandis que nos droits à la retraite, officiellement, ne valent rien.</p>
<p>---
<br>[1] La France n’est plus notée AAA. Inutile de me le rappeler.
<br>[2] Avec des obligations d’État classique qui, comme les OAT françaises, paient des coupons, votre rendement réel dépendra du taux auquel vous réinvestirez lesdits coupons futurs ; taux qui nous est inconnu aujourd’hui.
<br>[3] Dans la vraie vie, il est fort peu probable que vous trouviez toutes ces obligations mais peu importe.
<br>[4] Note technique : les taux proposés par la BCE sont des taux <em>composés en continu</em>. D’où les formules que j’utilise.</p>
Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com1tag:blogger.com,1999:blog-6602717398228748861.post-67770822952421853452018-01-23T17:53:00.000+01:002018-01-25T11:55:51.430+01:00Volatility and the square root of time<p>When I was a rookie, I asked one of the senior members of my team how to compute the volatility of an asset. His answer was as follow:</p>
<p>“<em>That’s simply an annualized standard deviation. If you are using daily data:</em></p><em>
<ol>
<li>Compute the daily returns of the asset,</li>
<li>Compute the standard deviation of these returns,</li>
<li>Multiply the standard deviation by the square root of 260 (because there are about 260 business days in a year).</li>
</ol>
</em><p><em>“Of course, </em>he added<em>, if you are using weekly returns you have to multiply by the square root of 52 and if you are using monthly data you should multiply by the square root of 12. Simple as that.</em>”</p>
<p>And so I did for years, not even trying to understand why I was multiplying the standard deviation by the square root of time.</p>
<p>Time passed by and one day, I found time to solve that mystery. Then, I understood why this formula makes perfect sense but, more importantly, I realized that the calculations made by most people I know in the financial industry, including seasoned investment professionals, are dead wrong.</p>
<p>Let me explain.</p>
<h3>Discrete returns</h3>
<p>Let $P_t$ be the price of an asset (that doesn’t pay any interim income such as dividends or coupons for the sake of simplicity) on day $t$. Then, the way most people would compute the return ($\delta_t$) on that asset from day $t-1$ to day $t$ is:</p>
$$\delta_t = \frac{P_t}{P_{t-1}} - 1$$
<p>Now suppose we have price data for $T$ days with $t \in{\{0, 1, 2, .., T\}}$ and, therefore, $T-1$ daily of $\delta_t$, and we want to compute the return over the whole period ($\delta_T$). We would use:</p>
$$\delta_T = \prod_{t=1}^T(1+\delta_t)-1$$
<p>For instance, using the data for the <a href="https://en.wikipedia.org/wiki/DAX" target="_blank">DAX</a> from the <code>EuStockMarkets</code> dataset in R:</p>
<pre>> P <- as.numeric(EuStockMarkets[, "DAX"])
> T <- length(P)
>
> dP <- P[-1]/P[-T]-1
> prod(1+dP)-1
[1] 2.360688
></pre>
<p>Indeed, it's equivalent to:</p>
<pre>> P[T]/P[1]-1
[1] 2.360688
></pre>
<p>And the mean return $\bar{\delta_t}$ over the same period is given by:</p>
$$\bar{\delta_t} = (1+\delta_T)^{1/T}-1$$
<p>In R:</p>
<pre>> rT <- prod(1+dP)-1
> (1+rT)^(1/T)-1
[1] 0.0006519036
></pre>
<p>Or:</p>
$$\bar{\delta_t} = \left( \frac{P_T}{P_0} \right)^{1/T}-1$$
<p>Note we use $P_0$ because $\delta_1$ is the return between $t=0$ and $t=1$. In R:</p>
<pre>> (P[T]/P[1])^(1/T)-1
[1] 0.0006519036
></pre>
<p>Using all this, it's easy to compute what the <em>annualized return</em> of the DAX was over that period. We have a daily mean return ($\bar{\delta_t}$) and we assume a year is 260 business days long; it follows that:</p>
$$\bar{\delta_{260}} = (1+\bar{\delta_t})^{260}-1$$
<p>In R:</p>
<pre>> mT <- (1+rT)^(1/T)-1
> (1+mT)^260-1
[1] 0.1846409
></pre>
<p>In words: over that period, the DAX has returned 18.5% per annum on average.</p>
<p>Now, back to the subject: what is the volatility — that is, the <em>annualized standard deviation</em> — of our daily returns ($\delta_t$)? We know how to compute the standard deviation of daily returns; in R:</p>
<pre>> sd(dP)
[1] 0.01028088
></pre>
<p>And, according to my former colleague, we should multiply this by $\sqrt{260}$:</p>
<pre>> sd(dP)*sqrt(260)
[1] 0.1657742
></pre>
<p>Well, guess what: this is <em>wrong</em> and, not only it is wrong, it doesn't mean anything.</p>
<h3>Continuous returns</h3>
<p>Using discrete returns is absolutely correct for most uses <em>but</em>, when computating a volatility (and, therefore, a Sharpe ratio or an information ratio) you should use <em>log returns</em> or, as I like to call them, <em>continuous returns</em>:</p>
$$\delta_t = \ln{\left(\frac{P_t}{P_{t-1}}\right)}$$
<p>Or, equivalently:</p>
$$\delta_t = \ln{(P_t)} - \ln{(P_{t-1})}$$
<p>Let me explain why.</p>
<p>The critical property of continuous returns is that the total (continuous) return over the whole period (the $T$ days) is a <em>sum</em>:</p>
$$\delta_T = \sum_{t=1}^T\delta_t$$
<p>In R:</p>
<pre>> dP <- diff(log(P))
> sum(dP)
[1] 1.212146
></pre>
<p>Is, indeed, equivalent to:</p>
<pre>> log(P[T]/P[1])
[1] 1.212146
></pre>
<p>As a result, the mean daily (continuous) return over the whole period ($\bar{\delta_t}$) is simply the arithmetic mean of the daily (continuous) return:</p>
<pre>> mean(dP)
[1] 0.0006520417
></pre>
<p>And, you guessed it, the annualized (continuous) return of the DAX was over that period is given by:</p>
<pre>> mean(dP)*260
[1] 0.1695309
></pre>
<p>Starting from this, let's go for a (random) walk.</p>
<h3>Random walk</h3>
<p>Following Jules Regnault [1], consider a random variable $\delta_t$ that follow some distribution (we don’t care which one) over $T$ periods and just make two basic assumptions: (i) the distribution is stable across time and (ii) the observations of $\delta_t$ are independent one from another.</p>
<p>Denoting $\mu$ the mean of the distribution which is supposed to be stable (assumption i), we know that the <em>sum</em> of $T$ observations will follow a mean $\mu_T$ given by:</p>
$$\mu_T = \mu \times T$$
<p>Now, that distribution also has a standard deviation ($\sigma$): what is the standard deviation of the <em>sum</em> of $T$ observations?</p>
<p>Thanks to the Bienaymé formula [2], we know that the variance of the sum of uncorrelated (assumption ii) random variables is the sum of their variances:</p>
$$Var{\left(\sum_{t=1}^T\delta_t \right)} = \sum_{t=1}^T Var{(\delta_t)}$$
<p>Since we have assumed the distribution is stable (assumption i), so does the variante ($\sigma^2$). From which:</p>
$$Var{\left(\sum_{t=1}^T\delta_t \right)} = \sigma^2 \times T$$
<p>Therefore, standard deviation of the <em>sum</em> of $T$ observations:</p>
$$\sqrt{Var{\left(\sum_{t=1}^T\delta_t \right)}} = \sigma \times \sqrt{T}$$
<p>Here you go: here is the square root of time.</p>
<p>What we are computing here is the standard deviation <em>of a sum</em> and this is indeed how we accumulate continuous returns; <em>not</em> the way we accumulate periodic returns (it's a product). In other words, that formula only make sense if your daily (weekly, monthly... whatever) returns are computed as continuous returns.</p>
<p>The volatility is simply that very same calculation over a standard period of one year (here, $T=260$ days). In R:</p>
<pre>> P <- as.numeric(EuStockMarkets[, "DAX"])
> T <- 260
> dP <- diff(log(P))
> mean(dP)*T
[1] 0.1695309
> sd(dP)*sqrt(T)
[1] 0.166096
></pre>
<p>Even better, since we have assumed that our $\delta_t$ are independent, the <a href="https://en.wikipedia.org/wiki/Central_limit_theorem" target="_blank">Central Limit Theorem</a> tells us that, after a large enough number of observations ($T$), their <em>sum</em> should follow (or, at least, be close of) — guess what — a normal distribution.</p>
<p>In other words, with our two assumptions and using continuous returns, we are able to compute the mean and the standard deviation of a normal distribution; which basically means that we knows everything else.</p>
<h3>A demo</h3>
<p>Let's make a step-by-step demo with the DAX data.</p>
<pre>P <- as.numeric(EuStockMarkets[, "DAX"])
dP <- diff(log(P))
T <- 260
# After T days, we should have:
mT <- mean(dP)*T
sT <- sd(dP)*sqrt(T)</pre>
<p>Now, we’re going to use <code> ecdf</code> to generate 1000 random series of length <code>T</code> that follow the empirical distribution of the DAX:</p>
<pre>N <- 1000
dist <- ecdf(dP)
Rt <- matrix(quantile(dist, runif(T*N)), T, N)</pre>
<p>Let's plot them:</p>
<pre>Ct <- apply(Rt, 2, cumsum)
cols <- heat.colors(N)
op <- par(mar = rep(5, 4))
plot(1:T, Ct[, 1], type = "n", ylim = c(-.5, .7), cex.lab = .7,
cex.axis = .7, cex.main = .8, main = "Figure 1")
for(i in 1:N) lines(1:T, Ct[, i], col = cols[i])
par(op)</pre>
<p>You shoud get something like:</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXaDGr9E3ZjfofqSHuACxqnXdR_ULAEkcD2aMLMqqrK9QBV-AnG4rq_CQAi0HR1ZtDqAzK0s5N5AL8BGtCTt8PsnpZ1_3zkhZd6miUXsJoqkmKiyVz-R7KsdDRizrv9X59mEDN5vkP0L4/s1600/01.png" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXaDGr9E3ZjfofqSHuACxqnXdR_ULAEkcD2aMLMqqrK9QBV-AnG4rq_CQAi0HR1ZtDqAzK0s5N5AL8BGtCTt8PsnpZ1_3zkhZd6miUXsJoqkmKiyVz-R7KsdDRizrv9X59mEDN5vkP0L4/s1600/01.png" width="500" id="id_14a4_a8bd_3563_7133" style="width: 500px; height: auto;"></a></div>
<p>Now let's see what the distribution looks like after <code>T</code> days:</p>
<pre># The mean:
mean(Ct[T, ])
# Compare to:
mT
# The standard deviation:
sd(Ct[T, ])
# Compare to:
sT</pre>
<p>Lastly, compare the empirical distribution at time <code>T</code> with a normal distribution with mean <code>mT</code> and standard deviation <code>sT</code>:</p>
<pre># Density estimate:
d <- density(Ct[T, ], from = -.5, to = .8)
# Normal distribution with our estimated mean/sd (volatility):
y <- dnorm(d$x, mT, sT)
# Plot:
op <- par(mar = rep(5, 4))
plot(d$x, d$y, type = "l", xlim = c(-.5, .8), cex.lab = .7,
cex.axis = .7, cex.main = .8, main = "Figure 2")
lines(d$x, y, col = "red")
par(op)
</pre>
<p>It should look like this:</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQRotmfsAcq37_MKjE-Q2vf4N__MGlMMpeSTfMcO3hNr-BnTEmh0GkjBlKHzEWrivYclxuk56MCyDhk8Q2rqOeIb0llnsIMD-9bpVz32U8qmrAqA3BJ7snBV-rEjb-lTeH5ro4ec7TfUo/s1600/02.png" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQRotmfsAcq37_MKjE-Q2vf4N__MGlMMpeSTfMcO3hNr-BnTEmh0GkjBlKHzEWrivYclxuk56MCyDhk8Q2rqOeIb0llnsIMD-9bpVz32U8qmrAqA3BJ7snBV-rEjb-lTeH5ro4ec7TfUo/s1600/02.png" width="500" id="id_4be6_2113_8614_912a" style="width: 500px; height: auto;"></a></div>
<p>Pretty close right?</p>
<p>From this, one can compute the probability associated with any level of return and it is clear that the higher the volatility, the more likely you are to face losses [3].</p>
<h3>Takeaways</h3>
<p>First and should you only remember one thing from that post: a volatility should always be computed using continuous (a.k.a log) returns. Any other calculation is <em>false</em>. Period.</p>
<p>Second, most financial models don’t assume anything about the distribution of (say) daily returns: saying that, after $T$ periods, the distribution will be normally distributed is just a consequence of the CLT.</p>
<p>Lastly, the whole random walk thing is based on just two assumptions (i and ii); if you’re looking for weeknesses, this is where you should start.</p>
<p>---
<br>[1] Jules Augustin Frédéric Regnault, a French stock broker who first suggested the concept of a random walk of prices in 1863.
<br>[2] Named after Irénée-Jules Bienaymé (1796-1878), one of the last great French statisticians.
<br>[3] For price probabilities, you'll need to use the corresponding log-normal distribution (see <code>?dlnorm</code>).</p>
Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com13tag:blogger.com,1999:blog-6602717398228748861.post-19811657110659085652018-01-23T12:24:00.000+01:002018-01-23T13:36:35.016+01:00Querying FRED from R<p>FRED is an <a href="https://fred.stlouisfed.org/" target="_blank">amazingly useful website</a> provided by the Federal Reserve Bank of St. Louis compiling over 500k time series from 87 different sources. Here are 2 short R functions to retrieve FRED data in R. You'll need <code>rjson</code> (with admin privileges : <code>install.packages("rjson")</code>) and a valid API key (<a href="https://research.stlouisfed.org/useraccount/register" target="_blank">register for free here</a>) to run them.</p>
<p><code>iFRED</code> returns basic information about a time series as a list. For instance, assuming you’re interested by the <a href="https://fred.stlouisfed.org/series/RU1000TR" target="_blank">Russell 1000 index Total Market Index</a> (<code>RU1000TR</code>):</p>
<pre>> sid <- "RU1000TR"
> iFRED(sid)
$id
[1] "RU1000TR"
$realtime_start
[1] "2018-01-23"
$realtime_end
[1] "2018-01-23"
(...)
</pre>
<p><code>qFRED</code> retrieves the time series itself as a matrix (with dates as row names). Id addition to <code>sid</code>, there are 6 other optional argument:</p>
<ul>
<li><p><code>from</code>: the start date as a <code>Date</code> object (defaults to <code>1776-07-04</code>);</li>
<li><p><code>to</code>: the end date as a <code>Date</code> object (defaults to <code>Sys.Date()</code>);</li>
<li><p><code>units</code>: one of <code>lin</code> (levels, the default), <code>chg</code> (change), <code>ch1</code> (change from one year ago), <code>pch</code> (percent change), <code>pc1</code> (percent change from one year ago), <code>pca</code> (compounded annual rate of change), <code>cch</code> (continuously compounded rate of change), <code>cca</code> (continuously compounded annual rate of change) or <code>log</code> (natural log);</li>
<li><p><code>freq</code>: one of <code>d</code> (daily, the default), <code>w</code> (weekly), <code>bw</code>(bi-weekly), <code>m</code> (monthly), <code>q</code> (quarterly), <code>sa</code> (semiannual), <code>a</code> (annual), <code>wef</code> (weekly ending Friday), <code>weth</code> (weekly ending Thursday), <code>wew</code> (weekly ending Wednesday), <code>wetu</code> (weekly ending Tuesday), <code>wem</code> (weekly ending Monday), <code>wesu</code> (weekly ending Sunday), <code>wesa</code> (weekly ending Saturday), <code>bwew</code> (bi-weekly ending wednesday) or <code>bwem</code> (bi-weekly ending Monday).</li>
<li><p><code>aggreg</code>: when using <code>freq</code>, how should data be aggregated? One of <code>eop</code> (end of period, the default), <code>avg</code> (average) or <code>sum</code> (sum)</li>
<li><p><code>na.rm</code>: logical, should missing values (<code>NA</code>s) be removed from the output?</li>
</ul>
<p>For instance, always with <code>RU1000TR</code>:</p>
<pre>> from <- as.Date("2018-01-01")
> qFRED(sid, from)
RU1000TR
2018-01-01 NA
2018-01-02 8346.42
2018-01-03 8398.08
2018-01-04 8431.26
2018-01-05 8487.97
2018-01-08 8504.18
(...)</pre>
<p>Let's say you want weekly data with end-of-the-period observations:</p>
<pre>> qFRED(sid, from, freq = "w", aggreg = "eop")
RU1000TR
2018-01-05 8487.97
2018-01-12 8624.19
2018-01-19 8698.12
2018-01-26 NA</pre>
<p>Same thing but with weekly averages:</p>
<pre>> qFRED(sid, from, freq = "w", aggreg = "avg")
RU1000TR
2018-01-05 8415.93
2018-01-12 8543.91
2018-01-19 8653.44
2018-01-26 NA</pre>
<p>Percent change from one year ago:</p>
<pre>> qFRED(sid, from, units = "pc1")
RU1000TR
2018-01-01 NA
2018-01-02 21.66084
2018-01-03 21.54941
2018-01-04 22.16739
2018-01-05 22.54979
2018-01-08 23.23220
(...)</pre>
<p>The code is <a href="https://github.com/gnicoulaud/FRED" target="_blank">on Github</a>. Don't forget to replace <code>.FRED_api_key</code> with your own API key!</p>Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com0tag:blogger.com,1999:blog-6602717398228748861.post-21403010159698834312018-01-22T11:31:00.000+01:002018-01-23T11:11:34.536+01:00ChallengeR #6<p>Votre <a href='http://ordrespontane.blogspot.fr/2018/01/challenger-5.html' target='_blank'>dernière mission</a> consistait à coder le tricheur parfait dans <a href='http://ordrespontane.blogspot.fr/2018/01/axelrod-le-tournois.html' target='_blank'>mon petit tournois d’algos</a> pour un dilemme du prisonnier répété.</p>
<p>Et le gagnant est <a href='https://twitter.com/AlekVladNevski' target='_blank'>@AlekVladNevski</a> qui nous propose une fonction (ici un peu reprise par mes soins) qui va modifier la matrice des paiements :</p>
<pre>msp = function(p, o, n = 2000) {
z <- if(match.call()[[1]]=='f1') c(5, 0) else c(0, 5)
m <- rep(z, each = 4)
dim(m) <- rep(2,3)
assign("m", m, envir = parent.frame(n=1))
return(FALSE)
}</pre>
<h4>Challenger #6</h4>
<p>Votre mission, si vous l’acceptez consiste à coder une fonction <code>nbchar</code> qui compte le nombre de caractères du <em>corps</em> d’une autre fonction R, sans tenir compte des espaces, des indentations et des retours à la ligne. Par exemple, avec :<p>
<pre>area = function(radius) {
radius * pi^2
}</pre>
<p>Vous devriez vérifier que :</p>
<pre>> nbchar(area)
[1] 11
></pre>
<p>C’est la fonction pour laquelle <code>nbchar(nbchar)</code> sera le plus petit qui remportera ce challenge. Vous avez jusqu'au vendredi 26 janvier ; soumettez vos réponses ci-dessous :</p>
<form id="code_form" action="https://script.google.com/macros/s/AKfycbwwRKRjUzz-7i22ULA-4OK1qRFI3du9bpEwkAPsPICZThxUVsw-/exec">
<input type="hidden" id="challenge" name="challenge" value="C6">
Votre @username sur Twitter :<br>
<input type="text" name="username" id="username" style="width:200px"><br>
<br>
Coller votre code ici :<br>
<textarea name="rcode" id="rcode" style="width:100%; height:200px"></textarea><br>
<br>
<input type="submit" id="submit_code" value="Valider">
</form>
<p><span id="confirm_msg">Validez pour enregistrer votre réponse.</span></p>
<!-- jQuery / JavaScript -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
// References:
var $form = $('#code_form');
var $conf = $('#confirm_msg');
var $subm = $('#submit_code');
// Submit function:
$form.submit(function(){
$.post($(this).attr('action'), $(this).serialize(), function(response){
// On success, clear all inputs;
$form.trigger('reset');
// Write a confirmation message:
$conf.html("Réponse enregistrée !");
// Disable the submit button:
$subm.prop('disabled', true);
},'json');
return false;
});
});
</script>Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com0tag:blogger.com,1999:blog-6602717398228748861.post-76036266791288575942018-01-21T18:48:00.000+01:002018-01-22T08:43:20.143+01:00HTML form to Google Sheet<p>I’ve been trying to figure out how to do this for a while so maybe it will be useful to someone else. I want to create an HTML form here that sends all the inputs to a google sheet. Demo:</p>
<p>Here is the form:</p>
<form id="myForm" action="https://script.google.com/macros/s/AKfycby9GRGPdEXhwT5OEJ9kf8Qt8OgC7pdni8R1GyXABNnKqBN4AHw/exec">
First Name:<br>
<input type="text" name="firstname" style="width:200px"><br>
Last Name:<br>
<input type="text" name="lastname" style="width:200px"><br>
<br>
<input type="submit" id="mySubmit" value="Submit">
</form>
<!-- This is where the confirmation message goes after submission -->
<p><span id="myConf">This is where the confirmation message will appear after submission.</span></p>
<p>And it all ends up <a href="https://docs.google.com/spreadsheets/d/1BHAwgtCV7aX8z2a6qJBxtBIcsqN3-sr0Ud6BqLTfQu4/edit?usp=sharing" target="_blank">in that sheet</a>.
<p>Worked? So here is how to do it:</p>
<p>First, quite obviously, you need and HMTL form. Here's mine:</p>
<script src="https://gist.github.com/gnicoulaud/d247741b2958ac7affe7931b43799ed0.js"></script>
<p>We'll need to update the <code>link_to_google_script</code> thing after next step.</p>
<p>Then we need a Google Sheet. Go to your Google Drive, create one and save its ID somewhere (that the long string in the url between <code>d/</code> and <code>/edit</code>).</p>
<p>Now, still in Google Drive, create a new Google Apps Script, remove any code in there and relace it with this:</p></p>
<script src="https://gist.github.com/gnicoulaud/c030cc44c854c2f79c88accacb3bba2b.js"></script>
<p>Just replace the <code>id_of_your_google_sheet</code> with the ID of your own sheet.</p>
<p>Once done, save you script, select Publish, Deploy as web app, make sure that "anyone, even anonymous" has access to the app and Publish. After a bit of authorization procedures, you should get this:</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNgNhfId87YolW3EhdBvqF9eJzYRHiwqFsR745to_lpY_PKTJmLySWRCjEv4bjz0CHBNLfmelt64nr1xN6SxzDXJgPdOHcPiMdLDBhaYEweNk2AlVMecTAPmaRuzikb9cxjjN4BA2bxOo/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNgNhfId87YolW3EhdBvqF9eJzYRHiwqFsR745to_lpY_PKTJmLySWRCjEv4bjz0CHBNLfmelt64nr1xN6SxzDXJgPdOHcPiMdLDBhaYEweNk2AlVMecTAPmaRuzikb9cxjjN4BA2bxOo/s1600/01.png" data-original-width="446" data-original-height="267" /></a></div>
<p>Copy that link and paste it in your HTML instead of <code>link_to_google_script</code> then add at the bottom of your HTML page:</p>
<script src="https://gist.github.com/gnicoulaud/5c143329052205e5f4bab0defd7ec8a8.js"></script>
<p>Here you go, it should be working!</p>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
// References:
var $form = $('#myForm');
var $conf = $('#myConf');
var $subm = $('#mySubmit');
var $impt = $form.find(':input').not(':button, :submit, :reset, :hidden');
// Submit function:
$form.submit(function(){
$.post($(this).attr('action'), $(this).serialize(), function(response){
// On success, clear all inputs;
$impt.val('').attr('value','').removeAttr('checked').removeAttr('selected');
// Write a confirmation message:
$conf.html("Submitted!");
// Disable the submit button:
$subm.prop('disabled', true);
},'json');
return false;
});
});
</script>Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com36tag:blogger.com,1999:blog-6602717398228748861.post-9383897145094049332018-01-19T15:29:00.000+01:002018-01-23T10:28:35.189+01:00ChallengeR #5<p>Votre <a href='http://ordrespontane.blogspot.fr/2018/01/challenger-4.html' target='_blank'>dernière mission</a> consistait à trouver la fonction <code>locf</code> (qui remplace les <code>NA</code> par la dernière valeur connue) la plus compacte possible (étant bien entendu, comme d'habitude, que les espaces, les indentations et les retours à la ligne ne sont pas considérés comme des caractères). L’exemple que je vous ai donné était le suivant :</p>
<pre>> x <- 10:20
> x[5:6] <- NA
> locf(x)
[1] 10 11 12 13 13 13 16 17 18 19 20
></pre>
<p>Ce faisant, j’ai commis une petite erreur : j’aurais dû préciser que <code>locf</code> devrait aussi faire ça :</p>
<pre>> x <- 10:20
> x[c(1:2, 5:6)] <- NA
> locf(x)
[1] NA NA 12 13 13 13 16 17 18 19 20
></pre>
<p>En tenant compte de cet oubli de ma part, vous êtes deux à remporter ce 4ème ChallengeR avec un corps de fonction d’à peine 34 caractères.</p>
<p>La première solution est de <a href='https://twitter.com/dickoah' target='_blank'>@dickoah</a> :</p>
<pre>locf = function(x) {
x[cummax((!is.na(x)) * 1:length(x))]
}</pre>
<p>La seconde, qui présente l'avantage de traiter les <code>NA</code> en début de vecteur, nous est proposée par <a href='https://twitter.com/navarre_julien' target='_blank'>@navarre_julien</a> :</p>
<pre>locf = function(x) {
i = !is.na(x)
c(NA, x[i])[cumsum(i)+1]
}</pre>
<p>Notez que, pour répondre strictement à mon énoncé (et donc sans supporter les <code>NA</code> en début de vecteur), on pouvait raccourcir la version de Julien comme suit :</p>
<pre>locf = function(x) {
i = !is.na(x)
x[i][cumsum(i)]
}</pre>
<p>La fonction <code>locf</code> idéale est donc quelque chose du genre :</p>
<pre>locf = function(x) {
if(is.matrix(x)) {
res <- apply(x, 2, locf)
} else {
i <- !is.na(x)
res <- c(NA, x[i])[cumsum(i)+1]
}
res
}</pre>
<p>Bravo à tous les deux ! Voici donc ChallengeR, 5ème du nom.</p>
<p>Votre mission, si vous l’acceptez, consiste à coder le tricheur parfait dans <a href='http://ordrespontane.blogspot.fr/2018/01/axelrod-le-tournois.html' target='_blank'>mon petit tournois d’algos</a> pour un dilemme du prisonnier répété. Vous devez concevoir une fonction de la forme :</p>
<pre>msp = function(p, o, n = 2000) {
# faire quelque chose...
return(res)
}</pre>
<p>De telle sorte qu’elle pulvérise tous les records en trichant vilement. <b>Edit :</b> Tout le code est accessible <a href='https://github.com/gnicoulaud/axelrod' target='_blank'>sur Github</a>.</p>
Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com0tag:blogger.com,1999:blog-6602717398228748861.post-24887195283858926532018-01-18T16:58:00.000+01:002018-01-23T10:28:42.943+01:00ChallengeR #4<p>Bon, vous êtes non seulement forts mais vous êtes en plus de grands malades. Votre <a href='http://ordrespontane.blogspot.fr/2018/01/challenger-3.html' target='_blank'>dernière mission</a> consistait à trouver une fonction R qui renvoie la suite de Syracuse de n'importe quel entier <code>x</code> jusqu'à ce qu'elle atteigne 1. Il y a deux façons de faire ça :</p>
<p>En passant par une fonction récursive :</p>
<pre>syracuse = function(x) {
a <- tail(x, 1)
if(a == 1) {
return(x)
} else {
syracuse(c(x, ifelse(a%%2, a*3+1, a/2)))
}
}</pre>
<p>Ou en passant par une fonction récursive <em>anonyme</em> :</p>
<pre>syracuse = function(x) {
a <- tail(x, 1)
if(a == 1) {
return(x)
} else {
Recall(c(x, ifelse(a%%2, a*3+1, a/2)))
}
}</pre>
<p>Je dis que vous êtes des grands malades parce que, sur Twitter, vous avez assez rapidement décidé de trouver la fonction la plus condensée possible (sans parler de celui qui voulait faire ça sans <code>if</code> ni <code>else</code>). Du coup, je vous donne la version la plus courte, trouvée par <a href='https://twitter.com/alekvladnevski' target='_blank'>@AlekVladNevski</a> :</p>
<pre>syracuse = function(x) {
c(x, if(x>1) Recall(if(x%%2) x*3+1 else x/2 ))
}</pre>
<p>Bravo à <a href='https://twitter.com/_antoineb' target='_blank'>@_antoineb</a>, <a href='https://twitter.com/_pvictorr' target='_blank'>@_pvictorr</a>, <a href='https://twitter.com/After_Eight' target='_blank'>@After_Eight</a>, <a href='https://twitter.com/AlekVladNevski' target='_blank'>@AlekVladNevski</a>, <a href='https://twitter.com/bZ1O91' target='_blank'>@bZ1O91</a>, <a href='https://twitter.com/ClementinC' target='_blank'>@ClementinC</a>, <a href='https://twitter.com/dickoah' target='_blank'>@dickoah</a>, <a href='https://twitter.com/francois_ls' target='_blank'>@francois_ls</a>, <a href='https://twitter.com/mac_picsou' target='_blank'>@mac_picsou</a>, <a href='https://twitter.com/NicolasBenezet' target='_blank'>@NicolasBenezet</a>, <a href='https://twitter.com/PierreRinder' target='_blank'>@PierreRinder</a>, <a href='https://twitter.com/privefl' target='_blank'>@privefl</a>, <a href='https://twitter.com/StephaneOrlins' target='_blank'>@StephaneOrlins</a> et <a href='https://twitter.com/thedudeparis' target='_blank'>@thedudeparis</a>.</p>
<p>Nous allons donc pouvoir passer à l'étape 4.</p>
<p>Considérez le vecteur <code>x</code> suivant :</p>
<pre>x <- 10:20
x[5:6] <- NA</pre>
<p>Votre mission, si vous l’acceptez, consiste à coder trouver la fonction <code>locf</code> (pour <em>Last Observation Copied Forward</em>) qui, comme son nom le suggère, remplace les <code>NA</code> par la dernière observation connue :</p>
<pre>> locf(x)
[1] 10 11 12 13 13 13 16 17 18 19 20
></pre>
<p>Le gagnant sera celui qui proposera la fonction qui utilise le moins de caractères possibles (étant entendu que les espaces, les indentations et autres retours à la ligne ne son *pas* considérés comme des caractères).</p>
Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com3tag:blogger.com,1999:blog-6602717398228748861.post-70905694443999164932018-01-17T18:04:00.004+01:002023-05-04T16:18:06.884+02:00Iterated prisoner’s dilemma<script>
function player(mid, p_move) {
var round = parseInt(document.getElementById(mid+'_count').innerHTML);
var numrounds = 10;
var o_move, p_pts, o_pts, tscore;
var p_sco = parseInt(document.getElementById(mid+'_p_sco').innerHTML);
var o_sco = parseInt(document.getElementById(mid+'_o_sco').innerHTML);
if(round != 0) {
// Opponents
if(mid === 'm1') {
var opp = 'Always Defects';
o_move = 'D';
}
if(mid === 'm2') {
var opp = 'Tit-for-Tat';
if(round === 1) {
o_move = 'C';
} else {
o_move = document.getElementById(mid+'_p'+(round-1)).innerHTML;
}
}
if(mid === 'm3') {
var opp = 'Grudger';
if(round === 1) {
o_move = 'C';
} else {
o_move = 'C';
for (i = 1; i < round; i++) {
var tmp = document.getElementById(mid+'_p'+i).innerHTML;
if(tmp === 'D') {
o_move = 'D'
}
}
}
}
if(mid === 'm4') {
var opp = 'Always Cooperates';
o_move = 'C';
}
if(mid === 'm5') {
var opp = 'Detective';
if(round < 4) {
if(round === 2) {
o_move = 'D';
} else {
o_move = 'C';
}
} else {
var tmp = document.getElementById(mid+'_p'+3).innerHTML;
if(tmp === 'D') {
o_move = document.getElementById(mid+'_p'+(round-1)).innerHTML;
} else {
o_move = 'D'
}
}
}
if(mid === 'm6') {
var opp = 'Random';
var tmp = Math.round(Math.random());
if(tmp === 0) {
o_move = 'D';
} else {
o_move = 'C';
}
}
if(mid === 'm7') {
var opp = 'Win-Stay-Lose-Shift';
if(round === 1) {
o_move = 'C';
} else {
var tmp1 = document.getElementById(mid+'_p'+(round-1)).innerHTML;
var tmp2 = document.getElementById(mid+'_o'+(round-1)).innerHTML;
if(tmp1 === 'D') {
if(tmp2 === 'D') {
o_move = 'C';
} else {
o_move = 'D';
}
} else {
o_move = tmp2;
}
}
}
if(mid === 'm8') {
var opp = 'Tit-For-Two-Tats';
if(round > 2) {
var tmp1 = document.getElementById(mid+'_p'+(round-1)).innerHTML;
var tmp2 = document.getElementById(mid+'_p'+(round-2)).innerHTML;
if(tmp1 === 'D' && tmp2 === 'D') {
o_move = 'D';
} else {
o_move = 'C';
}
} else {
o_move = 'C';
}
}
if(mid === 'm9') {
var opp = 'Alternates';
if(round === 1) {
o_move = 'D';
} else {
var tmp = document.getElementById(mid+'_o'+(round-1)).innerHTML;
if(tmp === 'C') {
o_move = 'D';
} else {
o_move = 'C';
}
}
}
// Points
if(p_move === 'C') {
if(o_move === 'C') {
p_pts = 3;
o_pts = 3;
} else {
p_pts = 0;
o_pts = 5;
}
} else {
if(o_move === 'C') {
p_pts = 5;
o_pts = 0;
} else {
p_pts = 1;
o_pts = 1;
}
}
// Input moves & points in table
document.getElementById(mid+'_p'+round).innerHTML = p_move;
document.getElementById(mid+'_o'+round).innerHTML = o_move;
document.getElementById(mid+'_p_sco').innerHTML = p_sco+p_pts;
document.getElementById(mid+'_o_sco').innerHTML = o_sco+o_pts;
tscore = parseInt(document.getElementById('tscore').innerHTML);
document.getElementById('tscore').innerHTML = tscore+p_pts;
if(round === numrounds) {
document.getElementById(mid+'_count').innerHTML = 0;
document.getElementById(mid+'_opp').innerHTML = opp;
document.getElementById(mid+'_conf').innerHTML = 'You were playing against *'+opp+'*.';
} else {
document.getElementById(mid+'_count').innerHTML = round+1;
}
}
}
</script>
<p>This is an <a href="https://en.wikipedia.org/wiki/Prisoner%27s_dilemma#The_iterated_prisoner's_dilemma" target='_blank'>iterated prisoner’s dilemma</a> between yourself and 9 unknown opponents. Each match will last for 10 rounds and you’ll only know who was your opponent at the end of the match. For each round, you must choose between <em>Cooperate</em> (C) or <em>Defect</em> (D).</p>
<p>The payment matrix is :</p>
<table style="width:200px">
<tr>
<td style="text-align:center; width:100px"></td>
<td style="text-align:center; width:100px"><b>C</b></td>
<td style="text-align:center; width:100px"><b>D</b></td>
</tr>
<tr>
<td style="text-align:center; width:100px"><b>C</b></td>
<td style="text-align:center; width:100px">[3,3]</td>
<td style="text-align:center; width:100px">[0,5]</td>
</tr>
<tr>
<td style="text-align:center; width:100px"><b>D</b></td>
<td style="text-align:center; width:100px">[5,0]</td>
<td style="text-align:center; width:100px">[1,1]</td>
</tr>
</table>
<p>In words:</p>
<ul>
<li>If you both cooperate ([C,C]), you'll get 3 points each;</li>
<li>If you cooperate while your opponent defects ([C, D]), you'll get 0 points but he'll get 5 points;</li>
<li>If you defect while your opponent cooperates ([D, C]), you'll get 5 points and he'll get nothing;</li>
<li>If you both defect ([D,D]), you'll get 1 point each.</li>
</ul>
<p>The number of points earned by each of you during one specific match are calculated at the bottom of the tables and you'll get you total score at the end of the post.</p>
<p>Ready? Let's start!</p>
<h5>Match 1</h5>
<p>This is round <span id="m1_count">1</span>. <span id="m1_conf">What do you do?</span></p>
<button name="cooperate" onclick="player('m1', 'C')" style="width:100px">Cooperate</button>
<button name="default" onclick="player('m1','D')" style="width:100px">Defect</button><br><br>
<table style="width:200px">
<tr>
<td style="text-align:center; width:100px"><em>You</em></td>
<td style="text-align:center; width:100px"><em><span id="m1_opp">Opponent</span></em></td>
</tr>
<tr>
<td id="m1_p1" style="text-align:center">-</td>
<td id="m1_o1" style="text-align:center">-</td>
</tr>
<tr>
<td id="m1_p2" style="text-align:center">-</td>
<td id="m1_o2" style="text-align:center">-</td>
</tr>
<tr>
<td id="m1_p3" style="text-align:center">-</td>
<td id="m1_o3" style="text-align:center">-</td>
</tr>
<tr>
<td id="m1_p4" style="text-align:center">-</td>
<td id="m1_o4" style="text-align:center">-</td>
</tr>
<tr>
<td id="m1_p5" style="text-align:center">-</td>
<td id="m1_o5" style="text-align:center">-</td>
</tr>
<tr>
<td id="m1_p6" style="text-align:center">-</td>
<td id="m1_o6" style="text-align:center">-</td>
</tr>
<tr>
<td id="m1_p7" style="text-align:center">-</td>
<td id="m1_o7" style="text-align:center">-</td>
</tr>
<tr>
<td id="m1_p8" style="text-align:center">-</td>
<td id="m1_o8" style="text-align:center">-</td>
</tr>
<tr>
<td id="m1_p9" style="text-align:center">-</td>
<td id="m1_o9" style="text-align:center">-</td>
</tr>
<tr>
<td id="m1_p10" style="text-align:center">-</td>
<td id="m1_o10" style="text-align:center">-</td>
</tr>
<tr>
<td id="m1_p_sco" style="text-align:center">0</td>
<td id="m1_o_sco" style="text-align:center">0</td>
</tr>
</table>
<h5>Match 2</h5>
<p>This is round <span id="m2_count">1</span>. <span id="m2_conf">What do you do?</span></p>
<button name="cooperate" onclick="player('m2', 'C')" style="width:100px">Cooperate</button>
<button name="default" onclick="player('m2','D')" style="width:100px">Defect</button><br><br>
<table style="width:200px">
<tr>
<td style="text-align:center; width:100px"><em>You</em></td>
<td style="text-align:center; width:100px"><em><span id="m2_opp">Opponent</span></em></td>
</tr>
<tr>
<td id="m2_p1" style="text-align:center">-</td>
<td id="m2_o1" style="text-align:center">-</td>
</tr>
<tr>
<td id="m2_p2" style="text-align:center">-</td>
<td id="m2_o2" style="text-align:center">-</td>
</tr>
<tr>
<td id="m2_p3" style="text-align:center">-</td>
<td id="m2_o3" style="text-align:center">-</td>
</tr>
<tr>
<td id="m2_p4" style="text-align:center">-</td>
<td id="m2_o4" style="text-align:center">-</td>
</tr>
<tr>
<td id="m2_p5" style="text-align:center">-</td>
<td id="m2_o5" style="text-align:center">-</td>
</tr>
<tr>
<td id="m2_p6" style="text-align:center">-</td>
<td id="m2_o6" style="text-align:center">-</td>
</tr>
<tr>
<td id="m2_p7" style="text-align:center">-</td>
<td id="m2_o7" style="text-align:center">-</td>
</tr>
<tr>
<td id="m2_p8" style="text-align:center">-</td>
<td id="m2_o8" style="text-align:center">-</td>
</tr>
<tr>
<td id="m2_p9" style="text-align:center">-</td>
<td id="m2_o9" style="text-align:center">-</td>
</tr>
<tr>
<td id="m2_p10" style="text-align:center">-</td>
<td id="m2_o10" style="text-align:center">-</td>
</tr>
<tr>
<td id="m2_p_sco" style="text-align:center">0</td>
<td id="m2_o_sco" style="text-align:center">0</td>
</tr>
</table>
<h5>Match 3</h5>
<p>This is round <span id="m3_count">1</span>. <span id="m3_conf">What do you do?</span></p>
<button name="cooperate" onclick="player('m3', 'C')" style="width:100px">Cooperate</button>
<button name="default" onclick="player('m3','D')" style="width:100px">Defect</button><br><br>
<table style="width:200px">
<tr>
<td style="text-align:center; width:100px"><em>You</em></td>
<td style="text-align:center; width:100px"><em><span id="m3_opp">Opponent</span></em></td>
</tr>
<tr>
<td id="m3_p1" style="text-align:center">-</td>
<td id="m3_o1" style="text-align:center">-</td>
</tr>
<tr>
<td id="m3_p2" style="text-align:center">-</td>
<td id="m3_o2" style="text-align:center">-</td>
</tr>
<tr>
<td id="m3_p3" style="text-align:center">-</td>
<td id="m3_o3" style="text-align:center">-</td>
</tr>
<tr>
<td id="m3_p4" style="text-align:center">-</td>
<td id="m3_o4" style="text-align:center">-</td>
</tr>
<tr>
<td id="m3_p5" style="text-align:center">-</td>
<td id="m3_o5" style="text-align:center">-</td>
</tr>
<tr>
<td id="m3_p6" style="text-align:center">-</td>
<td id="m3_o6" style="text-align:center">-</td>
</tr>
<tr>
<td id="m3_p7" style="text-align:center">-</td>
<td id="m3_o7" style="text-align:center">-</td>
</tr>
<tr>
<td id="m3_p8" style="text-align:center">-</td>
<td id="m3_o8" style="text-align:center">-</td>
</tr>
<tr>
<td id="m3_p9" style="text-align:center">-</td>
<td id="m3_o9" style="text-align:center">-</td>
</tr>
<tr>
<td id="m3_p10" style="text-align:center">-</td>
<td id="m3_o10" style="text-align:center">-</td>
</tr>
<tr>
<td id="m3_p_sco" style="text-align:center">0</td>
<td id="m3_o_sco" style="text-align:center">0</td>
</tr>
</table>
<h5>Match 4</h5>
<p>This is round <span id="m4_count">1</span>. <span id="m4_conf">What do you do?</span></p>
<button name="cooperate" onclick="player('m4', 'C')" style="width:100px">Cooperate</button>
<button name="default" onclick="player('m4','D')" style="width:100px">Defect</button><br><br>
<table style="width:200px">
<tr>
<td style="text-align:center; width:100px"><em>You</em></td>
<td style="text-align:center; width:100px"><em><span id="m4_opp">Opponent</span></em></td>
</tr>
<tr>
<td id="m4_p1" style="text-align:center">-</td>
<td id="m4_o1" style="text-align:center">-</td>
</tr>
<tr>
<td id="m4_p2" style="text-align:center">-</td>
<td id="m4_o2" style="text-align:center">-</td>
</tr>
<tr>
<td id="m4_p3" style="text-align:center">-</td>
<td id="m4_o3" style="text-align:center">-</td>
</tr>
<tr>
<td id="m4_p4" style="text-align:center">-</td>
<td id="m4_o4" style="text-align:center">-</td>
</tr>
<tr>
<td id="m4_p5" style="text-align:center">-</td>
<td id="m4_o5" style="text-align:center">-</td>
</tr>
<tr>
<td id="m4_p6" style="text-align:center">-</td>
<td id="m4_o6" style="text-align:center">-</td>
</tr>
<tr>
<td id="m4_p7" style="text-align:center">-</td>
<td id="m4_o7" style="text-align:center">-</td>
</tr>
<tr>
<td id="m4_p8" style="text-align:center">-</td>
<td id="m4_o8" style="text-align:center">-</td>
</tr>
<tr>
<td id="m4_p9" style="text-align:center">-</td>
<td id="m4_o9" style="text-align:center">-</td>
</tr>
<tr>
<td id="m4_p10" style="text-align:center">-</td>
<td id="m4_o10" style="text-align:center">-</td>
</tr>
<tr>
<td id="m4_p_sco" style="text-align:center">0</td>
<td id="m4_o_sco" style="text-align:center">0</td>
</tr>
</table>
<h5>Match 5</h5>
<p>This is round <span id="m5_count">1</span>. <span id="m5_conf">What do you do?</span></p>
<button name="cooperate" onclick="player('m5', 'C')" style="width:100px">Cooperate</button>
<button name="default" onclick="player('m5','D')" style="width:100px">Defect</button><br><br>
<table style="width:200px">
<tr>
<td style="text-align:center; width:100px"><em>You</em></td>
<td style="text-align:center; width:100px"><em><span id="m5_opp">Opponent</span></em></td>
</tr>
<tr>
<td id="m5_p1" style="text-align:center">-</td>
<td id="m5_o1" style="text-align:center">-</td>
</tr>
<tr>
<td id="m5_p2" style="text-align:center">-</td>
<td id="m5_o2" style="text-align:center">-</td>
</tr>
<tr>
<td id="m5_p3" style="text-align:center">-</td>
<td id="m5_o3" style="text-align:center">-</td>
</tr>
<tr>
<td id="m5_p4" style="text-align:center">-</td>
<td id="m5_o4" style="text-align:center">-</td>
</tr>
<tr>
<td id="m5_p5" style="text-align:center">-</td>
<td id="m5_o5" style="text-align:center">-</td>
</tr>
<tr>
<td id="m5_p6" style="text-align:center">-</td>
<td id="m5_o6" style="text-align:center">-</td>
</tr>
<tr>
<td id="m5_p7" style="text-align:center">-</td>
<td id="m5_o7" style="text-align:center">-</td>
</tr>
<tr>
<td id="m5_p8" style="text-align:center">-</td>
<td id="m5_o8" style="text-align:center">-</td>
</tr>
<tr>
<td id="m5_p9" style="text-align:center">-</td>
<td id="m5_o9" style="text-align:center">-</td>
</tr>
<tr>
<td id="m5_p10" style="text-align:center">-</td>
<td id="m5_o10" style="text-align:center">-</td>
</tr>
<tr>
<td id="m5_p_sco" style="text-align:center">0</td>
<td id="m5_o_sco" style="text-align:center">0</td>
</tr>
</table>
<h5>Match 6</h5>
<p>This is round <span id="m6_count">1</span>. <span id="m6_conf">What do you do?</span></p>
<button name="cooperate" onclick="player('m6', 'C')" style="width:100px">Cooperate</button>
<button name="default" onclick="player('m6','D')" style="width:100px">Defect</button><br><br>
<table style="width:200px">
<tr>
<td style="text-align:center; width:100px"><em>You</em></td>
<td style="text-align:center; width:100px"><em><span id="m6_opp">Opponent</span></em></td>
</tr>
<tr>
<td id="m6_p1" style="text-align:center">-</td>
<td id="m6_o1" style="text-align:center">-</td>
</tr>
<tr>
<td id="m6_p2" style="text-align:center">-</td>
<td id="m6_o2" style="text-align:center">-</td>
</tr>
<tr>
<td id="m6_p3" style="text-align:center">-</td>
<td id="m6_o3" style="text-align:center">-</td>
</tr>
<tr>
<td id="m6_p4" style="text-align:center">-</td>
<td id="m6_o4" style="text-align:center">-</td>
</tr>
<tr>
<td id="m6_p5" style="text-align:center">-</td>
<td id="m6_o5" style="text-align:center">-</td>
</tr>
<tr>
<td id="m6_p6" style="text-align:center">-</td>
<td id="m6_o6" style="text-align:center">-</td>
</tr>
<tr>
<td id="m6_p7" style="text-align:center">-</td>
<td id="m6_o7" style="text-align:center">-</td>
</tr>
<tr>
<td id="m6_p8" style="text-align:center">-</td>
<td id="m6_o8" style="text-align:center">-</td>
</tr>
<tr>
<td id="m6_p9" style="text-align:center">-</td>
<td id="m6_o9" style="text-align:center">-</td>
</tr>
<tr>
<td id="m6_p10" style="text-align:center">-</td>
<td id="m6_o10" style="text-align:center">-</td>
</tr>
<tr>
<td id="m6_p_sco" style="text-align:center">0</td>
<td id="m6_o_sco" style="text-align:center">0</td>
</tr>
</table>
<h5>Match 7</h5>
<p>This is round <span id="m7_count">1</span>. <span id="m7_conf">What do you do?</span></p>
<button name="cooperate" onclick="player('m7', 'C')" style="width:100px">Cooperate</button>
<button name="default" onclick="player('m7','D')" style="width:100px">Defect</button><br><br>
<table style="width:200px">
<tr>
<td style="text-align:center; width:100px"><em>You</em></td>
<td style="text-align:center; width:100px"><em><span id="m7_opp">Opponent</span></em></td>
</tr>
<tr>
<td id="m7_p1" style="text-align:center">-</td>
<td id="m7_o1" style="text-align:center">-</td>
</tr>
<tr>
<td id="m7_p2" style="text-align:center">-</td>
<td id="m7_o2" style="text-align:center">-</td>
</tr>
<tr>
<td id="m7_p3" style="text-align:center">-</td>
<td id="m7_o3" style="text-align:center">-</td>
</tr>
<tr>
<td id="m7_p4" style="text-align:center">-</td>
<td id="m7_o4" style="text-align:center">-</td>
</tr>
<tr>
<td id="m7_p5" style="text-align:center">-</td>
<td id="m7_o5" style="text-align:center">-</td>
</tr>
<tr>
<td id="m7_p6" style="text-align:center">-</td>
<td id="m7_o6" style="text-align:center">-</td>
</tr>
<tr>
<td id="m7_p7" style="text-align:center">-</td>
<td id="m7_o7" style="text-align:center">-</td>
</tr>
<tr>
<td id="m7_p8" style="text-align:center">-</td>
<td id="m7_o8" style="text-align:center">-</td>
</tr>
<tr>
<td id="m7_p9" style="text-align:center">-</td>
<td id="m7_o9" style="text-align:center">-</td>
</tr>
<tr>
<td id="m7_p10" style="text-align:center">-</td>
<td id="m7_o10" style="text-align:center">-</td>
</tr>
<tr>
<td id="m7_p_sco" style="text-align:center">0</td>
<td id="m7_o_sco" style="text-align:center">0</td>
</tr>
</table>
<h5>Match 8</h5>
<p>This is round <span id="m8_count">1</span>. <span id="m8_conf">What do you do?</span></p>
<button name="cooperate" onclick="player('m8', 'C')" style="width:100px">Cooperate</button>
<button name="default" onclick="player('m8','D')" style="width:100px">Defect</button><br><br>
<table style="width:200px">
<tr>
<td style="text-align:center; width:100px"><em>You</em></td>
<td style="text-align:center; width:100px"><em><span id="m8_opp">Opponent</span></em></td>
</tr>
<tr>
<td id="m8_p1" style="text-align:center">-</td>
<td id="m8_o1" style="text-align:center">-</td>
</tr>
<tr>
<td id="m8_p2" style="text-align:center">-</td>
<td id="m8_o2" style="text-align:center">-</td>
</tr>
<tr>
<td id="m8_p3" style="text-align:center">-</td>
<td id="m8_o3" style="text-align:center">-</td>
</tr>
<tr>
<td id="m8_p4" style="text-align:center">-</td>
<td id="m8_o4" style="text-align:center">-</td>
</tr>
<tr>
<td id="m8_p5" style="text-align:center">-</td>
<td id="m8_o5" style="text-align:center">-</td>
</tr>
<tr>
<td id="m8_p6" style="text-align:center">-</td>
<td id="m8_o6" style="text-align:center">-</td>
</tr>
<tr>
<td id="m8_p7" style="text-align:center">-</td>
<td id="m8_o7" style="text-align:center">-</td>
</tr>
<tr>
<td id="m8_p8" style="text-align:center">-</td>
<td id="m8_o8" style="text-align:center">-</td>
</tr>
<tr>
<td id="m8_p9" style="text-align:center">-</td>
<td id="m8_o9" style="text-align:center">-</td>
</tr>
<tr>
<td id="m8_p10" style="text-align:center">-</td>
<td id="m8_o10" style="text-align:center">-</td>
</tr>
<tr>
<td id="m8_p_sco" style="text-align:center">0</td>
<td id="m8_o_sco" style="text-align:center">0</td>
</tr>
</table>
<h5>Match 9</h5>
<p>This is round <span id="m9_count">1</span>. <span id="m9_conf">What do you do?</span></p>
<button name="cooperate" onclick="player('m9', 'C')" style="width:100px">Cooperate</button>
<button name="default" onclick="player('m9','D')" style="width:100px">Defect</button><br><br>
<table style="width:200px">
<tr>
<td style="text-align:center; width:100px"><em>You</em></td>
<td style="text-align:center; width:100px"><em><span id="m9_opp">Opponent</span></em></td>
</tr>
<tr>
<td id="m9_p1" style="text-align:center">-</td>
<td id="m9_o1" style="text-align:center">-</td>
</tr>
<tr>
<td id="m9_p2" style="text-align:center">-</td>
<td id="m9_o2" style="text-align:center">-</td>
</tr>
<tr>
<td id="m9_p3" style="text-align:center">-</td>
<td id="m9_o3" style="text-align:center">-</td>
</tr>
<tr>
<td id="m9_p4" style="text-align:center">-</td>
<td id="m9_o4" style="text-align:center">-</td>
</tr>
<tr>
<td id="m9_p5" style="text-align:center">-</td>
<td id="m9_o5" style="text-align:center">-</td>
</tr>
<tr>
<td id="m9_p6" style="text-align:center">-</td>
<td id="m9_o6" style="text-align:center">-</td>
</tr>
<tr>
<td id="m9_p7" style="text-align:center">-</td>
<td id="m9_o7" style="text-align:center">-</td>
</tr>
<tr>
<td id="m9_p8" style="text-align:center">-</td>
<td id="m9_o8" style="text-align:center">-</td>
</tr>
<tr>
<td id="m9_p9" style="text-align:center">-</td>
<td id="m9_o9" style="text-align:center">-</td>
</tr>
<tr>
<td id="m9_p10" style="text-align:center">-</td>
<td id="m9_o10" style="text-align:center">-</td>
</tr>
<tr>
<td id="m9_p_sco" style="text-align:center">0</td>
<td id="m9_o_sco" style="text-align:center">0</td>
</tr>
</table>
<h5>Conclusion</h5>
<p>Still there? Great!</p>
<ul>
<li><em>Always Defects</em> always defects regardless of what you do;</li>
<li><em>Tit-for-Tat</em> cooperates first and then reproduce your last move; </li>
<li><em>Grudger</em> cooperates until you defect; then defects all the time;</li>
<li><em>Always Cooperates</em> always cooperates regardless of what you do;</li>
<li><em>Detective</em> cooperates, defects, cooperates then checks what you did on the 3rd round: if you haven't retaliated, it defects all the time; otherwise it plays Tit-for-Tat;</li>
<li><em>Random</em> just cooperates or defect randomly (with a probability of 1/2);</li>
<li><em>Win-Stay-Lose-Shift</em> cooperates first then, if you've cooperated on the last round, repeat its last move; otherwise switches;</li>
<li><em>Tit-For-Two-Tats</em> same as <em>Tit-for-Tat</em> but only retaliates after two defections in a row;</li>
<li><em>Alternates</em> defects first and then just alternates regardless of what you do.</li>
</ul>
<p>Your total score is <b><span id="tscore">0</span></b> points. Please, tell me how much you've made (either in the comments below or <a href='https://twitter.com/ordrespontane' targe='_blank'>on Twitter</a>) and explain how you did it.</p>Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com7tag:blogger.com,1999:blog-6602717398228748861.post-90442553232204310672018-01-17T13:47:00.000+01:002018-01-23T10:28:50.082+01:00ChallengeR #3<p>Votre dernière mission consistait à compter le nombre de chiffres pairs du vecteur <code>x</code> avec le moins de code possible (étant bien entendu que les espaces, les indentations et les retours à la ligne ne sont pas comptés comme des caractères).</p>
<pre>x <- sample(0:9, 100, TRUE)</pre>
<p>La meilleure réponse possible était :</p>
<pre>sum(! x %% 2)</pre>
<p>... et vous êtes 14 à l'avoir trouvée. Dans l'ordre d'arrivée : <a href='https://twitter.com/thedudeparis' target='_blank'>@thedudeparis</a>, <a href='https://twitter.com/_antoineb' target='_blank'>@_antoineb</a>, <a href='https://twitter.com/_pvictorr' target='_blank'>@_pvictorr</a>, <a href='https://twitter.com/davidgohel' target='_blank'>@davidgohel</a>, <a href='https://twitter.com/loicmolinari' target='_blank'>@loicmolinari</a>, <a href='https://twitter.com/AlekVladNevski' target='_blank'>@AlekVladNevski</a>
<a href='https://twitter.com/privefl' target='_blank'>@privefl</a>, <a href='https://twitter.com/basiliximAb' target='_blank'>@basiliximAb</a>
<a href='https://twitter.com/dickoah' target='_blank'>@dickoah</a>, <a href='https://twitter.com/ClementinC' target='_blank'>@ClementinC</a>
<a href='https://twitter.com/StephaneOrlins' target='_blank'>@StephaneOrlins</a>, @claramorganexxx (ahem..), <a href='https://twitter.com/francois_ls' target='_blank'>@francois_ls</a> et <a href='https://twitter.com/After_Eight' target='_blank'>@After_Eight</a>. Bravo à toutes et à tous !</p>
<p>Comme vous êtes bons, on va augmenter la difficulté. Votre mission, si vous l'acceptez, consiste à coder une fonction <code>syracuse</code> qui renvoie <a href='https://fr.wikipedia.org/wiki/Conjecture_de_Syracuse' target='_blank'>la suite de Syracuse</a> de n'importe quel entier <code>x</code> jusqu'à ce qu'elle atteigne <code>1</code>. En d'autres termes, nous cherchons une fonction de type :</p>
<pre>syracuse = function(x) {
# faire quelque chose...
}</pre>
<p>De telle sorte que :</p>
<pre>> syracuse(42)
[1] 42 21 64 32 16 8 4 2 1</pre>
<p>Mais comme ça, c'est trop facile, vous allez faire ça <em>sans boucle</em> (ni <code>for</code> ni <code>while</code> ni <code>repeat</code> !).</p>
Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com0tag:blogger.com,1999:blog-6602717398228748861.post-62834237471955017432018-01-15T18:35:00.003+01:002018-01-23T10:29:00.081+01:00ChallengeR #2<p>Je vais poster régulièrement des petits challenges de code sous R. Les résultats du premier sont ci-dessous, la question du second est en fin d’article.</p>
<h5>Résultats du premier challenge</h5>
<p>Votre mission <a href='https://twitter.com/ordrespontane/status/952958894439043072' target='_blank'>consistait donc</a> à reproduire la matrice suivante sous R avec le moins de code possible (étant précisé que les espaces, les indentations et les retours à la ligne ne sont pas considérés comme des caractères) :</p>
<pre>> a
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 2 4 6 8 10
[3,] 3 6 9 12 15
[4,] 4 8 12 16 20
[5,] 5 10 15 20 25</pre>
<p>Avant de vous donner les meilleures réponses, voici quelques unes des nombreuses façons de faire ça ; à commencer par la bonne vieille double boucle :</p>
<pre>a <- matrix(NA, 5, 5)
for(i in 1:5) {
for(j in 1:5) {
a[i, j] <- i*j
}
}</pre>
<p>On pouvait aussi faire ça avec une seule boucle :</p>
<pre>a <- matrix(1:5, 5, 5)
for(i in 1:5) a[, i] <- a[, i]*i</pre>
<p>Ou :</p>
<pre>a <- matrix(NA, 5, 5)
for(i in 1:5) a[, i] <- 1:5*i</pre>
<p>Ou encore :</p>
<pre>a <- matrix(1:5, 1, 5)
for(i in 2:5) a <- rbind(a, a[1, ]*i)</pre>
<p>Mais sous R, dans la plupart des cas, on n'a pas besoin de boucle. Une alternative classique consiste à utiliser une des fonctions de la famille <code>apply</code> (<code>apply</code>, <code>sapply</code>, <code>lapply</code>, <code>tapply</code> ou <code>rapply</code>) :</p>
<pre>sapply(1:5, function(i) i*1:5)</pre>
<p>Ou, encore mieux et trouvée par <a href='https://twitter.com/thedudeparis' target='_blank'>@thedudeparis</a> :</p>
<pre>sapply(1:5, "*", 1:5)</pre>
<p>On pouvait y arriver aussi avec une simple multiplication. Un certain @realDonaldTrump a proposé :</p>
<pre>t(matrix(rep(1:5,5),5))*1:5</pre>
<p>Ou, en utilisant l'argument <code>byrow=TRUE</code> dans <code>matrix</code> :</p>
<pre>matrix(1:5, 5, 5, T) * 1:5</pre>
<p>Ou encore, en transposant (avec <code>t</code>) :</p>
<pre>a <- matrix(1:5, 5, 5)
a * t(a)</pre>
<p>De là, certains d'entre vous ont pensé à un produit matriciel (avec l'opérateur <code>%*%</code>) ; c'est notamment le cas, encore, de <a href='https://twitter.com/thedudeparis' target='_blank'>@thedudeparis</a> avec :</p>
<pre>1:5 %*% t(1:5)</pre>
<p>Mais la meilleure solution consistait à utiliser la fonction <code>outer</code> ; <a href='https://twitter.com/clementinc' target='_blank'>@ClementinC</a> à été le premier à chercher dans cette voie :</p>
<pre>outer(1:5, 1:5, "*")</pre>
<p>Ce qui, sachant que <code>"*"</code> est la valeur par défaut de l'argument <code>FUN</code> de <code>outer</code>, pouvait aussi s'écrire :</p>
<pre>outer(1:5, 1:5)</pre>
<p>Mais c'est <a href='https://twitter.com/_AntoineB' target='_blank'>@_AntoineB</a> qui a pensé à utiliser l'opérateur de <code>outer</code> (<code>%o%</code>) et a donc remporté ce quiz avec à peine 9 caractères (bravo à lui !) :
<pre>1:5 %o% 1:5</pre>
<h5>Nouveau challenge</h5>
<p>Soit le vecteur suivant :</p>
<pre>x <- sample(0:9, 100, TRUE)</pre>
<p>Comment compter le nombre de chiffres pairs avec le moins de code possible (les espaces, les indentations et les retours à la ligne ne sont pas comptés comme des caractères) ?</p>
<p>La meilleure réponse sera publiée ici même. Vous avez jusqu'au vendredi 19 janvier à 12h00 (heure de Paris).</p>
Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com0tag:blogger.com,1999:blog-6602717398228748861.post-37107322491023800622018-01-15T18:02:00.000+01:002018-01-15T18:02:13.139+01:00Quick R<p>Je croise souvent des gens qui veulent se mettre à programmer sous R mais qui, par manque de temps ou parce que les tutos qu’on trouve sur internet font parfois un peu peur, ne s’y mettent pas. Je vous propose donc une très rapide introduction pour aider celles et ceux d’entre vous à sauter le pas. Elle est volontairement très simple et incomplète : l’idée, c’est de permettre à quelqu’un qui n’a jamais programmé de sa vie de s’y mettre sans trop de difficultés, rien de plus.</p>
<h5>Premiers pas</h5>
<p>Pour installer R sur votre machine, rendez vous <a href='https://www.r-project.org/' target='_blank'>ici</a>, cliquez sur <code>CRAN</code> (pour <em>Comprehensive R Archive Network</em>), choisissez le serveur le plus proche de chez vous et suivez la procédure. Si vous êtes sous Windows, téléchargez l'exécutable et choisissez toutes les options par défaut. Si vous travaillez sous Mac ou Linux, il n'est pas inutile d'installer <a href='https://www.rstudio.com/' target='_blank'>RStudio</a> <em>après</em> R lui-même (c'est une interface graphique qui va considérablement simplifier votre vie).</p>
<p>Quand c'est fait, lancez une cession. Les utilisateurs de Windows devraient voir ça :</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijG7xL2VBv27x9zgkGxunsxnlBIBUDZIohSEmAcuh0qBEug50RbCCOXPAwp-a2ZrD5mLyqwwnvLsNktrETFituIzTae00EGWrl_K_RmSKYdPzG1hqDD4jZd64CAM8Y1LFM5w1kkfMk184/s1600/01.png" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijG7xL2VBv27x9zgkGxunsxnlBIBUDZIohSEmAcuh0qBEug50RbCCOXPAwp-a2ZrD5mLyqwwnvLsNktrETFituIzTae00EGWrl_K_RmSKYdPzG1hqDD4jZd64CAM8Y1LFM5w1kkfMk184/s1600/01.png" width="600" /></a></div>
<p>Ce que vous voyez, c’est le GUI (pour <em>Graphical User Interface</em>), un logiciel très basique qui vous permet d’interagir avec R lui-même (si vous êtes sous Mac ou Linux, c’est le rôle de RStudio). La fenêtre sur fond blanc, c’est la <em>console</em>. C’est là-dedans que nous allons envoyer des instructions pour exécution et voir ce que nous répond R.</p>
<p><b>Sous Windows, attention</b> : si vous cliquez que l’une ou l’autre des petites croix blanches sur fonds rouge, vous quittez R. Essayez et vous devriez voir apparaître ça :</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx5OBDD6cFD_jTGLi44vYykJpRXKtsqSc05iGsPyOZ3_htGtT0vfr8o_yWIpcawijpbKeZRTFmGWtkVjcEeARzetiCkNM2dFjlp2vdthtlRcnYAgnVhQKz4vQtsrEgRwY1QMAdCik22Vk/s1600/02.png" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx5OBDD6cFD_jTGLi44vYykJpRXKtsqSc05iGsPyOZ3_htGtT0vfr8o_yWIpcawijpbKeZRTFmGWtkVjcEeARzetiCkNM2dFjlp2vdthtlRcnYAgnVhQKz4vQtsrEgRwY1QMAdCik22Vk/s1600/02.png" dwidth="200" /></a></div>
<p>À chaque fois que vous voyez ça et jusqu’à ce que vous sachiez exactement de quoi il est question : cliquez « Non » (dans l’immédiat, cliquez plutôt sur « Annuler ».)</p>
<p>Nous allons très rapidement passer sur les manipulations dans la console — principalement parce que n’est pas là-dedans que nous allons travailler. Commençons par nous débarrasser de ce message d’accueil : cliquez dans la console (n’importe où) et pressez <code>Ctrl+L</code>.</p>
<p>Toujours dans la console, devant le signe <code>></code>tapez <code>1+1</code> puis <code>Entrée</code>. Vous devriez avoir ça :</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsgelZnUH8r7UdpD6u34KCdrRKF6TzKQ7FZXldOI9HYkZjMrKVgyTxEMdXY4NadO3wDK1ywFJ4FH9HoW_MLVRCc0A2oe9S7qdpRN_Dgyj6w_pwhhhqM4QoPHj68-NodGRZ2CHnNR9e7U4/s1600/03.png" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsgelZnUH8r7UdpD6u34KCdrRKF6TzKQ7FZXldOI9HYkZjMrKVgyTxEMdXY4NadO3wDK1ywFJ4FH9HoW_MLVRCc0A2oe9S7qdpRN_Dgyj6w_pwhhhqM4QoPHj68-NodGRZ2CHnNR9e7U4/s1600/03.png" width="600" /></a></div>
<p>En rouge, votre instruction (<code>1+1</code>) et en bleue, la réponse de R (<code>2</code>) — le <code>[1]</code> n’est qu’un indicateur de position, vous allez très vite comprendre à quoi il sert.</p>
<p>Si vous essayez de modifier votre première instruction (<code>1+1</code>), vous devriez assez rapidement constater que c’est <em>impossible</em>. Pour R, c’est du passé. Ce que vous pouvez faire, en revanche, c’est cliquer que la petite flèche qui pointe vers le haut sur votre clavier pour rappeler la dernière instruction envoyée à la console et là, avant de la ré-exécuter, vous pouvez la modifier. Essayez de faire ça en remplaçant le 2ème <code>1</code> par un <code>2</code>.</p>
<p>Comme vous pouvez le constater vous-même, ça n’est pas pratique du tout (mais alors pas du tout). La bonne nouvelle c’est que nous n’allons pas travailler comme ça.</p>
<h5>Script</h5>
<p>Dans <em>Fichier</em>, sélectionnez <em>Nouveau script</em> (ou pressez <code>Ctrl+N</code>). Vous devriez avoir quelque chose comme ça :</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCMTCwNP1x1mlqhsFtvuqRZdIK_giCqawMxrVNeAs6RlRkV3Qz9it0gJPqB25VWCibuIWHVVud3I5r0EipHp9PdUanjL7N5Eo61JhKthsIhvwvHeOiLbx81n2-MPaKZnn9X20id3pkvTQ/s1600/03.png" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCMTCwNP1x1mlqhsFtvuqRZdIK_giCqawMxrVNeAs6RlRkV3Qz9it0gJPqB25VWCibuIWHVVud3I5r0EipHp9PdUanjL7N5Eo61JhKthsIhvwvHeOiLbx81n2-MPaKZnn9X20id3pkvTQ/s1600/03.png" width="600" /></a></div>
<p><em>Sans titre</em> est un script. C’est un fichier texte dans lequel nous allons écrire des instructions avant de les envoyer à la console pour exécution. Là-dedans, à part, de la mise en forme, vous pouvez faire ce que vous voulez : copier, couper, coller et modifier à loisir. Vous pouvez aussi (et vous devriez) le sauvegarder pour ne pas perdre votre travail (sous Windows, ce sera un fichier <code>.R</code> que vous pouvez ouvrir avec n’importe quel éditeur de texte).</p>
<p>Dans votre script, saisissez <code>6*7</code> puis, en maintenant le curseur sur cette ligne, pressez <code>Ctrl+R</code> (sous Rstudio, c'est <code>Cmd+Entrée</code>). En principe, vous devriez observer que votre instruction a été envoyée à la console pour exécution :</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRb9RMLhLT7QKXXPinJkXui11MhfF3OF-gYVP7X4eIvR17uHXP6tE5cZUmoBYWELJR9lmUS_NVBn3y5Cq1DXZiw_tk6N2HgKMwG7lvYdUpSTn1c5VBtAQYU7LTw9VE_Dpk3WzUrW069YQ/s1600/03.png" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRb9RMLhLT7QKXXPinJkXui11MhfF3OF-gYVP7X4eIvR17uHXP6tE5cZUmoBYWELJR9lmUS_NVBn3y5Cq1DXZiw_tk6N2HgKMwG7lvYdUpSTn1c5VBtAQYU7LTw9VE_Dpk3WzUrW069YQ/s1600/03.png" width="600" /></a></div>
<p>C’est comme ça que nous allons travailler : écrire des instructions dans un script et les envoyer à la console pour exécution : plusieurs lignes de code sauvegardées dans un script, ça fait un programme.</p>
<h5>Bases</h5>
<p>La règle suprême de la programmation sous R s’énonce très simplement : pour reprendre les termes de John Chambers, un de ses concepteurs, « <em>tout ce qui existe est un objet et tout ce qui arrive est un appel à une fonction</em>. » Nous allons surtout nous concentrer sur la première partie : « <em>tout ce qui existe est un objet</em>. »</p>
<p>Avant ça, nous allons nous mettre d’accord sur une petite convention entre nous. Quand j’écris :</p>
<pre>6*7</pre>
<p>C’est une instruction dans un script. Mais si j’écris :</p>
<pre>> 6*7
[1] 42
></pre>
<p>C’est le résultat de l’exécution de cette instruction dans la console (i.e. n’allez pas me coller des <code>></code> ou des <code>[1]</code> au début des lignes de vos scripts !)</p>
<p>Dans votre script, tapez <code>machin</code> et exécutez (<code>Ctrl+R</code> sous Windows, <code>Cmd+Entrée</code> si vous utilisez RStudio). En principe, vous obtenez un message d'erreur :</p>
<pre>> machin
Erreur : objet 'machin' introuvable
></pre>
<p>R n’ayant jamais entendu parler de <code>machin</code>, il vous informe qu’il ne sait pas de quoi vous parlez. Nous allons donc créer un objet <code>machin</code> qui sera, par exemple, la suite des entiers de <code>1</code> à <code>5</code>. Dans votre script, écrivez et exécutez :</p>
<pre>machin <- 1:5</pre>
<p>Le signe <code><-</code> permet d'assigner une valeur à un objet. Vous pouvez aussi l'utiliser dans l'autre sens (<code>1:5 -> machin</code>) et vous pouvez aussi faire ça avec le signe <code>=</code> (<code>machin = 1:5</code>) mais je vous le déconseille pour le moment.</p>
<p>Dans la console, vous observez un accusé de réception :</p>
<pre>> machin <- 1:5
></pre>
<p>Si vous voulez voir vous ce que contient <code>machin</code>, vous pouvez écrire <code>machin</code> dans la console ou sélectionner juste le mot <code>machin</code> dans votre script (le mettre en surbrillance) et exécuter. En principe :</p>
<pre>> machin
[1] 1 2 3 4 5
></pre>
<p>Dans la console, si vous tapez <code>ls()</code>, R vous confirme qu'il connait bien un objet nommé <code>machin</code> (la fonction <code>ls</code> liste le nom des objets existants dans l'environnement de travail actuel) :
<pre>> ls()
[1] "machin"
></pre>
<p>Et la fonction <code>class</code>, vous dira de quelle sorte d'objet il s'agit (ici <code>integer</code>, pour entiers) :</p>
<pre>> class(machin)
[1] "integer"
></pre>
<p>Et puisque <code>machin</code> existe, nous pouvons jouer avec (tapez ça dans votre script, exécutez d'un coup et essayez de deviner ce que fait chaque fonction) :</p>
<pre>length(machin)
sum(machin)
mean(machin)
max(machin)
rev(machin)
diff(machin)
rep(machin, 3)
machin+1
machin^2</pre>
<p>Notez, pour les deux dernières, une petite particularité magique de R : il « recycle » l’élément le plus court de votre calcul. Quand vous lui demandez de calculer <code>machin+1</code>, il rajoute <code>1</code> à chaque élément de <code>machin</code> (idem pour <code>machin</code> au carré).</p>
<p>Maintenant, essayez ça :</p>
<pre>machin <- c(2, 1, 3, 10, 1000)
bidule <- 2
machin*bidule</pre>
<p>Delà, vous observez deux choses : (i) vous pouvez créer plusieurs objets et jouer avec et (ii) vous venez d'écraser l'ancien <code>machin</code> (la séquence des entiers de <code>1</code> à <code>5</code>) pour le remplacer par une nouvelle définition de <code>machin</code> (avec la fonction <code>c</code> qui concatène à peu près tout ce que vous voulez).</p>
<h5>Fonctions</h5>
<p>Il existe une quantité invraisemblable de fonctions dans R auxquelles se rajoutent des libraires entières de fonctions spécialisées (les packages du CRAN) et celles que vous pouvez créer pour vos propres besoins. D’une façon générale, on utilise une fonction de la façon suivante :</p>
<pre>nom_de_la_fonction(argument1, argument2, ...)</pre>
<p>Sauf que, dans bien des cas, R nous simplifie la vie. Un bon exemple, c'est la fonction <code>seq</code> qui créé des séquences (l'opérateur <code>:</code>, que nous avons vu plus haut, est une sorte de raccourci pour <code>seq</code>). Pour savoir comment l'utiliser, vous pouvez exécuter :</p>
<pre>help()</pre>
<p>Ou :</p>
<pre>?seq</pre>
<p>La page d'aide qui s'ouvre vous informe, en autres choses, que <code>seq</code> admet 5 arguments : <code>from</code> (valeur par défaut : <code>1</code>), <code>to</code> (valeur par défaut : <code>1</code>), <code>by</code> (valeur par défaut : <code>((to - from)/(length.out - 1))</code>), <code>length.out</code> (valeur par défaut : <code>NULL</code>) et <code>along.with</code> (valeur par défaut : <code>NULL</code>).</p>
<p>Par exemple, pour créer la suite des entiers de <code>1</code> à <code>10</code> avec un incrément de <code>2</code>, vous pouvez écrire :</p>
<pre>seq(from = 1, to = 10, by = 2)</pre>
<p>Mais, puisque vous donnez les arguments dans l'ordre <em>normal</em>, vous n'êtes pas obligé de les nommer :</p>
<pre>seq(1, 10, 2)</pre>
<p>Du coup, vous pouvez les donner dans le désordre en les nommant :</p>
<pre>seq(by = 2, from = 1, to = 10)</pre>
<p>Et puisque la valeur par défaut de <code>from</code> c'est déjà <code>1</code>, vous pouvez carrément omettre de le préciser :</p>
<pre>seq(to = 10, by = 2)</pre>
<p>Ou :</p>
<pre>seq(, 10, 2)</pre>
<p>Et si vous voulez une séquence qui commence à <code>10</code>, progresse par <code>10</code> et a une longueur de <code>200</code> (notez que je ne suis pas obligé d'écrire <code>length.out</code> : je peux juste écrire <code>len</code> ou même <code>l</code>) :</p>
<pre>seq(10, by = 10, len = 200)</pre>
<p>Si vous cherchez une fonction sans savoir comment elle s’appelle (par exemple, pour trier), utilisez :</p>
<pre>help.search("sort")</pre>
<p>Ou :</p>
<pre>??sort</pre>
<p>Enfin, vous pouvez créer vos propres fonctions. Supposez, par exemple, que vous voulez une fonction qui calcule l'aire d'un disque en fonction de son rayon (<code>pi</code> est déjà en mémoire, vous pouvez l'utiliser directement) :</p>
<pre>aire_disque = function(rayon) {
res <- rayon*pi^2
return(res)
}</pre>
<p>Utilisation :</p>
<pre>> aire_disque(2)
[1] 19.73921
></pre>
<h5>Quelques classes utiles</h5>
<p>Voici quelques-uns des objets les plus utiles :</p>
<h4>Vecteurs</h4>
<p>Avec <code>runif</code> (qui renvoie des nombres aléatoires qui suivent une distribution uniforme) vous pouvez créer un vecteur de classe <code>numeric</code> :</p>
<pre>x <- runif(10)</pre>
<p>En effet :</p>
<pre>> class(x)
[1] "numeric"
></pre>
<p>Comme tous les vecteurs, il a une longueur mais pas de dimensions (je sais, c'est bizarre mais c'est comme ça) :</p>
<pre>> length(x)
[1] 10
> dim(x)
NULL
></pre>
<p>Si vous souhaitez récupérer un élément de <code>x</code> (mettons le 5ème), faites <code>x[5]</code>. Pour les 3 premiers éléments, <code>x[1:3]</code>. Pour tous les éléments sauf le premier, le plus simple c'est x[-1].</p>
<p>Vous pouvez aussi assigner une valeur à un élément de votre vecteur :</p>
<pre>x[5] <- 1000</pre>
<p>Les vecteurs de classe <code>integer</code> (nombres entiers, nous en avons vu un plus haut) fonctionnent exactement de la même façon.</p>
<p>Dans la grande famille des vecteurs, il a aussi les vecteurs de classe <code>character</code> (c'est du texte). Par exemple :</p>
<pre>x <- c("papa", "maman")</pre>
<p>Ces choses-là sont notamment très utiles pour donner des noms aux autres objets :</p>
<pre># Ceci est un commentaire
# (ce qui est écrit après un dièse n'est pas exécuté).
# Soit un vecteur 'integer'
x <- 1:26
# L'objet 'letters' existe déjà en mémoire :
names(x) <- letters</pre>
<p>Du coup :</p>
<pre>> x[c("a", "m", "z")]
a m z
1 13 26
></pre>
<p>Il y a aussi des vecteurs de classe <code>Date</code> (notez le format des dates dans R) :</p>
<pre>as.Date("2018-01-15")-10:1</pre>
<p>Et, mes préférés, les vecteurs de classe <code>logical</code> (les <em>booléens</em> c'est-à-dire des vecteurs de <code>TRUE</code> et de <code>FALSE</code>) :</p>
<pre>1:10 > 5</pre>
<p>Ils permettent, entre autres, de faire des choses comme ça :</p>
<pre>> x <- 1:26
> x[x > 10]
[1] 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
></pre>
<h4>Matrices</h4>
<p>Une matrice, très simplement, c'est un tableau de nombres (un <em>array</em> à deux dimensions dans lequel, en principe, vous ne devriez avoir que des nombres).</p>
<pre>x <- matrix(1:15, nrow = 5, ncol = 3)</pre>
<p>Ce qui nous donne :</p>
<pre>> x
[,1] [,2] [,3]
[1,] 1 6 11
[2,] 2 7 12
[3,] 3 8 13
[4,] 4 9 14
[5,] 5 10 15
></pre>
<p>Une matrice a deux dimensions — un nombre de ligne et un nombre de colonnes (par convention, toujours dans cet ordre) :</p>
<pre>> dim(x)
[1] 5 3
></pre>
<p>Pour extraire la première ligne faites <code>x[1, ]</code>. Pour la première colonne faites <code>x[, 1]</code> (notez que dans les deux cas précédents, R fait « sauter » les dimensions : vous récupérez des vecteurs). Vous pouvez aussi, par exemple, récupérer les 2 premières lignes des colonnes <code>2</code> et <code>3</code> avec <code>x[1:2, c(2, 3)]</code>.</p>
<p>Pour remplacer tous les éléments des <code>x</code> qui sont supérieurs à <code>10</code> par <code>10</code>, faites simplement :</p>
<pre>x[x > 10] <- 10</pre>
<p>Supposez, par exemple, que vous souhaitez récupérer les lignes de <code>x</code> pour lesquelles les nombre de la seconde colonne sont pairs. Avec <code>%%</code>, l’opérateur modulo, notre condition s’écrit :</p>
<pre>x[, 2] %% 2 == 0</pre>
<p>Nous n'avons donc qu'à faire :</p>
<pre>x[x[, 2] %% 2 == 0, ]</pre>
<p>Et puisque <code>1 == TRUE</code> et <code>0 == FALSE</code>, on peut faire encore plus court en utilisant l'opérateur <code>!</code> de la négation (<code>!TRUE == FALSE</code>) :</p>
<pre>x[!x[, 2]%%2, ]</pre>
<h4>Listes</h4>
<p>Les listes permettent de stocker à peu près n'importe quoi. Par exemple :</p>
<code>x <- list(1:10, letters, matrix(1, 3, 3))</code>
<p>Si vous voulez récupérer le 3ème élément (les lettres de l'alphabet) utilisez <code>x[[3]]</code>. Pour les deux 1ers, faites <code>x[1:2]</code> ou <code>x[-3]</code>.</p>
<p>Vous pouvez aussi utiliser les noms de la liste comme ceci :</p>
<pre>x <- list(
nombres = 1:10,
lettres = letters,
matrice = matrix(1, 3, 3))
x$lettres
x[c("nombres", "matrice")]</pre>
<p>Si vous préférez finalement des lettres majuscules :</p>
<pre>x$lettres <- LETTERS
# Ou :
x$lettres <- toupper(x$lettres)</pre>
<h4>Data.frames</h4>
<p>Un data.frame, c'est un peu comme une table de base de donnée : un tableau dans lequel chaque 'colonne' peut être d'une classe différente :</p>
<pre>x <- data.frame(
numbr = 1:26,
alpha = LETTERS,
dates = Sys.Date()-26:1)</pre>
<p>Techniquement, ces choses-là sont des listes avec une structure. Vous pouvez donc les manipuler comme des matrices ou comme des listes :</p>
<pre>x[1:2, ]
x$dates
</pre>
<p>Notez que pour la colonne <code>alpha</code>, vous obtenez un objet de classe <code>factor</code> :</p>
<pre>> al <- x$alpha
> class(al)
[1] "factor"
> </pre>
<p>Pour éviter le problème, vous pouvez simplement faire ça :</p>
<pre>> al <- as.character(x$alpha)
> class(al)
[1] "character"
> </pre>
<h5>Boucles</h5>
<p>Celles et ceux d’entre vous qui programment dans d’autres langages se demandent sans doute comment on écrit des boucles sous R. En général, on ne le fait pas : dans la plupart des cas, il y a des méthodes plus rapides et moins verbeuses. Mais puisque vous insistez, voici deux petits exemples qui devraient répondre à votre question.</p>
<p>Nous voulons les 20 premiers éléments de la <a href='https://fr.wikipedia.org/wiki/Suite_de_Fibonacci' target='_blank'>suite de Fibonnacci</a> :</p>
<pre>n <- 20
# Vecteur vide (NA) de longueur n:
res <- rep(NA, n)
# On colle des 1 dans les 2 premiers items :
res[1:2] <- 1
# Boucle *for* -- Pour chaque valeur de i, de 3 à n
for(i in 3:n) {
# res, position i est égal à :
# res, position i-2 plus
# res, position i-1
res[i] <- res[i-2]+res[i-1]
}</pre>
<p>Notez qu'en utilisant la <a href='https://en.wikipedia.org/wiki/Fibonacci_number#Closed-form_expression' target='_blank'>formule de Binet</a> :</p>
<pre>phi <- (1+sqrt(5))/2
n <- 1:20
res <- (phi^n-(1-phi)^n)/sqrt(5)</pre>
<p>Avec le vecteur <code>res</code> trouvé précédemment, on cherche <code>n</code> tel que la somme des éléments de <code>res</code> de <code>1</code> à <code>n</code> soit la plus grande possible mais inférieure à <code>1000</code> :</p>
<pre>i <- 1
somme <- res[i]
# Boucle *while* -- Tant que somme < 1000
while(somme < 1000) {
# On incrémente i de 1 :
i <- i+1
# On calcule la somme de res de la
# position 1 à la position i :
somme <- sum(res[1:i])
}
n <- i-1</pre>
<p>Mais sous R, on préférera :</p>
<pre>max(which(cumsum(res) < 1000))</pre>
<p>Je m’arrête ici. Je posterai de temps en temps des petits challenges pour celles et ceux qui veulent s’exercer.</p>
Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com0tag:blogger.com,1999:blog-6602717398228748861.post-69646830302609033232018-01-15T11:39:00.002+01:002018-01-23T10:29:38.917+01:00Axelrod, le tournois<p>Au début des années 1980, Robert Axelrod avait organisé un concours d’algorithmes pour un <a href='http://ordrespontane.blogspot.fr/2018/01/le-dilemme-du-prisonnier-repete-une.html' target='_blank'>dilemme du prisonnier répété</a>. Je vous propose de remettre ça tous les ans, le premier vendredi de mars, en mettant à profit les progrès réalisés par l’informatique depuis (notamment en termes d’accessibilité au commun des mortels) et les possibilités que nous offre l’existence d’internet.</p>
<h5>Le Principe</h5>
<p>Le but du jeu est de créer l’algorithme qui, lorsqu’il sera confronté à tous les autres lors d’un tournoi, gagnera le plus de points.</p>
<p>En notant $n$ le nombre d’algorithmes en lice, un tournois est donc composé de $\binom{n}{2}$ matches :</p>
$$\binom{n}{2} = \frac{n!}{(n-2)!2!}$$
<p>Chaque match est composé de 2000 dilemmes du prisonnier successifs (2000 <em>rounds</em>). Cette année vous le savez mais, dès 2019, vous ne pourrez plus exploiter cette information (le nombre de rounds sera inconnu).</p>
<p>La matrice des paiements retenue est celle de Robert Axelrod dans les années 1980 :</p>
<table width='200' style='text-align:center'>
<tr>
<td></td><td><b>C</b></td><td><b>D</b></td>
</tr>
<tr>
<td><b>C</b></td><td>[3,3]</td><td>[0,5]</td>
</tr>
<tr>
<td><b>D</b></td><td>[5,0]</td><td>[1,1]</td>
</tr>
</table>
<p>Pour la première année, le tournois aura lieu le <b>2 mars 2018</b>. Les résultats seront publiés ici même (et sur <a href='https://twitter.com/ordrespontane' target='_blank'>Twitter</a>).</p>
<h5>Programmation</h5>
<p>Vos algorithmes doivent être des fonctions codées sous R (<a href='https://www.r-project.org/' target='_blank'>téléchargeable gratuitement ici</a>) qui respectent la forme suivante :</p>
<pre>foo = function(p, o, n = 2000) {
# faire quelque chose...
return(res)
}</pre>
<p>Où :</p>
<ul>
<li><code>foo</code> est le nom de la fonction (c'est-à-dire de votre algorithme),</li>
<li>L'argument <code>p</code> est la liste des coups joués par <code>foo</code> depuis le début de la partie (c'est une vecteur de <code>logical</code> ou <code>booléens</code> — c'est-à-dire une suite de <code>TRUE</code> pour <em>coopération</em> et de <code>FALSE</code> pour <em>défaut</em>),</li>
<li>L'argument <code>o</code> est l'historique des coups joués par l'adversaire de <code>foo</code> durant cette partie (même format),</li>
<li>L'argument <code>n</code> est de nombre de rounds dans une partie (par défaut, <code>n = 2000</code>),</li>
<li><code>res</code> est le coup joué (<code>TRUE</code> s'il coopère ou <code>FALSE</code> s'il fait défaut).</li>
</ul>
<p>Vous pouvez donc très facilement savoir où vous en êtes dans la partie : si la longueur de <code>p</code> est égale à 0 (<code>length(p) == 0</code>) c’est que vous jouez le premier round, si elle est égale à 5, c’est que vous jouez le 6ème round et si elle est égale à <code>n-1</code> c’est que allez jouer le dernier coup de ce match.</p>
<p>Si vous ne savez pas coder sous R (ou pas coder du tout), vous pouvez quand même participer en décrivant précisément ce que fait votre algo. J’essaierais de le programmer pour vous.</p>
<p>Si vous cherchez de l’inspiration, vous pouvez consulter la <a href='https://github.com/gnicoulaud/axelrod/blob/master/algos.R' target='_blank'>liste des algos déjà en lice</a> et tester vos œuvres avec <a href='https://github.com/gnicoulaud/axelrod/blob/master/utilities.R' target='_blank'>les fonctions prévues à cet effet</a> (je fournis aussi <a href='https://github.com/gnicoulaud/axelrod/blob/master/example.R' target='_blank'>quelques exemples d’utilisations</a>).</p>
<p>Lisez <a href='https://github.com/gnicoulaud/axelrod/blob/master/README.md' target='_blank'>le README sur Github</a> pour plus de détails (oui, c'est en anglais).</p>
<h5>Participer</h5>
<p>Pour soumettre vos algos, utilisez <a href='https://docs.google.com/forms/d/e/1FAIpQLSc8TlbrGz2mPecRDrqVwp5huqZFBsAOkwiDz2o3s_aFSFBsyg/viewform?usp=sf_link' target='_blank'>ce formulaire</a> (avant le 1er mars 2018 à minuit, heure de Paris, au plus tard) :</p>
<iframe src="https://docs.google.com/forms/d/e/1FAIpQLSc8TlbrGz2mPecRDrqVwp5huqZFBsAOkwiDz2o3s_aFSFBsyg/viewform?embedded=true" width="600" height="500" frameborder="0" marginheight="0" marginwidth="0">Loading...</iframe>
<p>Si vous avez des questions, posez-les dans les commentaires ci-dessous.</p>
Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com23tag:blogger.com,1999:blog-6602717398228748861.post-17696650605151517922018-01-14T18:25:00.001+01:002018-01-23T10:31:22.685+01:00Le dilemme du prisonnier répété, une introduction<p>Si vous ne savez pas ce qu’est un dilemme du prisonnier, une rapide mise à niveau s’impose. Supposez, que deux joueurs qui ne se connaissent pas et n’ont aucun moyen de communiquer entre eux se voient proposer de participer à un jeu dans lequel ils ont le choix entre <em>collaborer</em> (<b>C</b>) entre eux ou <em>faire défaut</em> (<b>D</b>) sachant que :</p>
<ul>
<li>S’ils collaborent tous les deux, ils gagnent tous les deux $r$ points (mettons $r=3$) ;</li>
<li>S’ils font défaut tous les deux, ils gagnent chacun $p$ points (mettons $p=1$) ;</li>
<li>Si l’un des joueurs fait défaut tandis que l’autre collabore, il gagne $t$ points ($t=5$) tandis que son adversaire ne gagnera que $s$ points (par exemple, $s = 0$).</li>
</ul>
<p>Si $t>r>p>s$ (ce qui est le cas dans l’exemple donné ci-dessus), nous avons un dilemme du prisonnier. Pour bien comprendre, on peut représenter le problème avec une <em>matrice des paiements</em> :</p>
<table width='200' style='text-align:center'>
<tr>
<td></td><td><b>C</b></td><td><b>D</b></td>
</tr>
<tr>
<td><b>C</b></td><td>[3,3]</td><td>[0,5]</td>
</tr>
<tr>
<td><b>D</b></td><td>[5,0]</td><td>[1,1]</td>
</tr>
</table>
<p>Supposez que vous ayez à choisir une ligne entre collaborer (<b>C</b>) et faire défaut (<b>D</b>) et que, dans le même temps, votre adversaire va aussi choisir une colonne (<b>C</b> ou <b>D</b>) :
<ul>
<li>Si vous choisissez tous les deux de collaborer (ligne <b>C</b> et colonne <b>C</b>), vous gagnez tous les deux 3 points ([3,3]) ;</li>
<li>Si vous choisissez tous les deux de faire défaut (ligne <b>D</b> et colonne <b>D</b>), vous gagnez tous les deux 1 point ([1,1]) ;</li>
<li>Si vous décidez de collaborer (ligne <b>C</b>) tandis que votre adversaire fait défaut (colonne <b>D</b>), il gagne 5 points et vous rien du tout ([0,5]) ;</li>
<li>Dans le cas contraire, si vous faites défaut tandis que l'autre collabore, c'est vous qui gagnez 5 points et lui 0 ([5,0])</li>
</ul>
<p>Ceci étant donné, considérez ceci : vous ne savez pas ce que va faire votre adversaire mais ce que vous savez, en revanche, c’est que quoiqu’il fasse vous avez matériellement intérêt à faire défaut. S’il choisit de collaborer (colonne <b>C</b>), vous gagnez 5 points en faisant défaut contre seulement 3 si vous collaborez aussi. Si, en revanche, il a décidé de faire défaut (colonne <b>D</b>), vous gagneriez 1 point en faisant également défaut contre 0 en collaborant. En théorie des jeux, on dit de la stratégie qui consiste à faire défaut dans un dilemme du prisonnier qu’elle est <em>dominante</em> : quels que soient les futurs états possibles du monde, vous avez matériellement intérêt à faire ça.</p>
<p>Ça, c’est la (triste) réalité quand on ne joue qu’une seule fois. La défection mutuelle est le seul <a href='https://en.wikipedia.org/wiki/Nash_equilibrium' target='_blank'>équilibre de Nash</a> possible (aucun joueur n’a intérêt à changer unilatéralement de stratégie) et rien ne permet d’espérer atteindre la situation optimale <a href='https://en.wikipedia.org/wiki/Pareto_efficiency' target='_blank'>au sens de Pareto</a> (une collaboration réciproque — [3,3] — qui permettrait d'atteindre un état dans lequel il est impossible de faire gagner plus à l’un des deux sans détériorer la situation de l’autre.)</p>
<p>Mais si le jeu est répété plusieurs fois avec les deux mêmes joueurs qui gardent en mémoire les coups joués précédemment, les choses deviennent plus intéressantes (et aussi beaucoup plus optimistes !).</p>
<h5>Le dilemme répété</h5>
<p>Pour bien comprendre, l'idéal c'est de simuler des stratégies et de voir comment elles s'en sortent si on répète le jeu plusieurs fois. Pour faire simple, je ne vais ici utiliser que des stratégies très simples — en l’occurrence celles évoquées par Nicky Case sur <a href='http://ncase.me/trust/' target='_blank'>cet extraordinaire site</a> que je vous recommande chaudement.</p>
<p>Pour donner un peu de substance à ce que je vous raconte, j’ai codé chacun de ces algorithmes sous forme de fonction R (si vous ne comprenez pas ce que je fais, voyez les notes en fin d'article) en respectant la structure suivante :</p>
<pre>foo = function(p, o) {
# faire quelque chose...
return(res)
}</pre>
<p>Où <code>foo</code> est le nom de la fonction (c'est-à-dire de l'algorithme, de la stratégie) considérée, <code>p</code> est la liste des coups joués par <code>foo</code> depuis le début de la partie (c'est une vecteur de <code>logical</code> ou <code>booléens</code> — c'est-à-dire une suite de <code>TRUE</code> pour <em>coopération</em> et de <code>FALSE</code> pour <em>défaut</em>), <code>o</code> est l'historique des coups joués par l'adversaire de <code>foo</code> durant cette partie (même format) et <code>res</code> est le coup joué par <code>foo</code> étant donné <code>p</code> et <code>o</code> (<code>TRUE</code> s'il coopère ou <code>FALSE</code> s'il fait défaut).</p>
<p>Commençons par <code>alld</code>, la stratégie dominante du dilemme du prisonnier joué une seule fois, celle qui consiste à faire systématiquement défaut (<em>Always Cheat</em> sur le site de Nicky Case) :</p>
<pre>alld = function(p, o) {
return(FALSE)
}</pre>
<p>Évidemment, ça n’est pas très compliqué et les arguments (<code>p</code> et <code>p</code>) passés à ma fonction ne servent à rien puisque, par définition, <code>alld</code> fait tout le temps défaut, quoi qu’il arrive. Symétriquement, <code>allc</code> (a.k.a <em>Always Cooperate</em>), qui coopère tout le temps, s’écrit :</p>
<pre>allc = function(p, o) {
return(TRUE)
}</pre>
<p>À peine plus compliquée, <code>grudger</code>, c’est la stratégie rancunière : elle coopère tout le temps jusqu’à ce que son adversaire la trahisse ; auquel cas elle fait défaut systématiquement jusqu’à la fin de la partie. Sous R, c’est très facile :</p>
<pre>grudger = function(p, o) {
res <- all(o)
return(res)
}</pre>
<p>Tit-for-Tat (a.k.a <em>Copycat</em>) commence par coopérer (quand la longueur de <code>p</code> est égale à 0, c’est-à-dire au premier round) puis, se contente de reproduire le coup précédent de son adversaire :</p>
<pre>tft = function(p, o) {
res <- ifelse(length(p) == 0, TRUE, tail(o, 1))
return(res)
}</pre>
<p>Tit-For-Two-Tats (a.k.a. <em>Copykitten</em>) est une variante de Tit-for-Tat qui coopère deux fois puis, ne fait défaut que si son adversaire a lui-même fait défaut lors des deux coups précédents (elle lui « pardonne » un défaut) :</p>
<pre>tf2t = function(p, o) {
r <- length(p)+1
res <- TRUE
if(r > 2) res <- ! all(! tail(o, 2))
return(res)
}</pre>
<p>Le « détective » est à peine plus compliqué : il coopère, fait défaut, coopère et coopère puis, si son adversaire ne se venge pas au 3ème tour, fait systématiquement défaut ou, dans le cas contraire, joue à Tit-For-Tat :</p>
<pre>detect = function(p, o) {
r <- length(p)+1
if(r < 5) {
res <- as.logical(r != 2)
} else {
res <- ifelse(o[3], FALSE, o[r-1])
}
return(res)
}</pre>
<p>Win-Stay-Lose-Shift (a.k.a <em>Simpleton</em> or <em>Pavlov</em>) commence par coopérer puis, si son adversaire coopère à son tour, répète son dernier coup et change de stratégie dans le cas contraire :</p>
<pre>wsls = function(p, o) {
r <- length(p)+1
if(r == 1) {
res <- TRUE
} else {
res <- ifelse(tail(o, 1), tail(p, 1), !tail(p, 1))
}
return(res)
}</pre>
Enfin, pour mettre un peu de folie dans le jeu, voici Random qui coopère ou fait défaut de façon aléatoire avec une probabilité de 1/2 :</p>
<pre>rand = function(p, o) {
res <- sample(c(TRUE, FALSE), 1)
return(res)
}</pre>
<p>Ce qui nous fait donc 8 candidats que nous allons faire jouer les uns contre les autres lors de dilemmes du prisonnier répétés — mettons 10 fois pour commencer. Par exemple, si nous organisons une rencontre entre <code>alld</code> (<em>Always Cooperate</em>) et <code>allc</code> (<em>Always Cheat</em>), voici ce qu'il va se passer (si vous voulez vous amusez avec, voyez les notes à la fin) :</p>
<pre>> .match(alld, allc, 10)$S
alld allc
[1,] FALSE TRUE
[2,] FALSE TRUE
[3,] FALSE TRUE
[4,] FALSE TRUE
[5,] FALSE TRUE
[6,] FALSE TRUE
[7,] FALSE TRUE
[8,] FALSE TRUE
[9,] FALSE TRUE
[10,] FALSE TRUE</pre>
<p>Forcément, <code>alld</code> fait tout le temps défaut et <code>allc</code> coopère systématiquement ce qui fait que, lors de ce match et en retenant la matrice des paiements données plus haut le premier gagne $5\times10=50$ points tandis que notre pauvre <code>allc</code> ne gagne rien. C'est le match le plus extrême dans l'univers des possibles.</p>
<p>Autre exemple, <code>detect</code> (le détective) contre <code>grudger</code> (le rancunier) :</p>
<pre>> .match(detect, grudger, 10)$S
detect grudger
[1,] TRUE TRUE
[2,] FALSE TRUE
[3,] TRUE FALSE
[4,] TRUE FALSE
[5,] FALSE FALSE
[6,] FALSE FALSE
[7,] FALSE FALSE
[8,] FALSE FALSE
[9,] FALSE FALSE
[10,] FALSE FALSE</pre>
<p>Ici, vous voyez le petit test de <code>detect</code> au second round — il fait défaut pour voir comment son adversaire réagit — et, en l'espèce, il n'est pas déçu puisqu'en face c'est <code>grudger</code> qui ne pardonne rien et se met immédiatement à faire défaut systématiquement. Résultat des courses : <code>detect</code> gagne $14$ points mais <code>grudger</code> l'emporte avec 19 points.</p>
<p>Enfin, dernier exemple, un des nombreux matches possibles entre <code>tft</code> (<em>Tit-for-Tat</em> ou <em>Copycat</em>) et <code>rand</code> (celui qui fait n'importe quoi) :</p>
<pre>> .match(tft, rand, 10)$S
tft rand
[1,] TRUE FALSE
[2,] FALSE TRUE
[3,] TRUE FALSE
[4,] FALSE FALSE
[5,] FALSE FALSE
[6,] FALSE TRUE
[7,] TRUE FALSE
[8,] FALSE TRUE
[9,] TRUE FALSE
[10,] FALSE TRUE</pre>
<p>Ici, ils arrivent à égalité (22 points partout) mais vous pouvez surtout voir la stratégie de Tit-for-Tat à l’œuvre : il commence par coopérer mais, comme <code>rand</code> fait défaut, il lui répond dès le second tour et ainsi de suite.</p>
<h5>Tournois</h5>
<p>Et si, maintenant, nous organisions un tournois dans lequel chacun de nos algorithmes rencontrera tous les autres de telle sorte que nous puissions déterminer celui qui, en moyenne gagne le plus de points ? Commençons par un tournois en 10 rounds : chaque algo est confronté à chacun des autres lors d'un dilemme du prisonnier répété 10 fois.</p>
<p>Au premier tirage, voici le nombre de points moyen obtenu par chaque algo :</p>
<table width='200' style='text-align:center'>
<tr>
<td><code>rand</code></td>
<td>20.429</td>
</tr>
<td><code>allc</code></td>
<td>20.571</td>
</tr>
<td><code>tf2t</code></td>
<td>23.000</td>
</tr>
<td><code>detect</code></td>
<td>24.000</td>
</tr>
<td><code>alld</code></td>
<td>24.857</td>
</tr>
<td><code>wsls</code></td>
<td>25.286</td>
</tr>
<td><code>tft</code></td>
<td>25.571</td>
</tr>
<td><code>grudger</code></td>
<td>25.857</td>
</tr>
</table>
<p>C'est donc <code>grudger</code> qui l'emporte devant Tit-for-Tat (<code>tft</code>) et, comme vous pouvez le voir, <em>Always Cheat</em> (<code>alld</code>), stratégie dominante dans le dilemme de base, n'arrive que 4ème. Pourquoi ? Eh bien tout simplement parce qu’il n’y a pas que ce pauvre <em>Always Cooperate</em> (<code>allc</code>) dans le jeu : il y a aussi des joueurs qui ne se laissent pas faire comme, justement <code>tft</code> ou <code>grudger</code> qui vont s’empresser de sanctionner ceux ne coopérèrent pas. Du coup, pour <code>allc</code>, ça se traduit par un maximum de matchs où il ne gagne qu’une misère.</p>
<p>Mais que ce passera-t’il si on augmente le nombre de rounds ? Qui va l’emporter dans un tournois où le dilemme du prisonnier est répété 20, 30 ou 40 fois ? Eh bien ce qu’il se passe, c’est que Tit-for-Tat, dans un dilemme du prisonnier répété, c’est comme l’Allemagne au foot : à la fin, c’est lui gagne. Avec ces concurrents-là, il est ultra-dominant dès une quinzaine d’itérations et il devient littéralement invincible quand on approche des 40 rounds. À part <code>grudger</code> et, dans une moindre mesure, <em>Win-Stay-Lose-Shift</em> (<code>wsls</code>), qui parviennent à remporter quelques tournois quand le nombre de rounds n’est pas trop élevé, les autres algorithmes de font étriller.</p>
<p>Qu’est ce qui explique le succès de Tit-for-Tat ? Eh bien il a 3 caractéristiques essentielles : (i) c’est une stratégie coopératrice (face à <code>allc</code>, <code>grudger</code>, <code>tf2t</code> et <code>wsls</code>, c’est une longue suite de coopérations sans la moindre anicroche), (ii) il n’est, pour autant, ni naïf (comme <code>allc</code>) ni trop gentils (<code> tf2t </code>) et (iii) il sait pardonner (contrairement à <code>grudger</code>). Et ça, manifestement, c’est une très bonne stratégie.</p>
<h5>Notes</h5>
<ha>Principales fonctions R utilisées</ha>
<p>La fonction <code>all</code> renvoie <code>TRUE</code> si tous ses arguments sont <code>TRUE</code> et <code>FALSE</code> dans le cas contraire :</p>
<pre>> all(c(TRUE, TRUE, TRUE))
[1] TRUE
></pre>
<p>Mais :</p>
<pre>> all(c(TRUE, FALSE, TRUE))
[1] FALSE
> </pre>
<p>La fonction <code>ifelse</code> renvoie sont 2ème argument si le premier est <code>TRUE</code> ou le 3ème dans le cas contraire :</p>
<pre>> ifelse(TRUE, 1, 2)
[1] 1
></pre>
<p>Mais :</p>
<pre>> ifelse(FALSE, 1, 2)
[1] 2
></pre>
<p>La fonction <code>as.logical</code> transforme son argument en vecteur logique (<code>TRUE</code> ou <code>FALSE</code>) :</p>
<pre>> as.logical(0)
[1] FALSE
> as.logical(1)
[1] TRUE
></pre>
<p>Pour votre information :</p>
<pre>> as.logical(15)
[1] TRUE
></pre>
<p>La fonction <code>tail</code> renvoie les <code>n</code> derniers membres de son premier argument : </p>
<pre>> x <- 1:5
> tail(x, 3)
[1] 3 4 5
></pre>
<p>Et :</p>
<pre>> head(x, 3)
[1] 1 2 3
></pre>
<p>La fonction <code>sample</code> sélectionne aléatoirement <code>n</code> membres de son premier argument : </p>
<pre>> x <- 1:5
> sample(x, 3)
[1] 2 1 3
></pre>
<p>Par défaut, chaque élément a autant de chance d’être sélectionné que les autres mais vous pouvez aussi utiliser l’argument <code>prob</code> pour modifier ça.</p>
<p>Enfin <code>!</code> indique la négation :</p>
<pre>> !TRUE
[1] FALSE
> FALSE == !TRUE
[1] TRUE
></pre>
<h4>Ma libraire sur Github</h4>
<p>Tous les algos cités ci-dessus (et mêmes d'autres) ainsi que les fonctions <code>.match</code> (pour faire un match) et <code>.tournament</code> (pour organiser un tournois) sont disponibles <a hef='https://github.com/gnicoulaud/axelrod/blob/master/introduction' target='_blank'>sur Github</a>.</p>
<h4>Vous voulez jouer ?</h4>
<p>Si c'est le cas, j'organise une petite compétition. Tous les détails sont <a href='https://github.com/gnicoulaud/axelrod/tree/master' target='_blank'>sur Github</a> (attention : je risque de modifier encore deux ou trois petites choses) et pour soumettre vos œuvres, utilisez <a href='https://docs.google.com/forms/d/e/1FAIpQLSc8TlbrGz2mPecRDrqVwp5huqZFBsAOkwiDz2o3s_aFSFBsyg/viewform?usp=sf_link' target='_blank'>ce lien</a>.</p>
Guillaume Nicoulaudhttp://www.blogger.com/profile/18327218552388699334noreply@blogger.com14