<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Manipulation de séries financières avec la classe StockPrices
La classe StockPrices facilite la récupération de données financières via différents sites. Le site Yahoo Finance requiet maintenant un cookie (depuis Mai 2017) et il est préférable de choisir Google ou Quandl. Google ne fonctionne que les marchés américains, Quandl a des historiques plus courts.
Step1:  Initialisation
Step2:  Créer un objet StockPrices
Le plus est d'utiliser le tick de la série financière utilisé par le site Yahoo Finance ou Google Finance qui fait maintenant partie du moteur de recherche ou quandl.
Step3:  La classe <tt>StockPrices</tt> contient un objet <a href="http
Step4:  De la même manière, on peut créer un objet <tt>StockPrices</tt> à partir d'un DataFrame 
Step5:  Quelques graphes
Premier dessin, on télécharge les données de BNP puis on dessine le cours de l'action.
Step6:  La même chose se produit sur une autre série financière mais pas à la même date. On trace maintenant la série Open (Adj Close défini
sur cette page View and download historical price, dividend, or split data n'est disponible qu'avec Yahoo).
Step7:  Ce type de série ne fait pas toujours apparaître les saut de prix qui survient comme par exemple le <a href="http
Step8:  Quelques opérations
Step9:  On affiche les dernières lignes.
Step10:  On récupère la série des rendements.
Step11:  On trace la série des rendements pour les derniers mois.
Step12:  Quelques notions sur les dates
La classe <i>StockPrices</i> utilise les dates sous forme de chaînes de caractères. De cette façon, il n'est pas possible de faire des opérations dessus. Pour ce faire, il faut les convertir en un objet appelé <a href="https
Step13:  On ajoute un jour 
Step14:  Puis on convertit dans l'autre sens 
Step15:  Promenade dans l'index
Il est facile de récupérer les valeurs correspondant à une date précise. Mais comment récupérer la valeur du jour d'après ?
Step16:  Sauver les tables
On peut conserver les données sous forme de fichiers pour les récupérer plus tard.
Step17:  Le fichier est sauvé. Pour le récupérer avec pandas 
Step18:  Les dates apparaissent deux fois.
Step19:  Cela est dû au fait que les dates sont à la fois une colonne et servent d'index. Pour éviter de les conserver deux fois, on demande explicitement à ce que l'index ne soit pas ajouté au fichier 
Step20:  Puis on récupère les données 
Step21:  On vérifie le fichier sur disque dur 
<ASSISTANT_TASK:>
Python Code:
import pyensae
from jyquickhelper import add_notebook_menu
add_notebook_menu()
%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('ggplot')
Explanation: Manipulation de séries financières avec la classe StockPrices
La classe StockPrices facilite la récupération de données financières via différents sites. Le site Yahoo Finance requiet maintenant un cookie (depuis Mai 2017) et il est préférable de choisir Google ou Quandl. Google ne fonctionne que les marchés américains, Quandl a des historiques plus courts.
End of explanation
import pyensae
import os
from pyensae.finance import StockPrices
cache = os.path.abspath("cache")
if not os.path.exists(cache):
    os.mkdir(cache)
Explanation: Initialisation
End of explanation
source = 'yahoo_new'
tick = 'MSFT'
stock = StockPrices(tick, folder=cache, url=source)
stock.head()
stock.tail()
Explanation: Créer un objet StockPrices
Le plus est d'utiliser le tick de la série financière utilisé par le site Yahoo Finance ou Google Finance qui fait maintenant partie du moteur de recherche ou quandl.
End of explanation
stock.dataframe.columns
Explanation: La classe <tt>StockPrices</tt> contient un objet <a href="http://pandas.pydata.org/pandas-docs/version/0.13.1/generated/pandas.DataFrame.html">pandas.DataFrame</a> auquel on accède en écrivant <tt>stock.dataframe</tt> ou <tt>stock.df</tt> :
End of explanation
import pandas
data = [{"Date":"2014-04-01", "Close":105.6}, {"Date":"2014-04-02", "Close":104.6}, 
        {"Date":"2014-04-03", "Close":105.8}, ]
df = pandas.DataFrame(data)
stock = StockPrices("donnees",df)
stock.head()
Explanation: De la même manière, on peut créer un objet <tt>StockPrices</tt> à partir d'un DataFrame :
End of explanation
import datetime
stock = StockPrices(tick, folder=cache, url=source)
ax = StockPrices.draw(stock, figsize=(12,6))
stock = StockPrices(tick, folder=cache, url=source)
StockPrices.draw(stock, figsize=(12,6));
Explanation: Quelques graphes
Premier dessin, on télécharge les données de BNP puis on dessine le cours de l'action.
End of explanation
stock = StockPrices("MSFT", folder=cache, url='yahoo')
StockPrices.draw(stock, field=["Open", "Close"], figsize=(12,6));
Explanation: La même chose se produit sur une autre série financière mais pas à la même date. On trace maintenant la série Open (Adj Close défini
sur cette page View and download historical price, dividend, or split data n'est disponible qu'avec Yahoo).
End of explanation
stock.head()
stock = StockPrices(tick)
ret = stock.returns()["2019-01-04":"2019-02-02"]
ret.dataframe.loc["2019-01-11":"2019-01-18","Close"] = 0  # on annule certains valeurs
ax = stock.plot(figsize=(16, 5))
ret.plot(axis=2, ax=ax, label_prefix="r", color='blue');
Explanation: Ce type de série ne fait pas toujours apparaître les saut de prix qui survient comme par exemple le <a href="http://invest.bnpparibas.com/fr/pid5900/en-bref.html">20 février 2002</a> lorsque le cours nominal de l'action de la BNP a été divisé par deux pour augmenter la liquidité. Le nombre d'actions a été multiplié par deux. Les données sont le plus souvent corrigées BNP février 2002.
Ajouter une seconde série sur un graphe
Dans l'exemple suivant, on trace une série financière puis on ajoute la série des rendements sur un second axe.
End of explanation
os.listdir(cache)
Explanation: Quelques opérations
End of explanation
stock.tail()
Explanation: On affiche les dernières lignes.
End of explanation
ret = stock.returns()
ret.tail()
Explanation: On récupère la série des rendements.
End of explanation
StockPrices.draw(ret, figsize=(12,6), begin="2013-12-01", date_format="%Y-%m");
Explanation: On trace la série des rendements pour les derniers mois.
End of explanation
from datetime import datetime, timedelta
dt = datetime.strptime("2014-03-31","%Y-%m-%d")
dt
Explanation: Quelques notions sur les dates
La classe <i>StockPrices</i> utilise les dates sous forme de chaînes de caractères. De cette façon, il n'est pas possible de faire des opérations dessus. Pour ce faire, il faut les convertir en un objet appelé <a href="https://docs.python.org/2/library/datetime.html">datetime</a>.
End of explanation
delta = timedelta(1)
dt = dt + delta
dt
Explanation: On ajoute un jour :
End of explanation
s = dt.strftime("%Y-%m-%d")
s
Explanation: Puis on convertit dans l'autre sens :
End of explanation
tick2 = 'GOOGL'
stock = StockPrices(tick2, folder=cache, url=source)
df = stock.dataframe
print("A", df["2005-01-04":"2005-01-06"])
print("D", df.loc["2005-01-04","Close"])
print("G", df.index.get_loc("2005-01-06"))  # retourne la position de cette date
Explanation: Promenade dans l'index
Il est facile de récupérer les valeurs correspondant à une date précise. Mais comment récupérer la valeur du jour d'après ?
End of explanation
stock = StockPrices(tick2, folder=cache, url=source)
stock.dataframe.to_csv("donnees.txt", sep="\t")
[_ for _ in os.listdir(".") if "donnees" in _]
Explanation: Sauver les tables
On peut conserver les données sous forme de fichiers pour les récupérer plus tard.
End of explanation
import pandas
df = pandas.read_csv("donnees.txt", sep="\t")
df.head()
Explanation: Le fichier est sauvé. Pour le récupérer avec pandas :
End of explanation
with open("donnees.txt","r") as f: 
    text = f.read()
print(text[:400])
Explanation: Les dates apparaissent deux fois.
End of explanation
stock = StockPrices(tick2, folder=cache, url=source)
stock.dataframe.to_csv("donnees.txt", sep="\t", index=False)
Explanation: Cela est dû au fait que les dates sont à la fois une colonne et servent d'index. Pour éviter de les conserver deux fois, on demande explicitement à ce que l'index ne soit pas ajouté au fichier :
End of explanation
df = pandas.read_csv("donnees.txt",sep="\t")
df.head()
Explanation: Puis on récupère les données :
End of explanation
with open("donnees.txt", "r") as f:
    text = f.read()
print(text[:400])
Explanation: On vérifie le fichier sur disque dur :
End of explanation
<END_TASK>