Corrigé du TD noté du mercredi 17 octobre 2012 1) Classe "série temporelle" : Nom de la classe : SérieTemporelle Attributs : - x[] : tableau de nombres à virgule flottante, qui contiendra les valeurs de la série. - T : entier, nombre de périodes dont les valeurs sont contenues dans la série. Méthodes : + constructeur, qui prends, par exemple, une séquence (itérable) de flottants (les prix de la série temporelle) et les met dans le tableau x[] ; l'attribut T sera ensuite valorisé avec le nombre de prix mis dans x[] ; + prix(t : entier) : flottant -- renvoie le prix pour la période t, contrôler que 1 <= t <= T, si ce n'est pas le cas, renvoyer 0 ; + ajoute(p : flottant) -- ajoute le nouveau prix p à la fin de la série, incrémente T ; + variation(t : entier) : flottant -- renvoie la variation du prix en pourcentage entre la période t - 1 et la période t ; ... + Toutes les méthodes suggérés par les exercices suivants. 2) Statistiques simples 2.1) flottant variation(entier t) si t <= 1 ou t > T lancer une exception "indice hors borne" renvoyer 100*(x[t]/x[t - 1] - 1) maxVarPos() maxVar <- 0 pour t de 2 à T v <- variation(t) si v > maxVar maxVar <- v renvoyer maxVar 2.2) maxVarNeg() maxVar <- 0 pour t de 2 à T v <- variation(t) si v < maxVar maxVar <- v renvoyer maxVar 3) Moyennes mobiles 3.1) moyMobSimple(entier n, entier t) si t < n lancer exception "données insuffisantes" somme <- 0 pour k de 0 à n - 1 somme <- somme + x[t - k] renvoyer somme/n 3.2) moyMobExp(flottant alpha, entier t) m <- x[1] # on fait comme si tous les prix antérieures étaient égaux au premier prix de la série ; # pour t >> 1, l'influence de cette hypothèse sur le résultat sera négligeable pour k de 1 à t m <- alpha*x[t] + (1 - alpha)*m renvoyer m Petite remarque : alpha devrait être compris dans l'intervalle (0, 1) pour donner des résultats sensés. Cependant, même si alpha est hors de l'intervalle (0, 1), la méthode n'effectuera aucune opération illicite ; c'est pour cette raison que nous ne faisons pas de contrôle sur la valeur d'alpha. 4) L'indicateur zig-zag classe Retournement attributs : + entier t # la période à laquelle le retournement de tendence s'est avéré + flottant x # le prix x[t] + Booléen max # faux = minimum, vrai = maximum + flottant var # variation en pourcentage par rapport au retournement précédent + Retournement suivant # référence au retournement suivant méthodes : + constructeur(t, x, max, var) # crée un objet avec les quatre premiers attributs comme les paramètres # et la référence au retournement suivant = nil. Retournement zigZag(flottant R) Retournement ret <- nil Retournement dernier <- nil entier début <- 1 flottant min, max intier argmin, argmax min <- x[début] max <- min # la tendance initiale sera opposée à la première variation dans la série : flottant z <- -variation(2) pour t de 2 à T si x[t] > max max <- x[t] argmax <- t si x[t] < min min <- x[t] argmin <- t si z < 0 et R < 100*(max/x[t] - 1) # fin d'une tendance à la hausse, début d'une baisse z <- 100*(max/x[début] - 1) si dernier = nil ret <- Retournement(argmax, max, vrai, z) dernier <- ret sinon dernier.suivant <- Retournement(argmax, max, vrai, z) dernier <- dernier.suivant # initualiser la nouvelle tendance : début <- argmax max <- x[début] min <- x[t] argmin <- t sinon, si z > 0 et R < 100*(x[t]/min - 1) # fin d'une tendance à la baisse, début d'une hausse z <- 100*(min/x[début] - 1) si dernier = nil ret <- Retournement(argmin, min, faux, z) dernier <- ret sinon dernier.suivant <- Retournement(argmin, min, faux, z) dernier <- dernier.suivant # initualiser la nouvelle tendance : début <- argmin min <- x[début] max <- x[t] argmax <- t renvoyer ret