N'hésitez pas de consulter notre chaîne YouTube "INGÉNIERIE et BOURSE" pour profiter des cours et tutos gratuits !
Objectifs du tutoriel
- Savoir l’importance de Matlab
- Savoir récupérer les données des marchés financiers manuellement
- Savoir automatiser l’importation des données avec Matlab
- Savoir corriger les données corrompues avec Matlab
- Etc.
Pourquoi Matlab ?
- Matlab est un outil de développement basé sur un langage interprété contrairement aux langages C/C++, etc. Il est optimisé pour effectuer des traitements sur les tableaux et les matrices facilement. D’où sont utilisation car les données financiers sont se forent d’une multitude des tableaux (ou séries temporelles).
- Facilité d’utilisation et disponibilités du code open source
- Temps de développement réduit : Il est primordial de savoir tester sa stratégie, développer un nouveau indicateur, analyser le marché, etc. rapidement avant d’engager dans une démarche réelle dans une plateforme réelle. En effet, la plupart des formes sont compatibles avec le C/C++. Des langages qui nécessitent un temps de développement important sans garantie de résultats.
On utilisera dans la suite Matlab pour l’analyse déférée des marchés ou pour développer une stratégie long terme, ainsi pour tester rapidement les stratégies court termes comme le trading. Matlab est un bon outil d’analyse, mais n’est pas optimisé pour les stratégies temps réel.
Comment récupérer les données des marchés avec Matlab ?
La première étape pour son analyse consiste à récupérer un échantillon représentatif des donnés du marché à analyser (action, indice, devise, crypto-monnaie, matière premier, etc.). Un historique de plusieurs années ou une dizaine d’années peut être suffisant. La bonne nouvelle, Matlab dispose d’un API qui permet de se connecter à la base de données (BD) Yahoo pour en extraire les données du titre cible. Il faut juste spécifier le symbole du titre (le nom du titre dans la DB Yahoo), la plage d’extraction (date de début et de fin), ainsi la le time-frame (période de stockage des échantillons dans la BD) des données. La mauvaise nouvelle, la période est limitée à une journée ! Autrement dit, on ne peut pas détecter le comportement du marché au-delà d’une journée (voir le tuto pour plus de détails). Ci-dessous un extrait du code pour spécifier les paramètres de l’extraction.
Définition des paramètres
[pastacode lang=”c” manual=”Titre%3D’DAX’%3B%20%20%20%20%20%20%20%20%20%20%20%20%25%20Symbole%20du%20Titre%0AStart%3D’Jan-03-2005’%3B%20%20%20%20%25%20Date%20de%20d%C3%A9but%0AStop%3Ddatestr(now%2C1)%3B%20%20%20%20%25%20Date%20de%20fin%20(Actuelle)%20ou%20bien%20%22Mois-Jour-Ann%C3%A9e%22%0A%5Bnn%2C%20mm%5D%20%3D%20month(Stop)%3B%0AStop%3Dstrcat(mm%2C’-‘%2Cnum2str(day(Stop))%2C’-‘%2Cnum2str(year(Stop)))%3B%0A” message=”” highlight=”” provider=”manual”/]
Exemple
[pastacode lang=”c” manual=”%25%20Start%3D’Jan-01-2012’%3B%0A%25%20Stop%3D’Jun-01-2021’%3B%0A%25%20Titre%3D’KO’%3B” message=”” highlight=”” provider=”manual”/]
Lecture des données
La function getData() permet de récupérer les données de la VB Yahoo. Elle prend en entrée le symbole du titre (string), la date de début (string) et la date de fin (string). Elle retourne une variable Data au format double de taille Nx5 (5 tableaux de taille N). N étant le nombre d’échantillons. Ci-dessous la signification des tableaux :
- Data( :,1) : Prix d’ouverture de la journée
- Data( :,2) : Prix le plus haut de la journée
- Data( :,3) : Prix le plus faible de la journée
- Data( :,4) : Prix de fermeture
- Data( :,5) : Prix de fermeture ajustée
Définition de la fonction getData()
[pastacode lang=”c” manual=”function%20Data%20%3D%20getData(Titre%2CStart%2CStop)%0A%0A%0A%25%20Date%20%20%20%20%20%20%3D%20dataArray%7B%3A%2C%201%7D%3B%0A%25%20DateTime%20%20%3D%20datetime(Date%2C%20’InputFormat’%2C%20’yyyy-MM-dd’)%3B%0A%25%20Open%20%20%20%20%20%20%3D%20dataArray%7B%3A%2C%202%7D%3B%0A%25%20High%20%20%20%20%20%20%3D%20dataArray%7B%3A%2C%203%7D%3B%0A%25%20Low%20%20%20%20%20%20%20%3D%20dataArray%7B%3A%2C%204%7D%3B%0A%25%20Close%20%20%20%20%20%3D%20dataArray%7B%3A%2C%205%7D%3B%0A%25%20AdjClose%20%20%3D%20dataArray%7B%3A%2C%206%7D%3B%0A%0AyahooLink%3D’https%3A%2F%2Fquery1.finance.yahoo.com%2Fv7%2Ffinance%2Fdownload%2F’%3B%0A%0A%25%20Veuillez%20sp%C3%A9cifier%20le%20lien%20de%20t%C3%A9l%C3%A9chargement!%0AfileFolder%3D%20’C%3A%5CUsers%5Ca-replacer%5CDownloads’%3B%0Afilename%20%3D%20%5BfileFolder%2C’%5C’%2CTitre%2C’.csv’%5D%3B%0A%0Awhile%201%0A%20%20%20%20if%20~(exist(filename%2C%20’file’)%20%3D%3D%202)%0A%20%20%20%20%20%20%20%20getYahoo(yahooLink%2C%20Start%2C%20%20Stop%2C%20Titre)%3B%0A%20%20%20%20%20%20%20%20pause(10)%3B%20%25%20Attendre%20le%20t%C3%A9l%C3%A9chargement%20du%20fichier%20(Quelques%20secondes)%0A%20%20%20%20end%0A%20%20%20%20if%20~(exist(filename%2C%20’file’)%20%3D%3D%202)%0A%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20else%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20end%0Aend%3B%0AData%20%3D%20getDataYahoo(filename)%3B%0AData%3DData(%3A%2C2%3A6)%3B%0A%0A%0Aend%0A%0A” message=”” highlight=”” provider=”manual”/]
La fonction getYahoo()
La fonction getYahoo() est appelé par la fonction getData(). Elle permet de lancer un lien et récupérer un fichier CSV de la BD Yahoo. La fonction nécessite le Navigator Microsoft Egde pour fonctionner correctement. Ci-dessous la définition de la fonction.
[pastacode lang=”c” manual=”function%20getYahoo(%20yahooLink%2C%20Start%2C%20%20Stop%2C%20Titre)%0A%0A%0A%25%20Start%3D’Jan-01-2012’%3B%0A%25%20Stop%3D’Jun-01-2021’%3B%0A%25%20Titre%3D’KO’%3B%0A%0A%0Astart_datenum%20%3D%20(datenum(Start)%20-%20datenum(‘Jan-01-1970’))%20*%2086400%3B%0AstartDateStr%20%3D%20num2str(start_datenum)%3B%0A%0Aend_datenum%20%3D%20(datenum(Stop)%20-%20datenum(‘Jan-01-1970′))%20*%2086400%3B%20%25%2086400%3D60*60*24%20(1%20journ%C3%A9e)%0AendDateStr%20%3D%20num2str%20(end_datenum)%3B%0A%0A%0Alink%3D%5ByahooLink%2CTitre…%0A%20%20%20%20%2C’%3Fperiod1%3D’%2CstartDateStr%2C’%26period2%3D’%2CendDateStr%2C’%26interval%3D1d%26events%3Dhistory%26includeAdjustedClose%3Dtrue’%5D%3B%0Aweb(link%2C’-browser’)%3B%0A%0A%0Aend%0A%0A” message=”” highlight=”” provider=”manual”/]
La fonction getDataYahoo()
Son rôle de la fonction est limitée à la lecture d’un fichier CSV est l’extraction des données. La fonction prend en entrée le nom du fichier, puis elle retourne 5 tableaux au format double de taille Nx5. La fonction est compatible uniquement avec les données Yahoo. La fonction est appelé par getYahoo().
[pastacode lang=”c” manual=”function%20Data%20%3D%20getDataYahoo(%20filename%20)%0A%0A%25%25%20Initialize%20variables.%0Adelimiter%20%3D%20’%2C’%3B%0AstartRow%20%3D%202%3B%0A%0A%25%25%20Read%20columns%20of%20data%20as%20strings%3A%0A%25%20For%20more%20information%2C%20see%20the%20TEXTSCAN%20documentation.%0AformatSpec%20%3D%20’%25s%25s%25s%25s%25s%25s%25s%25%5B%5E%5Cn%5Cr%5D’%3B%0A%0A%25%25%20Open%20the%20text%20file.%0AfileID%20%3D%20fopen(filename%2C’r’)%3B%0A%0A%25%25%20Read%20columns%20of%20data%20according%20to%20format%20string.%0A%25%20This%20call%20is%20based%20on%20the%20structure%20of%20the%20file%20used%20to%20generate%20this%0A%25%20code.%20If%20an%20error%20occurs%20for%20a%20different%20file%2C%20try%20regenerating%20the%20code%0A%25%20from%20the%20Import%20Tool.%0AdataArray%20%3D%20textscan(fileID%2C%20formatSpec%2C%20’Delimiter’%2C%20delimiter%2C%20’HeaderLines’%20%2CstartRow-1%2C%20’ReturnOnError’%2C%20false)%3B%0A%0A%25%25%20Close%20the%20text%20file.%0Afclose(fileID)%3B%0A%0A%25%25%20Convert%20the%20contents%20of%20columns%20containing%20numeric%20strings%20to%20numbers.%0A%25%20Replace%20non-numeric%20strings%20with%20NaN.%0Araw%20%3D%20repmat(%7B”%7D%2Clength(dataArray%7B1%7D)%2Clength(dataArray)-1)%3B%0Afor%20col%3D1%3Alength(dataArray)-1%0A%20%20%20%20raw(1%3Alength(dataArray%7Bcol%7D)%2Ccol)%20%3D%20dataArray%7Bcol%7D%3B%0Aend%0AnumericData%20%3D%20NaN(size(dataArray%7B1%7D%2C1)%2Csize(dataArray%2C2))%3B%0A%0Afor%20col%3D%5B1%2C2%2C3%2C4%2C5%2C6%2C7%5D%0A%20%20%20%20%25%20Converts%20strings%20in%20the%20input%20cell%20array%20to%20numbers.%20Replaced%20non-numeric%0A%20%20%20%20%25%20strings%20with%20NaN.%0A%20%20%20%20rawData%20%3D%20dataArray%7Bcol%7D%3B%0A%20%20%20%20for%20row%3D1%3Asize(rawData%2C%201)%3B%0A%20%20%20%20%20%20%20%20%25%20Create%20a%20regular%20expression%20to%20detect%20and%20remove%20non-numeric%20prefixes%20and%0A%20%20%20%20%20%20%20%20%25%20suffixes.%0A%20%20%20%20%20%20%20%20regexstr%20%3D%20′(%3F%3Cprefix%3E.*%3F)(%3F%3Cnumbers%3E(%5B-%5D*(%5Cd%2B%5B%5C%2C%5D*)%2B%5B%5C.%5D%7B0%2C1%7D%5Cd*%5BeEdD%5D%7B0%2C1%7D%5B-%2B%5D*%5Cd*%5Bi%5D%7B0%2C1%7D)%7C(%5B-%5D*(%5Cd%2B%5B%5C%2C%5D*)*%5B%5C.%5D%7B1%2C1%7D%5Cd%2B%5BeEdD%5D%7B0%2C1%7D%5B-%2B%5D*%5Cd*%5Bi%5D%7B0%2C1%7D))(%3F%3Csuffix%3E.*)’%3B%0A%20%20%20%20%20%20%20%20try%0A%20%20%20%20%20%20%20%20%20%20%20%20result%20%3D%20regexp(rawData%7Brow%7D%2C%20regexstr%2C%20’names’)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20numbers%20%3D%20result.numbers%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%25%20Detected%20commas%20in%20non-thousand%20locations.%0A%20%20%20%20%20%20%20%20%20%20%20%20invalidThousandsSeparator%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20any(numbers%3D%3D’%2C’)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20thousandsRegExp%20%3D%20’%5E%5Cd%2B%3F(%5C%2C%5Cd%7B3%7D)*%5C.%7B0%2C1%7D%5Cd*%24’%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20isempty(regexp(thousandsRegExp%2C%20’%2C’%2C%20’once’))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20numbers%20%3D%20NaN%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20invalidThousandsSeparator%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20end%0A%20%20%20%20%20%20%20%20%20%20%20%20end%0A%20%20%20%20%20%20%20%20%20%20%20%20%25%20Convert%20numeric%20strings%20to%20numbers.%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20~invalidThousandsSeparator%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20numbers%20%3D%20textscan(strrep(numbers%2C%20’%2C’%2C%20”)%2C%20’%25f’)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20numericData(row%2C%20col)%20%3D%20numbers%7B1%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20raw%7Brow%2C%20col%7D%20%3D%20numbers%7B1%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20end%0A%20%20%20%20%20%20%20%20catch%20me%0A%20%20%20%20%20%20%20%20end%0A%20%20%20%20end%0Aend%0A%0A%0A%25%25%20Replace%20non-numeric%20cells%20with%20NaN%0AR%20%3D%20cellfun(%40(x)%20~isnumeric(x)%20%26%26%20~islogical(x)%2Craw)%3B%20%25%20Find%20non-numeric%20cells%0Araw(R)%20%3D%20%7BNaN%7D%3B%20%25%20Replace%20non-numeric%20cells%0A%0A%25%25%20Create%20output%20variable%0AKO4%20%3D%20cell2mat(raw)%3B%0AData%3Ddouble(KO4)%3B%0AData%3DData(%3A%2C2%3A6)%3B%0A%0A%25%25%20Clear%20temporary%20variables%0Aclearvars%20filename%20delimiter%20startRow%20formatSpec%20fileID%20dataArray%20ans%20raw%20col%20numericData%20rawData%20row%20regexstr%20result%20numbers%20invalidThousandsSeparator%20thousandsRegExp%20me%20R%3B%0A%0Aend” message=”” highlight=”” provider=”manual”/]
Comment corriger les données corrompues avec Matlab ?
Il se peut au moment de l’importation des données dans la BD Yahoo d’avoir des cases endommagée. Ces dernières génèrent des erreurs au moment du traitement et analyses des données. Une étape de correction est nécessaire avant toute opération. L’idée consiste à dupliquer le contenu de la case précédente corrigée dans la case actuelle corrompue. Ci-dessous un extrait du code de correction.
[pastacode lang=”c” manual=”%5Bm%2Cn%5D%3Dsize(Data)%3B%0Afor%20j%3D1%3An%0A%20%20%20%20if%20isnan(Data(1%2Cj))%0A%20%20%20%20%20%20%20%20Data(1%2Cj)%3D0%3B%0A%20%20%20%20end%3B%0A%20%20%20%20for%20i%3D2%3Am%0A%20%20%20%20%20%20%20%20if%20isnan(Data(i%2Cj))%0A%20%20%20%20%20%20%20%20%20%20%20%20Data(i%2Cj)%3DData(i-1%2Cj)%3B%0A%20%20%20%20%20%20%20%20end%3B%0A%20%20%20%20end%3B%0Aend%3B” message=”” highlight=”” provider=”manual”/]
Exemple d’importation et affichage des données du CAC 40
Assurez-vous bien d’avoir déplacé les fonctions getData.m, getDataYahoo.m et getYahoo.m dans le dossier racine du script de test !
[pastacode lang=”c” manual=”clc%3B%20close%20all%3B%20clear%20all%3B%0A%0A%0A%25%25%20Ing%C3%A9nierie%20%26%20Bourse%0A%25%25%20https%3A%2F%2Fingenierie-bourse.fr%0A%0A%0A%25%25%20Titre%20%C3%A0%20Analyser%0ATitre%3D’%5EFCHI’%3B%20%20%20%20%20%20%20%20%20%20%25%20Symbole%20du%20Titre%20(CAC%2040)%0AStart%3D’Jan-03-2005’%3B%20%20%20%20%25%20Date%20de%20d%C3%A9but%0AStop%3Ddatestr(now%2C1)%3B%20%20%20%20%25%20Date%20de%20fin%20(Actuelle)%20ou%20bien%20%22Mois-Jour-Ann%C3%A9e%22%0A%5Bnn%2C%20mm%5D%20%3D%20month(Stop)%3B%0AStop%3Dstrcat(mm%2C’-‘%2Cnum2str(day(Stop))%2C’-‘%2Cnum2str(year(Stop)))%3B%0A%0A%25%25%20Lecture%20des%20donn%C3%A9es%0AData%20%3D%20getData(Titre%2CStart%2CStop)%3B%0At%3Dlinspace(year(Start)%2Cyear(Stop)%2Clength(Data))%3B%0A%0A%25%25%20Correction%20des%20donn%C3%A9es%0A%5Bm%2Cn%5D%3Dsize(Data)%3B%0Afor%20j%3D1%3An%0A%20%20%20%20if%20isnan(Data(1%2Cj))%0A%20%20%20%20%20%20%20%20Data(1%2Cj)%3D0%3B%0A%20%20%20%20end%3B%0A%20%20%20%20for%20i%3D2%3Am%0A%20%20%20%20%20%20%20%20if%20isnan(Data(i%2Cj))%0A%20%20%20%20%20%20%20%20%20%20%20%20Data(i%2Cj)%3DData(i-1%2Cj)%3B%0A%20%20%20%20%20%20%20%20end%3B%0A%20%20%20%20end%3B%0Aend%3B%0A%0A%25%25%20Affichage%0Afigure(1)%3B%0Aplot(t%2CData%2C%20’linewidth’%2C3)%3Bgrid%20on%3Bxlim(%5Bt(1)%20t(end)%5D)%3B%0Alegend(%7B’Open’%2C’High’%2C’Low’%2C’Close’%2C’AdjClose’%7D%2C’fontsize’%2C13%2C2)%3B%20axis%20off%3B%0Atitle(‘CAC%2040%20entre%20Jan-03-2005%20et%20Sep-5-2021’%2C’fontsize’%2C15)%3B%0A%0A” message=”” highlight=”” provider=”manual”/]
Bourse & Matlab #1: Introduction1 thought on “”