Tuesday 15 August 2017

Python Download Optioner


När du ska arbeta med sådana tidsserier i Python är pandor oumbärlig. Och här är de goda nyheterna: det kommer med en historisk data nedladdare för Yahoo: pandas. io. data. DataReader. Uppdatering för pandor 0.19: Pandas. io. data-modulen har tagits bort från pandasgt0.19 och framåt. Istället bör du använda paketet separat pandas-datareader. Installera med: Och då kan du göra det här i Python: svarat 20 sep 12 kl 10:05 När jag försöker det fungerar importen bra men när jag ringer 39goog39-linjen får jag ett fel: quotIOError: efter 3 försök gjorde Yahoo inte Returnera en 200 för url 39ichart. finance. yahoohellip Hur kunde det här lösas ndash Cleb Aug 25 15 kl 15:01 Samma som Cleb. Returnerade inte 200 status kod ndash bluerubez 28 okt 15 kl 1:55 Cleb Verkar vara för att GOOG inte accepteras av API (förstår inte varför, efter övergång till Alphabet GOOG ticker hölls). Fungerar bra för GOOGL och olika andra symboler. Exempel justerat just i fallet. ndash DefOs 28 okt 15 kl 2:10 Utöka DefOss svar med en verklig demo. Som DefOs redan har sagt - genom att använda Pandas Datareader gör den här uppgiften en riktig kul att dra all tillgänglig historisk data för AAPL från och med 1980-01-01 spara alla data som CSV-fil d: tempaapldata. csv - 5 första rader Jag är intresserad av ekonometrisk analys på finansiella derivat. Den viktigaste uppläggningen jag har mött är att det inte finns några bra fria resurser (åtminstone det jag vet om) för historiska alternativdata. Därför vill jag skapa en egen personlig databas med historiska alternativpriser. Jag har brutit det här projektet i tre huvudhinder: Ta reda på hur man får alternativdata från python Välj ett datalagringsformat Automatisera samlingen av dagliga data Få alternativdata i python Under sommaren hade jag lite ledig tid och gick ihop med mina pappa för att skapa en investeringsmodell. Medan det är en mycket enkel modell, handlar det här om att bygga en databas, så jag går inte in i detaljer här. Det räcker att säga att jag behövde hitta ett sätt att få alternativdata från Yahoo Finance. Detta var en unik utmaning för att till skillnad från egenkapitaldata eller data från andra källor som FRED, har alternativdata inte en bekväm nedladdning till csv-knappen någonstans på webbplatsen. Vid den tiden läste jag den utmärkta boken Python for Data Analysis av Wes McKinney och fick en uppfattning om hur man implementerar en grundläggande webbrobot för att analysera html på yahoo och returnera data i ett pythonvänligt format. Lång historia kort, jag skrev en del kod för att göra just det och det gjorde sin väg till version 0.9 av pandas biblioteket (om du inte känner till pandor och du arbetar med data i python bör du definitivt kolla in det). Nu behövs bara dessa få kommandon för att få alternativdata från yahoo. Finans: Samtalen och sätter objekt är pandas DataFrames som innehåller samma information som du hittar på yahoo Finance-sidan för Apple Inc.-alternativen. Plockning av filformat Vid val av filformat hade jag två huvudhänsyn: filens storlek och hastighet vid vilken den kan läsas. För att testa detta ut skrev jag ett enkelt skript som genererade en slumpmässig 4000 vid 4000 numpy array och definierade funktioner för att skriva och läsa den data i olika filformat. De format som jag valde att arbeta med var csv, hdf5 (.h5) och MatLab (.mat). Nedan är manuset som jag brukade köra testet: Efter att jag hade den här koden, slog jag helt enkelt iPython och sprang filen (filetest. py) och använde Timeit Magic för att se hur länge det tog var och en av de tre metoderna att läsa och skriva uppgifterna. Tidsresultatet tillsammans med de slutliga filstorlekarna sammanfattas i tabellen nedan: Det är lätt att se att hdf5-filtypen är den bästa att välja för mina ändamål. Jag skulle vilja notera här att anledningen till att hdf5-filformatet är 12 storleken på. mat-filen, beror på att dtypen i. h5-filen är en 32-bitars float medan. mat dtype är en 64-bitars float. För aktieoptioner har vi dock bara allmänt vård om data ut två decimaler, så 32 bitars precision är gott. Automatisera datainsamling Det sista steget i att starta den här databasen var att automatisera datahämtningsprocessen. För att göra detta använde jag det populära UNIX schemaläggningsverktyget cron. Jag kör OSX 10.8 Mountain Lion, och som standard i 10.8 är cronverktyget inaktiverat. För att åtgärda detta körde jag helt enkelt följande kommando i terminalen: Det här kommandot skapar etccrontab-filen (om den inte redan existerar) och gör den klar för användning av cron. Jag kommer inte att ge en detaljerad förklaring till hur man använder cron här (eftersom jag fortfarande är ganska ny på det själv), men googling för det kommer att ge dig massor av exempel och tutorials. Jag kommer dock att ge raden i min crontab-fil som kör scriptet: Nästa steg var att skriva manuset som jag skulle ha cron call. Detta visas nedan. Jag har cron köra det här skriptet vid en viss tid varje veckodag och fyll i hdf5-filen. Den resulterande filen kommer att ha en kapslad struktur så här: Notationen CTICKmm-yy står för ett samtal (C), en given ticker (TICK) och utloppet av alternativet (mm-yy). Inom varje dataset finns tre kolumner: aktiekurs, sista pris på optionsavtal och volym under senaste handelsdag. Efter att ha kört det här skriptet för en natt var den resulterande hdf5-datafilen 7,648648 MB. Om jag skulle tillåta att den här filen körs varje arbetsdag i ett år, skulle den slutliga filstorleken vara under 2 GB. Inte dåligt Om du vill ha mer information om hur jag samlar in tickernamn eller vilka alternativfunktioner som finns i pandor 0.10 eller tidigare lämna en kommentar och jag gör mitt bästa för att svara. Awesome Jag har varit ute efter att göra något så här, eftersom jag också vill backtest några av mina strategier. Du bör förmodligen ändra 39 från alternativen Alternativ39 till 39 från pandas. io. data-importalternativ39, men annat än att ditt skript fungerar bra. Vill du vara villig att dela med dig av alternativdata du hittills har samlat in, kunde jag återställa favoriten genom att fungera som säkerhetskopia för att köra manuset om du någonsin förlorar anslutning i några dagar. Jag övervägde grovt testning med hjälp av priser som genererades med Black8211Scholes, men verkliga data är uppenbarligen bättre. Glad att du gillar manuset. Jag har faktiskt slutat köra filen varje natt så jag har inte för mycket data. Annars skulle jag gärna dela den med dig. Med avseende på importdeklarationerna. Jag är författare till Options-klassen i pandor. Vid skrivandet av denna blogg postade några av funktionaliteten som jag använde i manuset inte blivit sammanfogad i en släppt version av pandor, så jag ringde min lokala version (i en fil som heter alternativ) där jag baserade pandasversionen FYI: There Det är faktiskt några API-ändringar som händer med Options-klassen inom pandor just nu. Om förändringarna inträffar som en av de andra bidragsgivarna har föreslagit kan mycket av koden i det här skriptet vara föråldrat. Åtminstone borde det fortfarande bli att folk började jag håller på att inrätta en stor derivatdatabas. Parsningen från webblänkar är redo. När jag är lite vilse är hur man skapar databasen över alla individuella alternativ på ett sådant sätt som möjliggör beräkningar som SKEW etc. utan att manuellt välja de individuella alternativen varje gång för att göra beräkningen. Hur man gör sådana generiska referenser. Jag är lite borttappad här och vill sortera ut det först innan jag går vidare med datainställningen. Jag tror att den korrekta ordningen i returkupongen sätts, kallar aapl. getoptionsdata (). Hej Martin, du har rätt. När jag till en början lade till alternativen samla kod till pandas, hade jag getoptionsdata återkalla samtal först. Inte säker på varför någon ändrade den. Jag uppdaterade koden i posten för att använda rätt satser, samtal som beställer nu. Jag men det skulle vara ganska användbart att kunna ladda ner alternativpriser. Till att börja med använde jag det manus som du angav ovan (ganska mycket). Jag har pandor 0.13.1, men det verkar helt trasigt. Fel uppstår med följande rad: rawcalls option. getforwarddata (months100, callTrue, putFalse, nearFalse, abovebelow6). Eftersom jag vill få alla alternativdata tror jag att jag måste använda getforwarddata-metoden. De andra metoderna verkar bara stödja att få en viss månad. Felet är ganska länge men de sista parraderna är: File quotusrlocallibpython2.7dist-packagespandasioparsers. pyquot, rad 1653, i nästa steg höja StopIteration StopIteration Vet någon hur man fixar det här Jag kör även Ubuntu Linux. Jag tror att version 0.11 av Pandas fungerade något, men det skulle inte få alla alternativpriser. Jag är inte säker på hur man använder pip för att nedgradera vid den här tiden heller så jag är nog fast att försöka få version 0.13.1 att fungera. Hej Anonym (Tyvärr vet du inte ditt namn, eller om det är Anonymt - det är jättebra) Beklagar att dessa funktioner inte fungerar bra. Jag skrev den här koden för ungefär ett år sedan och då fungerade det utan problem. Pandas är under kraftig utveckling och det verkar som om den gången jag skrev den här koden, har api gått igenom några brottförändringar. Tyvärr har jag inte tid just nu för att gå igenom och ändra koden från det här inlägget så att det fungerar med 0,13. Jag kan säga att all funktionalitet som beskrivs i detta inlägg fortfarande existerar med v0.13, men några av metodens signaturer kan ha ändrats. Jag tror att docstringarna för varje metod i alternativklassen ska vara tillräckligt detaljerade för att ge dig en ganska bra idé om vad som behöver ändras. Du kan hitta dem här: githubpydatapandasblobmasterpandasiodata. pyL545-L905 Om du känner dig för det och slutar göra de nödvändiga ändringarna, var snäll och låt mig veta och jag uppdaterar koden här för att spegla dem. P. S. Om du ger det ett försök och har det svårt, skicka här igen och jag försöker ge några råd. Jag har varit upptagen med ett annat projekt, men i princip gjorde jag bara några ändringar för att få saker att köra. För enkelhet har jag bara gjort ändringarna till data. py. Jag tror att inmonth och inyear indexer beräknades felaktigt. Också, i vissa fall återgår ramar Inga. Ram återvändande Ingen orsakade kraschen. Om någon har tiden koden ska uppdateras för att bara fråga efter alternativdata som faktiskt existerar i tidsintervallet som passerat. Jag är inte säker på hur man analyserar den här informationen från HTML. Just nu kommer det att fråga Yahoo för varje månads data även om det inte finns några alternativ för den månadsåldern för getforwarddata-metoden. Här är linux diff-utgången för de ändringar som jag gjorde: diff pandasiodata. py pandas.01iodata. py 25d24 lt DEBUG True 538.541d536 Det är (len (data) 0): Det återkommer ingen lt 590,595c585 Det försöker: Det själv. Symbol symbol. upper () lt utom: lt msg kvotymbol måste vara en giltig strängkvot lt höja ValueError (msg) lt --- gt self. symbol symbol. upper () 860,866c850,861 Det är i år, jag mumerera (månad): Det år (m-1) 12 Mån mår år 12 Månader. append (årCURYEAR) Det är i månaden --- gt inyears CURYEAR (månader 1) gt gt Ta reda på hur många saker i inmonths går förbi 12 gt att byta 0 gt för i i intervallet (månader): gt om inmonthsi gt 12: gt inmonthsi - 12 gt att byta 1 gt gt Ändra motsvarande objekt i listan i år. gt i i intervallet (1, byte 1): gt inyears-i 1 875,878c870,873 lt för I inom intervallet (månader): lt m2 inmonthsi lt y2 inyearsi lt om DEBUG: print quotGetting s: ssquot (self. symbol, M2, y2) --- gt för mon i intervallet (månader): gt m2 inmonthsmon gt y2 inyearsmon gt 892,895d886 lt om bildrutan är None: lt om DEBUG: print 39. no data39 lt fortsätt lt Hej Tack för ditt fantastiska arbete . Det verkar som om det är för närvarande brutet - kanske en layoutschema förändras på yahoo (det är den tableloc 13 i samtalet att getoptiondata ()) I39ll debugger det när jag har tid, här är detaljerna hittills: Ansluten till pydev debugger (build 135.1057) Traceback (Senaste samtalet senast): File quotusrsharepycharmhelperspydevpydevd. pyquot, linje 1733, i debugger. run (setup39file39, None, None) Fil quotusrsharepycharmhelperspydevpydevd. pyquot, rad 1226, i kör pydevimports. execfile (fil, globals, lokalbefolkningen) quothomechrisdevelopsrctradingoptions. pyquot, rad 5, i sätter, anropa. getoptionsdata (expirydate (2015, 1, 16)) File quotusrlibpython2.7dist-packagespandasiodata. pyquot, rad 630, i getoptionsdata self. getcalldata) File quotusrlibpython2.7dist-packagespandasiodata. pyquot , Linje 748, i getputdata returnera self. getoptiondata (månad, år, utgå, 13, 39puts39) Fil quotusrlibpython2.7dist-packagespandasiodata. pyquot, rad 673, i getoptiondata quot foundquot. format (tableloc, nt Ables)) IndexError: Tabellplats 13 ogiltig, 3 tabeller hittades från pandas. io. data import Alternativ från datetime importdatum aapl Alternativ (39AAPL39, quotyahooquot) sätter, anropar aapl. getoptionsdata (expirydate (2015, 1, 16)) In3: Importera pandor In4: pandas. version Out4: 390.13.139 Hej, tack för kommentaren. Koden är nu bruten på grund av ändringar i Yahoo Finance API. Jag tror att pandas utvecklare har den ursprungliga koden jag gav dem. Se den relevanta diskussionen här: githubpydatapandaspull8631 Hej Spencer ber om ursäkt för den anonyma frågan men när du körde det här programmet för varje ticker i din lista med NASDAQ och NYSE-symboler, hur länge var körtiden för en hel iteration Anonym - inget problem. Denna rutin tar ganska lång tid att springa. Förmodligen i storleksordningen 6-8 timmar. Det kan höjas en hel del genom att göra flera förfrågningar i taget genom att använda tråder och kömoduler i standardbiblioteket. Jag har ett exempel på att göra detta med regelbundna equity data här: gist. githubspencerlyon28a90d9fdffd15e3ecddb Spencer - Jag är väldigt ny för python och programmering i allmänhet men tycker det är kraftfullt och fascinerande med det lilla forskningsarbetet jag har gjort. Hittills lägger jag samman ett mycket enkelt program för att göra något liknande. Detta är vad jag har hittills: importera datetime som dt import pandas som pd import numpy som np från pandas. io. data import Alternativ från pandor importera DataFrame import h5py som h5 num 0 newdatapd. DataFrame () medan num lt tickers. size: Försök: itickers39Symbol39num alternativa alternativ (jag, quotyahooquot) data options. getoptionsdata () newdatanewdata. append (data) förutom: passera utskrift num numnum1 I min tickerlista har jag 6280 symboler eller så och jag fann att getoptionsdata fungerar mycket snabbare än Getalldata metod. Just nu kör det på ca 3 timmar. Mitt mål är att skära det vid 16: e. Det är fortfarande i de allra grundläggande stegen men det fungerar och samlar data för tickers som innehåller den. Om du har några tips eller förslag för att förbättra prestanda I39m alla öron. Jag vet att en looping struktur kanske inte är den mest effektiva men allt för mig är rättegång och fel. Om det här är trivialt eller en dum fråga, ber jag om ursäkt, igen, att jag är ny och lärande. Jag kan föreställa mig att flaskhalsen (långsammaste delen) av det här programmet hämtar data från webben. Att använda Queue och Threading-verktygen i standardbiblioteket som jag gjorde i det exempel jag postade en länk till är förmodligen det bästa sättet att snabba upp den här delen. Ett annat relativt enkelt alternativ att göra parallell datahämtning är att skriva en funktion som hämtar data för en enda lista. Då kan du använda något som IPython parallellt för att kartlägga funktionen över listan över ticker parallellt. Ett exempel på att använda kartan parallellt kan hittas här: ipython. orgipython-doc2parallelparalleldemos. html Förresten är den enda slingan här verkligen inte vad som tar den här koden lång tid att springa - så oroa dig inte om det. Jag är ledsen, men jag har besökt den här koden på över 2 år. Pandas rör sig ganska snabbt, så det är otroligt att koden i det här inlägget inte fungerar. Jag har nu inte tid att felsöka manuset, men jag föreslår att du tittar på pandasdokumentationen för de nuvarande alternativet prissättningsschakt. Du kan hitta den här pandas. pydata. orgpandas-docsstableremotedata. htmlyahoo-finance-options. För ticker listor. Jag fick dem från dessa två webbadresser: Jag vet inte så mycket om programmering men jag har många årliga symbolfiler från intradata. co men jag måste till exempel ha år 2012-2015 i en och samma fil. Eftersom jag vill kartlägga det i min programvara som ett utökat diagram Är det möjligt att göra med det här skriptet Ladda ner den senaste versionen för Mac OS X Hämta den senaste källversionen Ladda ner den senaste versionen för Windows Hämta de senaste versionerna av Python OpenPGP Public Keys Source och binära körbara filer är signerade av release manager med hjälp av sin OpenPGP-nyckel. Utgivningscheferna och binärbyggarna sedan Python 2.3 har varit: Obs! Barrys-nyckel-id A74B06BF används för att signera Python 2.6.8 och 2.6.9-utgåvorna. Hans nyckel-id EA5BBD71 användes för att underteckna alla andra Python 2.6 och 3.0-versioner. Hans nyckel ID ED9D77D5 är en v3-nyckel och användes för att underteckna äldre utgåvor. Du kan importera publiceringsnycklarna för publiceringsnyckeln genom att antingen hämta den offentliga nyckelfilen härifrån och sedan springa eller genom att ta tag i de enskilda nycklarna direkt från keyservernätet genom att köra det här kommandot: På de versionsspecifika nedladdningssidorna borde du se en länk till både den nedladdningsbara filen och en fristående signaturfil. För att verifiera äktheten av hämtningen, ta tag i båda filerna och kör sedan det här kommandot: Observera att du måste använda namnet på signaturfilen och du ska använda den som är lämplig för nedladdningen du kontrollerar. (Dessa anvisningar är inriktade på kommandoraden GnuPG och Unix. Bidrag från instruktioner för andra plattformar och OpenPGP-applikationer är välkomna.) Andra användbara artiklar Letar du efter tredje partens Python-moduler. Paketindex har många av dem. Du kan visa standarddokumentationen online, eller du kan ladda ner den i HTML, PostScript, PDF och andra format. Se den viktigaste dokumentationssidan. Information om verktyg för att paketera arkivfiler som tillhandahålls på python. org är tillgängliga. Tips . Även om du laddar ner ett färdigt binärt program för din plattform, är det meningsfullt att även ladda ner källan. Det här låter dig bläddra i standardbiblioteket (underkatalogen Lib) och standardsamlingar av demo (demo) och verktyg (verktyg) som följer med det. Theres mycket du kan lära av källan Det finns också en samling Emacs-paket som Emacsing Pythoneer kan hitta användbar. Detta inkluderar huvudlägen för redigering av Python, C, C, Java, etc. Python debugger gränssnitt och mer. De flesta paket är kompatibla med Emacs och XEmacs. Vill du bidra? Vill du bidra? Se Python Developers Guide för att lära dig hur Python-utveckling hanteras. Nu när vi har en mycket enkel funktion för att ladda ner historiska lagerdata från Yahoo, let8217s se om vi kan använda samma teknik för att ladda ner data från Google Finansiera. Om vi ​​går över till huvudsidan för Google Finance och tar upp ett offert för AAPL, kommer vi att se en länk för historiska priser i övre vänstra hörnet. Om du klickar på den länken kommer du upp den historiska prissidan. Som standard visar sidan en snygg formaterad prislista med det senaste priset högst upp på sidan. Observera att det finns ett alternativ att välja mellan två datumintervall för priserna, och precis som Yahoo finns en länk för att ladda ner data till ett kalkylblad. Nu väljer vi ett datumintervall (i det här fallet den 1 november 8211 30 november) och klickar på uppdateringsknappen. Då kan vi ladda ner data med länken till höger på sidan. Som standard laddar den ner som 8220data. csv8221. Vi slutar med följande data: Dessa data ser mycket ut som Yahoo-data, men utan justerat stäng. Det verkar som att Google anpassar priserna för oss, så vi behöver inte. Observera också datorna formateras annorlunda. Det ska vara mycket enkelt att konvertera till vårt standardformat som vi definierade i vår Quote-klass i föregående inlägg. Nu måste vi dechifiera länken som används för att få data. Vi kopierar länken genom att högerklicka på den och välja 8220Copy länkadress8221 och slutar med följande: Vi har frågaralternativen: cid, startdate, enddate, num och output. Ta en titt på datumvärdena. What8217s upp med procenttecknen När som helst ser du 82208221 tecken i en url, betyder det att det har skrivits url. Genom att söka på google kan vi enkelt hitta många webbplatser som kodar och avkodar URL-strängar. Genom att avkoda den råa url-strängen slutar vi med: Det ser mycket lättare ut att reda på. Det finns bara ett problem. Vad är cid Troligen någon form av databas ID. Men genom att observera frågesträngen för huvudsidan kan vi se att den använder ett 8220q8221 alternativ som tar utbytet och symbolnamnet. Genom att spela runt med olika kombinationer av dessa parametrar fann jag att vi kan använda q-alternativet utan utbytet, och num-alternativet verkar inte vara nödvändigt. Vi kan förenkla url-strängen till: Det enda som kvarstår är att subklassera vår ursprungliga Quote-klass och anpassa den till att bygga vår url-sträng och konvertera datum till vårt vanliga format. Här är vad jag slutade med: Den här är ännu enklare än Yahoo-versionen. Det är inte nödvändigt att beräkna justerade priser. Huvudskillnaden är det olika urlformatet och tidsformatet. Du kan ladda ner en fil med Quote-klassen och några kommandotesttest här: google. py I ett kommande inlägg konsoliderar vi alla dessa klasser och skapar ett Python-modulkommandon för att hämta historiska data från dessa olika källor, spara dem till disk i ett konsekvent format. Håll dig igång

No comments:

Post a Comment