pyfinmodel 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyfinmodel-0.1.0/PKG-INFO +117 -0
- pyfinmodel-0.1.0/README.md +84 -0
- pyfinmodel-0.1.0/pyfinmodel/__init__.py +219 -0
- pyfinmodel-0.1.0/pyfinmodel/core/__init__.py +1 -0
- pyfinmodel-0.1.0/pyfinmodel/core/affichage.py +66 -0
- pyfinmodel-0.1.0/pyfinmodel/cours1/__init__.py +5 -0
- pyfinmodel-0.1.0/pyfinmodel/cours1/concepts_finance.py +148 -0
- pyfinmodel-0.1.0/pyfinmodel/cours1/python_bases.py +179 -0
- pyfinmodel-0.1.0/pyfinmodel/cours2/__init__.py +5 -0
- pyfinmodel-0.1.0/pyfinmodel/cours2/numpy_pandas.py +347 -0
- pyfinmodel-0.1.0/pyfinmodel/cours2/python_fonctionnel.py +220 -0
- pyfinmodel-0.1.0/pyfinmodel/cours3/__init__.py +5 -0
- pyfinmodel-0.1.0/pyfinmodel/cours3/chargement.py +199 -0
- pyfinmodel-0.1.0/pyfinmodel/cours3/rendements.py +192 -0
- pyfinmodel-0.1.0/pyfinmodel/cours3/visualisation.py +197 -0
- pyfinmodel-0.1.0/pyfinmodel/cours4/__init__.py +5 -0
- pyfinmodel-0.1.0/pyfinmodel/cours4/indicateurs.py +245 -0
- pyfinmodel-0.1.0/pyfinmodel/cours4/signaux.py +173 -0
- pyfinmodel-0.1.0/pyfinmodel/cours5/__init__.py +5 -0
- pyfinmodel-0.1.0/pyfinmodel/cours5/medaf.py +303 -0
- pyfinmodel-0.1.0/pyfinmodel/cours5/regression_ols.py +329 -0
- pyfinmodel-0.1.0/pyfinmodel.egg-info/PKG-INFO +117 -0
- pyfinmodel-0.1.0/pyfinmodel.egg-info/SOURCES.txt +26 -0
- pyfinmodel-0.1.0/pyfinmodel.egg-info/dependency_links.txt +1 -0
- pyfinmodel-0.1.0/pyfinmodel.egg-info/requires.txt +11 -0
- pyfinmodel-0.1.0/pyfinmodel.egg-info/top_level.txt +1 -0
- pyfinmodel-0.1.0/pyproject.toml +67 -0
- pyfinmodel-0.1.0/setup.cfg +4 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
|
+
Name: pyfinmodel
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Documentation interactive des cours de modélisation financière avec Python
|
|
5
|
+
Author: Nadir Hadji
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/nadirhadji/pyfinmodel
|
|
8
|
+
Project-URL: Documentation, https://github.com/nadirhadji/pyfinmodel#readme
|
|
9
|
+
Project-URL: Repository, https://github.com/nadirhadji/pyfinmodel
|
|
10
|
+
Keywords: finance,financial-modeling,python,CAPM,MEDAF,technical-analysis,econometrics,education
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Intended Audience :: Education
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Topic :: Education
|
|
20
|
+
Classifier: Topic :: Office/Business :: Financial
|
|
21
|
+
Requires-Python: >=3.9
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
Requires-Dist: numpy>=1.24
|
|
24
|
+
Requires-Dist: pandas>=2.0
|
|
25
|
+
Requires-Dist: matplotlib>=3.7
|
|
26
|
+
Requires-Dist: seaborn>=0.12
|
|
27
|
+
Requires-Dist: yfinance>=0.2
|
|
28
|
+
Requires-Dist: statsmodels>=0.14
|
|
29
|
+
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
31
|
+
Requires-Dist: build; extra == "dev"
|
|
32
|
+
Requires-Dist: twine; extra == "dev"
|
|
33
|
+
|
|
34
|
+
# pyfinmodel — Modélisation Financière avec Python
|
|
35
|
+
|
|
36
|
+
Documentation interactive des cours FIN8524. Installez la librairie et accédez instantanément aux concepts, formules et snippets de code des cours.
|
|
37
|
+
|
|
38
|
+
## Installation
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
pip install pyfinmodel
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Démarrage rapide
|
|
45
|
+
|
|
46
|
+
```python
|
|
47
|
+
import pyfinmodel
|
|
48
|
+
|
|
49
|
+
# Vue d'ensemble du package
|
|
50
|
+
pyfinmodel.aide()
|
|
51
|
+
|
|
52
|
+
# Lister tous les cours
|
|
53
|
+
pyfinmodel.liste_cours()
|
|
54
|
+
|
|
55
|
+
# Résumé d'un cours
|
|
56
|
+
pyfinmodel.resume_cours(1)
|
|
57
|
+
|
|
58
|
+
# Rechercher un concept
|
|
59
|
+
pyfinmodel.chercher("bêta")
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Structure des cours
|
|
63
|
+
|
|
64
|
+
| Module | Thème | Niveau |
|
|
65
|
+
|--------|-------|--------|
|
|
66
|
+
| `cours1` | Introduction Python & Finance | Débutant |
|
|
67
|
+
| `cours2` | Calcul Appliqué — NumPy & Pandas | Intermédiaire |
|
|
68
|
+
| `cours3` | Analyse de Données Financières | Intermédiaire–Avancé |
|
|
69
|
+
| `cours4` | Analyse Technique & Indicateurs | Avancé |
|
|
70
|
+
| `cours5` | Économétrie & MEDAF/CAPM | Avancé |
|
|
71
|
+
|
|
72
|
+
## Exemples d'utilisation
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
# --- Cours 1 ---
|
|
76
|
+
from pyfinmodel.cours1 import concepts_finance, python_bases
|
|
77
|
+
|
|
78
|
+
concepts_finance.decisions_financieres()
|
|
79
|
+
concepts_finance.probleme_agence()
|
|
80
|
+
python_bases.f_strings_demo()
|
|
81
|
+
python_bases.f_strings_code() # retourne le snippet copiable
|
|
82
|
+
|
|
83
|
+
# --- Cours 2 ---
|
|
84
|
+
from pyfinmodel.cours2 import python_fonctionnel, numpy_pandas
|
|
85
|
+
|
|
86
|
+
python_fonctionnel.list_comprehension_intro()
|
|
87
|
+
python_fonctionnel.lambda_intro()
|
|
88
|
+
numpy_pandas.numpy_array_intro()
|
|
89
|
+
numpy_pandas.pandas_dataframe_intro()
|
|
90
|
+
|
|
91
|
+
# --- Cours 3 ---
|
|
92
|
+
from pyfinmodel.cours3 import chargement, rendements, visualisation
|
|
93
|
+
|
|
94
|
+
chargement.charger_csv_demo()
|
|
95
|
+
rendements.rendement_simple_demo()
|
|
96
|
+
visualisation.graphique_prix_demo()
|
|
97
|
+
|
|
98
|
+
# --- Cours 4 ---
|
|
99
|
+
from pyfinmodel.cours4 import indicateurs, signaux
|
|
100
|
+
|
|
101
|
+
indicateurs.sma_definition()
|
|
102
|
+
indicateurs.ema_definition()
|
|
103
|
+
indicateurs.bollinger_definition()
|
|
104
|
+
signaux.signal_bollinger_definition()
|
|
105
|
+
|
|
106
|
+
# --- Cours 5 ---
|
|
107
|
+
from pyfinmodel.cours5 import regression_ols, medaf
|
|
108
|
+
|
|
109
|
+
medaf.medaf_definition()
|
|
110
|
+
medaf.beta_definition()
|
|
111
|
+
regression_ols.r_carre_definition()
|
|
112
|
+
regression_ols.ols_demo()
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Licence
|
|
116
|
+
|
|
117
|
+
MIT
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# pyfinmodel — Modélisation Financière avec Python
|
|
2
|
+
|
|
3
|
+
Documentation interactive des cours FIN8524. Installez la librairie et accédez instantanément aux concepts, formules et snippets de code des cours.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install pyfinmodel
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Démarrage rapide
|
|
12
|
+
|
|
13
|
+
```python
|
|
14
|
+
import pyfinmodel
|
|
15
|
+
|
|
16
|
+
# Vue d'ensemble du package
|
|
17
|
+
pyfinmodel.aide()
|
|
18
|
+
|
|
19
|
+
# Lister tous les cours
|
|
20
|
+
pyfinmodel.liste_cours()
|
|
21
|
+
|
|
22
|
+
# Résumé d'un cours
|
|
23
|
+
pyfinmodel.resume_cours(1)
|
|
24
|
+
|
|
25
|
+
# Rechercher un concept
|
|
26
|
+
pyfinmodel.chercher("bêta")
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Structure des cours
|
|
30
|
+
|
|
31
|
+
| Module | Thème | Niveau |
|
|
32
|
+
|--------|-------|--------|
|
|
33
|
+
| `cours1` | Introduction Python & Finance | Débutant |
|
|
34
|
+
| `cours2` | Calcul Appliqué — NumPy & Pandas | Intermédiaire |
|
|
35
|
+
| `cours3` | Analyse de Données Financières | Intermédiaire–Avancé |
|
|
36
|
+
| `cours4` | Analyse Technique & Indicateurs | Avancé |
|
|
37
|
+
| `cours5` | Économétrie & MEDAF/CAPM | Avancé |
|
|
38
|
+
|
|
39
|
+
## Exemples d'utilisation
|
|
40
|
+
|
|
41
|
+
```python
|
|
42
|
+
# --- Cours 1 ---
|
|
43
|
+
from pyfinmodel.cours1 import concepts_finance, python_bases
|
|
44
|
+
|
|
45
|
+
concepts_finance.decisions_financieres()
|
|
46
|
+
concepts_finance.probleme_agence()
|
|
47
|
+
python_bases.f_strings_demo()
|
|
48
|
+
python_bases.f_strings_code() # retourne le snippet copiable
|
|
49
|
+
|
|
50
|
+
# --- Cours 2 ---
|
|
51
|
+
from pyfinmodel.cours2 import python_fonctionnel, numpy_pandas
|
|
52
|
+
|
|
53
|
+
python_fonctionnel.list_comprehension_intro()
|
|
54
|
+
python_fonctionnel.lambda_intro()
|
|
55
|
+
numpy_pandas.numpy_array_intro()
|
|
56
|
+
numpy_pandas.pandas_dataframe_intro()
|
|
57
|
+
|
|
58
|
+
# --- Cours 3 ---
|
|
59
|
+
from pyfinmodel.cours3 import chargement, rendements, visualisation
|
|
60
|
+
|
|
61
|
+
chargement.charger_csv_demo()
|
|
62
|
+
rendements.rendement_simple_demo()
|
|
63
|
+
visualisation.graphique_prix_demo()
|
|
64
|
+
|
|
65
|
+
# --- Cours 4 ---
|
|
66
|
+
from pyfinmodel.cours4 import indicateurs, signaux
|
|
67
|
+
|
|
68
|
+
indicateurs.sma_definition()
|
|
69
|
+
indicateurs.ema_definition()
|
|
70
|
+
indicateurs.bollinger_definition()
|
|
71
|
+
signaux.signal_bollinger_definition()
|
|
72
|
+
|
|
73
|
+
# --- Cours 5 ---
|
|
74
|
+
from pyfinmodel.cours5 import regression_ols, medaf
|
|
75
|
+
|
|
76
|
+
medaf.medaf_definition()
|
|
77
|
+
medaf.beta_definition()
|
|
78
|
+
regression_ols.r_carre_definition()
|
|
79
|
+
regression_ols.ols_demo()
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Licence
|
|
83
|
+
|
|
84
|
+
MIT
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
"""
|
|
2
|
+
pyfinmodel — Modélisation Financière avec Python
|
|
3
|
+
Documentation interactive des cours FIN8524.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from pyfinmodel.core.affichage import (
|
|
7
|
+
_afficher_md,
|
|
8
|
+
_afficher_section,
|
|
9
|
+
_afficher_texte,
|
|
10
|
+
_afficher_titre,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
__version__ = "0.1.0"
|
|
14
|
+
__all__ = ["aide", "liste_cours", "resume_cours", "chercher"]
|
|
15
|
+
|
|
16
|
+
_COURS_META = {
|
|
17
|
+
1: {
|
|
18
|
+
"titre": "Introduction Python & Finance d'Entreprise",
|
|
19
|
+
"niveau": "Débutant",
|
|
20
|
+
"themes": [
|
|
21
|
+
"Décisions financières",
|
|
22
|
+
"Gouvernance",
|
|
23
|
+
"Variables Python",
|
|
24
|
+
"Listes",
|
|
25
|
+
"f-strings",
|
|
26
|
+
],
|
|
27
|
+
"librairies": ["Python natif"],
|
|
28
|
+
},
|
|
29
|
+
2: {
|
|
30
|
+
"titre": "Calcul Appliqué — NumPy & Pandas",
|
|
31
|
+
"niveau": "Intermédiaire",
|
|
32
|
+
"themes": [
|
|
33
|
+
"List comprehension",
|
|
34
|
+
"Lambda / map / filter",
|
|
35
|
+
"NumPy arrays",
|
|
36
|
+
"Pandas DataFrames",
|
|
37
|
+
],
|
|
38
|
+
"librairies": ["numpy", "pandas"],
|
|
39
|
+
},
|
|
40
|
+
3: {
|
|
41
|
+
"titre": "Analyse de Données Financières & Visualisation",
|
|
42
|
+
"niveau": "Intermédiaire–Avancé",
|
|
43
|
+
"themes": [
|
|
44
|
+
"Chargement CSV",
|
|
45
|
+
"Rendements",
|
|
46
|
+
"Nettoyage",
|
|
47
|
+
"Matplotlib",
|
|
48
|
+
"Seaborn",
|
|
49
|
+
"Yahoo Finance",
|
|
50
|
+
],
|
|
51
|
+
"librairies": ["pandas", "numpy", "matplotlib", "seaborn", "yfinance"],
|
|
52
|
+
},
|
|
53
|
+
4: {
|
|
54
|
+
"titre": "Analyse Technique & Indicateurs Boursiers",
|
|
55
|
+
"niveau": "Avancé",
|
|
56
|
+
"themes": ["SMA / EMA", "Bandes de Bollinger", "Signaux achat/vente"],
|
|
57
|
+
"librairies": ["yfinance", "matplotlib", "pandas"],
|
|
58
|
+
},
|
|
59
|
+
5: {
|
|
60
|
+
"titre": "Économétrie & MEDAF/CAPM",
|
|
61
|
+
"niveau": "Avancé",
|
|
62
|
+
"themes": [
|
|
63
|
+
"Régression OLS",
|
|
64
|
+
"Coefficient Bêta",
|
|
65
|
+
"R²",
|
|
66
|
+
"F-stat",
|
|
67
|
+
"t-stat",
|
|
68
|
+
"p-value",
|
|
69
|
+
"MEDAF",
|
|
70
|
+
],
|
|
71
|
+
"librairies": ["statsmodels", "pandas", "yfinance"],
|
|
72
|
+
},
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
_INDEX_GLOBAL = {
|
|
76
|
+
"décision": (1, "cours1.concepts_finance.decisions_financieres"),
|
|
77
|
+
"investissement": (1, "cours1.concepts_finance.decision_investissement"),
|
|
78
|
+
"financement": (1, "cours1.concepts_finance.decision_financement"),
|
|
79
|
+
"dividende": (1, "cours1.concepts_finance.decision_dividendes"),
|
|
80
|
+
"gouvernance": (1, "cours1.concepts_finance.gouvernance_entreprise"),
|
|
81
|
+
"agence": (1, "cours1.concepts_finance.probleme_agence"),
|
|
82
|
+
"f-string": (1, "cours1.python_bases.f_strings_demo"),
|
|
83
|
+
"liste": (1, "cours1.python_bases.listes_intro"),
|
|
84
|
+
"list comprehension": (2, "cours2.python_fonctionnel.list_comprehension_intro"),
|
|
85
|
+
"lambda": (2, "cours2.python_fonctionnel.lambda_intro"),
|
|
86
|
+
"map": (2, "cours2.python_fonctionnel.map_demo"),
|
|
87
|
+
"filter": (2, "cours2.python_fonctionnel.filter_demo"),
|
|
88
|
+
"numpy": (2, "cours2.numpy_pandas.numpy_array_intro"),
|
|
89
|
+
"array": (2, "cours2.numpy_pandas.numpy_array_intro"),
|
|
90
|
+
"reshape": (2, "cours2.numpy_pandas.numpy_reshape_demo"),
|
|
91
|
+
"dataframe": (2, "cours2.numpy_pandas.pandas_dataframe_intro"),
|
|
92
|
+
"pandas": (2, "cours2.numpy_pandas.pandas_dataframe_intro"),
|
|
93
|
+
"csv": (3, "cours3.chargement.charger_csv_demo"),
|
|
94
|
+
"datetime": (3, "cours3.chargement.convertir_dates_demo"),
|
|
95
|
+
"yfinance": (3, "cours3.chargement.telecharger_yfinance_demo"),
|
|
96
|
+
"rendement": (3, "cours3.rendements.rendement_simple_demo"),
|
|
97
|
+
"pct_change": (3, "cours3.rendements.rendement_simple_demo"),
|
|
98
|
+
"boxplot": (3, "cours3.visualisation.boxplot_demo"),
|
|
99
|
+
"seaborn": (3, "cours3.visualisation.boxplot_demo"),
|
|
100
|
+
"matplotlib": (3, "cours3.visualisation.graphique_prix_demo"),
|
|
101
|
+
"sma": (4, "cours4.indicateurs.sma_definition"),
|
|
102
|
+
"moyenne mobile": (4, "cours4.indicateurs.sma_definition"),
|
|
103
|
+
"ema": (4, "cours4.indicateurs.ema_definition"),
|
|
104
|
+
"bollinger": (4, "cours4.indicateurs.bollinger_definition"),
|
|
105
|
+
"signal": (4, "cours4.signaux.signal_bollinger_definition"),
|
|
106
|
+
"achat": (4, "cours4.signaux.signal_bollinger_definition"),
|
|
107
|
+
"économétrie": (5, "cours5.regression_ols.ols_definition"),
|
|
108
|
+
"ols": (5, "cours5.regression_ols.ols_definition"),
|
|
109
|
+
"régression": (5, "cours5.regression_ols.ols_demo"),
|
|
110
|
+
"r²": (5, "cours5.regression_ols.r_carre_definition"),
|
|
111
|
+
"r2": (5, "cours5.regression_ols.r_carre_definition"),
|
|
112
|
+
"f-stat": (5, "cours5.regression_ols.f_statistique_definition"),
|
|
113
|
+
"t-stat": (5, "cours5.regression_ols.t_statistique_definition"),
|
|
114
|
+
"p-value": (5, "cours5.regression_ols.p_value_interpretation"),
|
|
115
|
+
"bêta": (5, "cours5.medaf.beta_definition"),
|
|
116
|
+
"beta": (5, "cours5.medaf.beta_definition"),
|
|
117
|
+
"medaf": (5, "cours5.medaf.medaf_definition"),
|
|
118
|
+
"capm": (5, "cours5.medaf.medaf_definition"),
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def aide() -> None:
|
|
123
|
+
"""Affiche la vue d'ensemble complète du package pyfinmodel."""
|
|
124
|
+
_afficher_titre("pyfinmodel — Documentation des Cours de Modélisation Financière")
|
|
125
|
+
_afficher_texte(
|
|
126
|
+
f"**Version :** {__version__}\n\n"
|
|
127
|
+
"**Fonctions globales :**\n\n"
|
|
128
|
+
"- `pyfinmodel.aide()` → Cette aide\n"
|
|
129
|
+
"- `pyfinmodel.liste_cours()` → Liste de tous les cours\n"
|
|
130
|
+
"- `pyfinmodel.resume_cours(n)` → Résumé du cours n (1 à 5)\n"
|
|
131
|
+
"- `pyfinmodel.chercher('terme')` → Chercher un concept"
|
|
132
|
+
)
|
|
133
|
+
_afficher_section("Modules disponibles")
|
|
134
|
+
lignes = []
|
|
135
|
+
for numero, meta in _COURS_META.items():
|
|
136
|
+
themes_courts = ", ".join(meta["themes"][:3]) + (
|
|
137
|
+
"..." if len(meta["themes"]) > 3 else ""
|
|
138
|
+
)
|
|
139
|
+
lignes.append(
|
|
140
|
+
f"**Cours {numero} : {meta['titre']}** \n"
|
|
141
|
+
f"Niveau : {meta['niveau']} | Thèmes : {themes_courts} \n"
|
|
142
|
+
f"`from pyfinmodel.cours{numero} import ...`"
|
|
143
|
+
)
|
|
144
|
+
_afficher_md("\n\n---\n\n".join(lignes))
|
|
145
|
+
_afficher_section("Exemple rapide")
|
|
146
|
+
_afficher_texte(
|
|
147
|
+
"```python\n"
|
|
148
|
+
"from pyfinmodel.cours5 import medaf\n"
|
|
149
|
+
"medaf.medaf_definition()\n"
|
|
150
|
+
"medaf.beta_definition()\n"
|
|
151
|
+
"```"
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def liste_cours() -> None:
|
|
156
|
+
"""Affiche la liste des cours avec titre, niveau et thèmes."""
|
|
157
|
+
_afficher_titre("Cours disponibles dans pyfinmodel")
|
|
158
|
+
lignes = []
|
|
159
|
+
for numero, meta in _COURS_META.items():
|
|
160
|
+
lignes.append(
|
|
161
|
+
f"**Cours {numero} — {meta['titre']}** \n"
|
|
162
|
+
f"🎓 Niveau : {meta['niveau']} \n"
|
|
163
|
+
f"📌 Thèmes : {', '.join(meta['themes'])} \n"
|
|
164
|
+
f"📦 Librairies : `{'`, `'.join(meta['librairies'])}`"
|
|
165
|
+
)
|
|
166
|
+
_afficher_md("\n\n---\n\n".join(lignes))
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def resume_cours(numero_cours: int) -> None:
|
|
170
|
+
"""Affiche le résumé complet d'un cours.
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
numero_cours: Numéro du cours (1 à 5).
|
|
174
|
+
"""
|
|
175
|
+
if numero_cours not in _COURS_META:
|
|
176
|
+
print(
|
|
177
|
+
f" Erreur: le cours {numero_cours} n'existe pas. Choisissez entre 1 et 5."
|
|
178
|
+
)
|
|
179
|
+
return
|
|
180
|
+
|
|
181
|
+
meta = _COURS_META[numero_cours]
|
|
182
|
+
_afficher_titre(f"Cours {numero_cours} — {meta['titre']}")
|
|
183
|
+
themes_md = "\n".join(f"- {t}" for t in meta["themes"])
|
|
184
|
+
_afficher_texte(
|
|
185
|
+
f"**Niveau** : {meta['niveau']} \n"
|
|
186
|
+
f"**Librairies** : `{'`, `'.join(meta['librairies'])}`\n\n"
|
|
187
|
+
f"{themes_md}"
|
|
188
|
+
)
|
|
189
|
+
_afficher_section("Pour explorer le cours")
|
|
190
|
+
_afficher_texte(f"```python\nfrom pyfinmodel.cours{numero_cours} import *\n```")
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def chercher(terme: str) -> None:
|
|
194
|
+
"""Recherche un concept/terme dans l'ensemble du package.
|
|
195
|
+
|
|
196
|
+
Args:
|
|
197
|
+
terme: Mot-clé à rechercher (ex: 'bêta', 'bollinger', 'lambda').
|
|
198
|
+
"""
|
|
199
|
+
terme_lower = terme.lower().strip()
|
|
200
|
+
_afficher_titre(f"Résultats pour : « {terme} »")
|
|
201
|
+
|
|
202
|
+
resultats = [
|
|
203
|
+
(cle, cours, chemin)
|
|
204
|
+
for cle, (cours, chemin) in _INDEX_GLOBAL.items()
|
|
205
|
+
if terme_lower in cle.lower()
|
|
206
|
+
]
|
|
207
|
+
|
|
208
|
+
if not resultats:
|
|
209
|
+
_afficher_texte(
|
|
210
|
+
f"Aucun résultat pour **« {terme} »**. \n"
|
|
211
|
+
"Conseil : essayez `bêta`, `ema`, `ols`, `rendement`, `lambda`..."
|
|
212
|
+
)
|
|
213
|
+
return
|
|
214
|
+
|
|
215
|
+
lignes = [
|
|
216
|
+
f"**Cours {cours}** — `{cle}` \n⇒ `{chemin}()`"
|
|
217
|
+
for cle, cours, chemin in resultats
|
|
218
|
+
]
|
|
219
|
+
_afficher_md("\n\n".join(lignes))
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Module core — utilitaires internes."""
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""Utilitaires d'affichage communs pour pyfinmodel.
|
|
2
|
+
|
|
3
|
+
Utilise IPython.display (Markdown + HTML) quand disponible (Jupyter),
|
|
4
|
+
sinon bascule sur du texte brut (terminal).
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import textwrap
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# ── Détection de l'environnement Jupyter ────────────────────────────
|
|
11
|
+
def _est_jupyter() -> bool:
|
|
12
|
+
try:
|
|
13
|
+
from IPython import get_ipython
|
|
14
|
+
|
|
15
|
+
shell = get_ipython()
|
|
16
|
+
return shell is not None and hasattr(shell, "kernel")
|
|
17
|
+
except ImportError:
|
|
18
|
+
return False
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _afficher_md(contenu: str) -> None:
|
|
22
|
+
"""Affiche du Markdown rendu dans Jupyter, texte brut sinon."""
|
|
23
|
+
if _est_jupyter():
|
|
24
|
+
from IPython.display import Markdown, display
|
|
25
|
+
|
|
26
|
+
display(Markdown(contenu))
|
|
27
|
+
else:
|
|
28
|
+
print(contenu)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# ── API publique ─────────────────────────────────────────────────────
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _afficher_titre(texte: str) -> None:
|
|
35
|
+
"""Affiche un titre de niveau 2."""
|
|
36
|
+
_afficher_md(f"\n## 📘 {texte}\n---")
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _afficher_section(texte: str) -> None:
|
|
40
|
+
"""Affiche un titre de section (niveau 3)."""
|
|
41
|
+
_afficher_md(f"\n### {texte}")
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _afficher_formule(nom: str, formule: str, description: str = "") -> None:
|
|
45
|
+
"""Affiche une formule dans un bloc de code inline."""
|
|
46
|
+
lignes = [f"\n**📐 {nom}**", f"`{formule}`"]
|
|
47
|
+
if description:
|
|
48
|
+
lignes.append(f"*{description}*")
|
|
49
|
+
_afficher_md("\n\n".join(lignes) + "\n")
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _afficher_code(titre: str, code: str) -> None:
|
|
53
|
+
"""Affiche un snippet Python avec coloration syntaxique."""
|
|
54
|
+
code_propre = textwrap.dedent(code).strip()
|
|
55
|
+
_afficher_md(f"\n**💻 {titre}**\n\n```python\n{code_propre}\n```\n")
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _afficher_texte(texte: str) -> None:
|
|
59
|
+
"""Affiche un bloc de texte brut déjà formaté en Markdown."""
|
|
60
|
+
_afficher_md(textwrap.dedent(texte).strip())
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _afficher_definition(terme: str, definition: str) -> None:
|
|
64
|
+
"""Affiche une définition formatée."""
|
|
65
|
+
definition_propre = definition.replace("\n ", "\n").replace("\n ", "\n")
|
|
66
|
+
_afficher_md(f"\n> **📖 {terme}** \n> {definition_propre}\n")
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Cours 1 — Concepts de Finance d'Entreprise
|
|
3
|
+
===========================================
|
|
4
|
+
Les trois grandes décisions, gouvernance et problème d'agence.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from pyfinmodel.core.affichage import (
|
|
8
|
+
_afficher_code,
|
|
9
|
+
_afficher_definition,
|
|
10
|
+
_afficher_section,
|
|
11
|
+
_afficher_texte,
|
|
12
|
+
_afficher_titre,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def decisions_financieres() -> None:
|
|
17
|
+
"""Affiche les trois grandes décisions en finance d'entreprise."""
|
|
18
|
+
_afficher_titre("Les Trois Grandes Décisions en Finance d'Entreprise")
|
|
19
|
+
_afficher_texte(
|
|
20
|
+
"L'objectif ultime de toute décision financière est de "
|
|
21
|
+
"**MAXIMISER LA VALEUR DE LA FIRME** (mesurée par le cours de l'action)."
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
_afficher_section("1. Décision d'Investissement")
|
|
25
|
+
_afficher_texte(
|
|
26
|
+
"Quels projets ou actifs l'entreprise doit-elle financer ?\n\n"
|
|
27
|
+
"- Règle : accepter les projets dont la VAN (Valeur Actuelle Nette) > 0\n"
|
|
28
|
+
"- Exemples : achat d'équipements, R&D, acquisitions"
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
_afficher_section("2. Décision de Financement")
|
|
32
|
+
_afficher_texte(
|
|
33
|
+
"Comment l'entreprise doit-elle se financer ?\n\n"
|
|
34
|
+
"- Dettes vs Capitaux propres (structure du capital)\n"
|
|
35
|
+
"- Compromis entre avantage fiscal de la dette et coûts de détresse"
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
_afficher_section("3. Décision de Distribution (Dividendes)")
|
|
39
|
+
_afficher_texte(
|
|
40
|
+
"Quoi faire avec les bénéfices générés ?\n\n"
|
|
41
|
+
"- Distribuer des dividendes aux actionnaires\n"
|
|
42
|
+
"- OU réinvestir dans de nouveaux projets"
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def decision_investissement() -> None:
|
|
47
|
+
"""Détail de la décision d'investissement."""
|
|
48
|
+
_afficher_titre("Décision d'Investissement")
|
|
49
|
+
_afficher_definition(
|
|
50
|
+
"Règle de la VAN",
|
|
51
|
+
"Accepter tous les projets avec une Valeur Actuelle Nette > 0.\n"
|
|
52
|
+
" VAN = Σ [ CF_t / (1+r)^t ] - Investissement initial",
|
|
53
|
+
)
|
|
54
|
+
_afficher_texte(
|
|
55
|
+
"**Critères complémentaires :**\n\n"
|
|
56
|
+
"- TRI (Taux de Rendement Interne) > Coût du Capital\n"
|
|
57
|
+
"- Délai de récupération acceptable"
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def decision_financement() -> None:
|
|
62
|
+
"""Détail de la décision de financement."""
|
|
63
|
+
_afficher_titre("Décision de Financement — Structure du Capital")
|
|
64
|
+
_afficher_definition(
|
|
65
|
+
"Structure optimale du capital",
|
|
66
|
+
"Combinaison dettes / capitaux propres qui maximise la valeur\n"
|
|
67
|
+
" en minimisant le Coût Moyen Pondéré du Capital (CMPC/WACC).",
|
|
68
|
+
)
|
|
69
|
+
_afficher_texte(
|
|
70
|
+
"**Avantages de la dette :**\n\n"
|
|
71
|
+
"- Déductibilité fiscale des intérêts (bouclier fiscal)\n"
|
|
72
|
+
"- Discipline des dirigeants\n\n"
|
|
73
|
+
"**Inconvénients de la dette :**\n\n"
|
|
74
|
+
"- Coûts de détresse financière\n"
|
|
75
|
+
"- Problèmes d'agence dette-actionnaires"
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def decision_dividendes() -> None:
|
|
80
|
+
"""Détail de la politique de dividendes."""
|
|
81
|
+
_afficher_titre("Décision de Distribution — Politique de Dividendes")
|
|
82
|
+
_afficher_definition(
|
|
83
|
+
"Théorème de Modigliani-Miller (dividendes)",
|
|
84
|
+
"En marchés parfaits, la politique de dividendes n'affecte pas\n"
|
|
85
|
+
" la valeur de la firme.",
|
|
86
|
+
)
|
|
87
|
+
_afficher_texte(
|
|
88
|
+
"**En pratique :**\n\n"
|
|
89
|
+
"- Les dividendes envoient un signal sur la santé financière\n"
|
|
90
|
+
"- Rachat d'actions = forme alternative de distribution\n"
|
|
91
|
+
"- Ratio de distribution = Dividendes / Bénéfice net"
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def gouvernance_entreprise() -> None:
|
|
96
|
+
"""Explique la gouvernance d'entreprise et ses mécanismes."""
|
|
97
|
+
_afficher_titre("Gouvernance d'Entreprise")
|
|
98
|
+
_afficher_texte(
|
|
99
|
+
"La gouvernance vise à **ALIGNER LES INTÉRÊTS** des différentes parties "
|
|
100
|
+
"prenantes : actionnaires, dirigeants et créanciers."
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
_afficher_section("Mécanismes de gouvernance")
|
|
104
|
+
_afficher_texte(
|
|
105
|
+
"1. **Conseil d'Administration (CA)** — Surveille les dirigeants, approuve les grandes décisions\n\n"
|
|
106
|
+
"2. **Rémunération des dirigeants** — Stock-options, bonus liés à la performance\n\n"
|
|
107
|
+
"3. **Activisme actionnarial** — Actionnaires qui exercent leur influence pour changer la stratégie\n\n"
|
|
108
|
+
"4. **Réglementation** — Lois boursières (SEC, AMF), normes comptables (IFRS, GAAP)"
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
_afficher_section("Efficacité de la gouvernance")
|
|
112
|
+
_afficher_texte(
|
|
113
|
+
"Dépend du contexte légal et institutionnel du pays. "
|
|
114
|
+
"Les pays avec de meilleures protections légales ont une gouvernance généralement plus efficace."
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def probleme_agence() -> None:
|
|
119
|
+
"""Explique le problème d'agence en finance."""
|
|
120
|
+
_afficher_titre("Le Problème d'Agence")
|
|
121
|
+
_afficher_definition(
|
|
122
|
+
"Relation d'agence",
|
|
123
|
+
"Contrat par lequel une personne (le principal) délègue une tâche\n"
|
|
124
|
+
" à une autre (l'agent). Conflit d'intérêts potentiel.",
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
_afficher_section("Les trois conflits principaux")
|
|
128
|
+
_afficher_texte(
|
|
129
|
+
"1. **Actionnaires ↔ Dirigeants** — Les dirigeants peuvent poursuivre leurs propres intérêts. "
|
|
130
|
+
"Solutions : stock-options, surveillance du CA\n\n"
|
|
131
|
+
"2. **Actionnaires ↔ Créanciers** — Les actionnaires peuvent prendre des risques excessifs. "
|
|
132
|
+
"Transfert de richesse des créanciers vers actionnaires\n\n"
|
|
133
|
+
"3. **Actionnaires majoritaires ↔ Minoritaires** — Expropriation des minoritaires par les majoritaires"
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
_afficher_code(
|
|
137
|
+
"Illustration Python — Modélisation d'intérêts divergents",
|
|
138
|
+
"""
|
|
139
|
+
acteur = {
|
|
140
|
+
"actionnaire": {"objectif": "maximiser_valeur_action", "horizon": "long_terme"},
|
|
141
|
+
"dirigeant": {"objectif": "maximiser_bonus", "horizon": "court_terme"},
|
|
142
|
+
"créancier": {"objectif": "rembourser_dette", "horizon": "fixé_par_contrat"},
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
for role, profil in acteur.items():
|
|
146
|
+
print(f"{role:12s} → objectif: {profil['objectif']}, horizon: {profil['horizon']}")
|
|
147
|
+
""",
|
|
148
|
+
)
|