Python Code,

Seite 1 von 1
neuester Beitrag:  21.07.18 16:08
eröffnet am: 16.03.15 18:36 von: Doc2 Anzahl Beiträge: 22
neuester Beitrag: 21.07.18 16:08 von: dipling Leser gesamt: 14139
davon Heute: 1
bewertet mit 10 Sternen

16.03.15 18:36 #1 Python Code,
um historische Daten aller aktuellen DAX Firmen in einem separaten Ordner abzulegen. Output Format ist csv.

Nötig ist nur ein Python Editor wie Spyder. Code reinkopieren, Zielverzeichnis (für die erstellten csv's ändern (im Code mit zwei Sternen gekennzeichnet). Beachten, dass zwei \\ für die Verzeichnisse nötig sind) und ausführen. Historische Werte werden von  Yahoo Finance entnommen. Handelsplatz ist Xetra. Daten beinhalten Eröffnung, Hoch, Tief, Schluss, Volumen.
Der Zeitraum wird mit DataEnd und DataBegin festgelegt. Bei Fragen oder Problemen einfach unter dem Posting antworten.

------------------------------------------Code ---------------------------------------------

# Author: Doc2
# Code extracts historical Data from the Web. Source is finance @ Yahoo.com

# Python 2 code
import urllib

Siemens = "SIE.DE"
KS = "SDF.DE"
Merck = "MRK.DE"
HeidelCem = "HEI.DE"
Henkel = "HEN3.DE"
Thyssen = "TKA.DE"
Allianz = "ALV.DE"
BMW = "BMW.DE"
Beiersdorf = "BEI.DE"
DtBank = "DBK.DE"
Lanxess = "LXS.DE"
Coba = "CBK.DE"
Conti = "CON.DE"
Basf = "BAS.DE"
Daimler = "DAI.DE"
Fresenius = "FRE.DE"
FreseniusM = "FME.DE"
Linde = "LIN.DE"
DeutBoer = "DB1.DE"
Bayer = "BAYN.DE"
VW = "VOW.DE"
Adidas = "ADS.DE"
DtPost = "DPW.DE"
SAP = "SAP.DE"
Lufth = "LHE.DE"
MRueck = "MUV2.DE"
Infineon = "IFX.DE"
Telekom = "DTE.DE"
RWE = "RWE.DE"
Eon = "EOAN.DE"

DAX = [Siemens, KS, Merck, HeidelCem, Henkel, Thyssen, Allianz, BMW, Beiersdorf,
      DtBank, Lanxess, Coba, Conti, Basf, Daimler, Fresenius, FreseniusM, Linde,
      DeutBoer, Bayer, VW, Adidas, DtPost, SAP, MRueck, Infineon, Telekom, RWE, Eon]

# DataBegin:

DayB = "10"                       # Day from which data should begin
MonthB = "2"                      # Month from which data should begin (0 is january)
YearB = "2000"                    # Year from which data should begin

# DataEnd:

DayE = "16"                         # Day of data end
MonthE = "2"                        # Month of data end (0 is january)
YearE = "2015"                      # Year of data end

for i in DAX:
   url = 'http://real-chart.finance.yahoo.com/table.csv?s='+ i +'&d='+ MonthE + '&e='+ DayE +'&f=' + YearE +'&g=d&a='+ MonthB +'&b='+ DayB +'&c='+ YearB +'&ignore=.csv'
   path = 'C:\\**' + i + '.csv'
   urllib.urlretrieve(url, path)
   
print 'DAX data succesfully retrieved'  
16.03.15 20:03 #2 Bis zu welchem historischen Datum liefert yahoo.
16.03.15 20:06 #3 Januar 2000
 
18.03.15 13:23 #4 @Doc2 Neues Feature
es werden jetzt zusätzlich aktuelle Details in eine Datei mit dem Namen "Details.csv" geladen.

------------------------------------------Code ---------------------------------------------


#!/usr/bin/env python

# Authors: Doc2, brunobanani
# Code extracts historical Price-Data and current details from the Web.
# Source is finance @ Yahoo.com

# Python 2 code
import urllib

OutputDirectory = 'C:\\**'

Siemens = 'SIE.DE'
KS = 'SDF.DE'
Merck = 'MRK.DE'
HeidelCem = 'HEI.DE'
Henkel = 'HEN3.DE'
Thyssen = 'TKA.DE'
Allianz = 'ALV.DE'
BMW = 'BMW.DE'
Beiersdorf = 'BEI.DE'
DtBank = 'DBK.DE'
Lanxess = 'LXS.DE'
Coba = 'CBK.DE'
Conti = 'CON.DE'
Basf = 'BAS.DE'
Daimler = 'DAI.DE'
Fresenius = 'FRE.DE'
FreseniusM = 'FME.DE'
Linde = 'LIN.DE'
DeutBoer = 'DB1.DE'
Bayer = 'BAYN.DE'
VW = 'VOW.DE'
Adidas = 'ADS.DE'
DtPost = 'DPW.DE'
SAP = 'SAP.DE'
Lufth = 'LHE.DE'
MRueck = 'MUV2.DE'
Infineon = 'IFX.DE'
Telekom = 'DTE.DE'
RWE = 'RWE.DE'
Eon = 'EOAN.DE'

DAX = [Siemens, KS, Merck, HeidelCem, Henkel, Thyssen, Allianz, BMW, Beiersdorf,
     DtBank, Lanxess, Coba, Conti, Basf, Daimler, Fresenius, FreseniusM, Linde,
     DeutBoer, Bayer, VW, Adidas, DtPost, SAP, MRueck, Infineon, Telekom, RWE, Eon]

# DataBegin:

DayB = '10'                       # Day from which data should begin
MonthB = '2'                      # Month from which data should begin (0 is january)
YearB = '2000'                    # Year from which data should begin

# DataEnd:

DayE = '16'                         # Day of data end
MonthE = '2'                        # Month of data end (0 is january)
YearE = '2015'                      # Year of data end

# Download Historical Data
for i in DAX:
  url = 'http://real-chart.finance.yahoo.com/table.csv?s='+ i +'&d='+ MonthE + '&e='+ DayE +'&f=' + YearE +'&g=d&a='+ MonthB +'&b='+ DayB +'&c='+ YearB +'&ignore=.csv'
  path = OutputDirectory + i + '.csv'
  urllib.urlretrieve(url, path)

###############
# Details
#
# For Configuration See: http://www.jarloo.com/yahoo_finance/
###############

columns = {
 's': 'Symbol',
 'n': 'Name',
 'a': 'Ask',
 'b': 'Bid',
 'p': 'Previous Close',
 'j2': 'Shares Outstanding',
 'r': ' P/E Ratio',
 'p6': 'Price / Book'
}


url = 'http://finance.yahoo.com/d/quotes.csv?s=' + '+'.join(DAX) + '&f=' + ''.join(columns.keys())
data = ','.join(columns.values()) + '\n' + urllib.urlopen(url).read()
with open(OutputDirectory + 'Details.csv', 'w') as text_file:
   text_file.write(data)
 
print 'DAX data succesfully retrieved'  
18.03.15 13:34 #5 Wie wär's...
...wenn man die Firmen-Kennungen des jeweiligen Index in ein "Include-Files" auslagert, so dass man nach Bedarf ggf. auch Firmen aus Dow/Nasdaq/S&P500 auswerten kann, ohne den halben Code umschreiben zu müssen?  
18.03.15 13:54 #6 liste
Ich kann, wenn Bedarf besteht, noch eine Liste mit internationalen Top-Aktien und deren Kennung hochladen... Dann braucht ihr euch die Kennung nicht selber raussuchen...  
18.03.15 22:03 #9 @doc
Vielen Dank für diesen Thread, es ist ein sehr interessantes Thema.

Dummerweise bin ich seit dieser Woche wieder in einem Projekt beschäftigt, dass mir im Moment wenig Zeit bleibt mich näher mit dem Thema zu beschäftigen. Mit Hilfe der historischen Daten könnte man weitere Daten ausrechnen, wie z.B. Kursänderungen auf täglicher, wöchentlicher oder monatlicher Basis.

Trotz meines momentanen Freizeitengpasses werde ich das Python Skript ausführen und mir die Daten extrahieren. Hiermit lerne ich gleichzeitig den Umgang mit der Sprache Python. Auf jeden Fall freue ich mich auf eine Diskussion, was man mit den historischen Daten alles anfangen kann.  
18.03.15 22:40 #10 Skript unter Linux
Unter Linux muss man noch die Zeile
#!/usr/bin/python
einfügen, damit das Skript läuft. Aber das wissen die Linux Freaks wahrscheinlich alle.


 
18.03.15 22:49 #11 Die Idee
ist mit den Daten dann weiterzuarbeiten. Denke da auf jeden Fall an Korrelationsmatrizen zwischen verschiedenen Größen wie Spread vs. Volumen etc.

Ich will mit rein objektiven Ergebnissen die Zusammenhänge etwas näher herausarbeiten. Wenn dabei rauskommt, dass es keine Zusammenhänge gibt ist das auch gut. Bin nicht voreingenommen :).

Für die die sich mit Matrizen auskennen:

Idee wäre die Tage vor und nach Wendepunkten genauer zu untersuchen. Mit einer Korrelationsmatrix ist das super einfach, da ich mir dazu nur die über bzw. unter der eigentlichen Spur liegenden Diagonale ansehen muss. Wenn die Spur also die Summe dieser Diagonalelemente um Null liegt, haben wir keinerlei Korrelation. Wenn die Summe / # der Elemente bei 1 liegt haben wir perfekte Korrelation oder eben bei - 1 ganz schlechte Korrelation.

Diese Untersuchung ist noch super einfach und sicherlich keine tiefere Sache. Mir schweben aber noch einige andere Dinge vor, die aus der reinen Signaltheorie kommen und mathematisch aufwändig sind. Hier würde ich mich auch über eine weitere Diskussion freuen.  
18.03.15 22:54 #12 6
Die Liste ist so oder so gut, da wir damit auch die von travel vorgeschlagenen include files erzeugen können.

Für weitere statistische Kniffe können wir auch gerne R oder Mathlab bemühen, wobei Python auch super einfach ist um allerlei Dinge mit Matrizen anzustellen.

Der weitere Weg sollte auf jeden Fall (zumindest in meinen Augen) über Matrizen gehen, da man hier Abhängigkeiten (sehr einfach) herausarbeiten kann. Multidimensional, mit allen Infos zu bestimmten Aktien.

Letztendlich braucht man dafür kein erhöhtes Mathematikverständnis. Lediglich die Programmierung erfordert dies, um zu wissen was man nun überhaupt macht. Die Interpretation ist auch ohne größere Kenntnisse möglich. Deshalb sollte es auch für Leute interessant sein, die damit weniger zu tun haben.  
18.03.15 22:57 #13 zu 11
ganz schlechte Korrelation sollte eigentlich heissen gegensätzliche Korrelation. Sprich eine größe fällt, die andere steigt und umgekehrt.

Es wär eine große Sache, wenn eine dieser Größen irgendwas interessantes vor potentiellen Wendepunkten machen. Ich bin da zwar skeptisch aber untersuchen will ich es trotzdem, da es relativ billige Dinge sind, die man mit viel mächtigeren Werkzeugen verlinken kann.  
19.03.15 00:05 #14 Korrelationsmatrizen
Korrelationsmatrizen kenne ich bisher nicht, aber wenn das nicht zu kompliziert ist, könnte ich mich da reinarbeiten.

Was ist eigentlich aus unserem Fundamentaldaten-Projekt geworden?
Da hatten wir doch mal was mit Excel gemacht.  
19.03.15 00:18 #15 Python-Code
Dieser Code erstell eine Liste aller verfügbaren Aktien-Kennungen von Yahoo.

Dafür muss die Länge der Kennungen angegeben werden, die abgefragt werden sollen und der Pfad unter dem die Liste abgespeichert werden soll.

Je länger die Kennungen sein können, desto länger dauert natürlich auch das Abfragen.

------------------------------------------Code ---------------------------------------------

#! /usr/bin/env python
#
# Create a List of all Yahoo-Finance Stock Symbols
#


from __future__ import print_function
import itertools
import urllib

# Maximal length of the Symbols to Download
# E.g. 3 will Download all Symbols from AAA to ZZZ
LENGTH = 2
# Filename and Path
FILENAME = 'symbols.csv'



symbols = []

for l in xrange(LENGTH + 1):
 alphabet = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
 symbols += [''.join(i) for i in itertools.product(alphabet, repeat = l)]


def chunks(l, n):
   """ Yield successive n-sized chunks from l.
   """
   for i in xrange(0, len(l), n):
     yield l[i:i+n]

symbolCounter = 0
with open(FILENAME, 'w') as out:
 for chunk in chunks(symbols, 1024):
   url = 'http://finance.yahoo.com/d/quotes.csv?s=' + '+'.join(chunk) + '&f=sn'
   data = urllib.urlopen(url)
   for line in data:
     if not 'N/A' in line:
       print(line, file=out)
       symbolCounter += 1
       if (symbolCounter % 1000) == 0:
         print(unicode(symbolCounter) + ' Symbols loaded')

print(unicode(symbolCounter) + ' Symbols succesfully retrieved')
 
19.03.15 07:05 #16 @bruno
Vielen Dank. Der Code funktioniert on the fly. Hier kann man durch Analyse dieses kleinen Programms sehr viel über Python lernen, ohne sich erst einmal durch Tutorials oder Bücher zu quälen. Ich hab einmal alle Symbole mit maximal 3 stellen extrahiert. Das Ergebnis ist beeindruckend.

 

Angehängte Grafik:
bildschirmfoto_vom_2015-03-19_06_55_01.png (verkleinert auf 84%) vergrößern
bildschirmfoto_vom_2015-03-19_06_55_01.png
19.03.15 09:52 #17 Bruno
Das Fundamentaldatenprojekt läuft von meiner Seite noch und soll abschließend mit den neuen Ansätzen verbunden werden. Ziel ist es neben der Fundamentaldaten einen geeigneten Einstiegszeitpunkt besser einzugrenzen.

@ fernseher

Ich bin eigentlich in C++ eingearbeitet. Python hab ich mir mal angesehen, da sogar Google damit arbeitet. Es ist super einfach und die Codes sind sehr schnell erstellt. Mit der numpy Bib kann man alle möglichen statistischen bzw. algebraischen Rechnungen in der Matrixschreibweise sehr schnell implementieren. R ist sicher auch interessant aber in meinen Augen etwas mehr auf die statistische Anwendung fokusiert als Python.

@Bruno

Eventuell sagt dir statt Korrelationsmatrix Kovrianzmatrix was :). Beide Begriffe sind in gewisser Weise identisch. Ich verwende nur immer Korrelation, da es griffiger ist. Du kannst dir eine Kovarianzmatrix bei Wikipedia ansehen. Sie ergibt sich aus einem einfachen Spaltenvektor. Uns interessiert aber nicht die Info, die sich aus einem einfachen Spaltenvektor ergibt, da uns z.b. die Korrelation des Volumens vor 100 Tagen nicht mit dem Volumen von heute interessiert.

Hier ist ein Beispiel einer Korrelationsmatrix:

http://www.finanzen.net/indizes/indizes_matrix.asp

Sowas interessiert mich aber z.b. überhaupt nicht, da man daraus nur lernt, wie sich einige Aktien (völlig unterschiedlicher Branchen) zueinander verhalten. So ein Ergebnis halte ich für zufällig bzw. Indexgetrieben.

Aber ein Volumen des Vortags oder der letzten drei Tage mit der Trendumkehr des Folgetags etc. nicht. Und dafür sind solche Matrizen wie geschaffen. Damit können wir  große Datenmengen schnell aufbereiten und vor allem müssen wir damit nicht selbst jede Situation bewerten.  
19.03.15 09:55 #18 Um dann letztendlich
solche Infos nutzen zu können (und auch den Nutzen richtig einzuschätzen), müssen wir erstmal Daten auswerten.

Wenn wir dann zum Ergebnis kommen, dass der Volumenverlauf, in Verbindung mit einem gewissen Bewegungsmuster, zu 60 % auf eine Trendumkehr hindeutet, haben wir schon was gewonnen. Dies, in Verbindung mit Fundamentaldaten und zusätzlichen Ansätzen (wie z.b. mean reversal ...) , kann uns schon ordentlich weiterbringen.  
19.03.15 10:06 #19 Beim mean reversal
gehts im übrigen nicht um gleitende Durchschnitte. Ich stell mir das so vor:

Wir zeichnen zu jedem Titel den dynamischen Abstand der Aktie von den Indizes auf. Natürlich gewichtet mit dem Anteil dieser Aktien im Index.

Es gibt einen Ansatz, der darauf baut, dass sich Aktien mit hohem Indexgewicht mit größerer Wahrscheinlichkeit (kann nicht die Zahl nennen) dem Index wieder nähert. Wann ist nicht auszumachen. Aber es wär sicherlich interessant diesen Pool von Aktien mit Fundamentalansätzen und dann auch mit den obig genannten Instrumenten abzugleichen. Die Programme geben uns dann nur eine Liste an potentiellen Kandidaten. Die Auswahl erfolgt dann individuell.

Nun kann man sagen: Fein das ist auch mit Charttechnik möglich. Ich sage das ist es nicht, da man damit nicht den großen Bereich im Blick hat und immense Zeit dafür aufwendet eine Vorselektion zu machen und letztendlich auf ein paar Unternehmen beschränkt ist. Gleichzeitig kann es aber sein, dass gewisse Daten ein anderes Unternehmen als "sicherer" - hinsichtlich des Einstiegs - ansieht.  
19.03.15 13:06 #20 @Doc

So weit ich es nebenbei aufgeschnappt habe, ist mean reversal Ansatz tatsächlich einer, der auch im insitutionellen bereich (speziell auch von HF) angewandt wird.

"Nun kann man sagen: Fein das ist auch mit Charttechnik möglich. Ich sage das ist es nicht, da man damit nicht den großen Bereich im Blick hat und immense Zeit dafür aufwendet eine Vorselektion zu machen und letztendlich auf ein paar Unternehmen beschränkt ist."

In dem Falle würde man ggf. ein paar ETF's aus verschiedenen Wirtschaftsräumenen nehmen und sich womöglich erst gar nicht mit Einzelaktien abgeben.

"Wenn wir dann zum Ergebnis kommen, dass der Volumenverlauf, in Verbindung mit einem gewissen Bewegungsmuster, zu 60 % auf eine Trendumkehr hindeutet, haben wir schon was gewonnen. Dies, in Verbindung mit Fundamentaldaten und zusätzlichen Ansätzen (wie z.b. mean reversal ...) , kann uns schon ordentlich weiterbringen."

Ich glaube da funktioniert so nicht mit 60 oder wie viel auch immer %. Das wäre zu einfach. Auch wenn man bestimmte (von mir aus auch stark ausgeprägte) Korrelationen in den angedachten Szenarios findet, wird es wohl noch nicht unbedingt einen praktischen Nutzen haben (im Sinne, dass es Geld einbringen könnte). Ich bin mir sogar ziemlich sicher, dass man entsprechende "harte" mathematische Korrelationen in den jeweiligen Trendphasen (Bewegung/Korrektur/Konsolidierung) eines beliebigen Zeitraumes finden wird. Diese Erkenntnisse in ein anwendbares Handlungsansatz zu gießen, welcher dann einen positiven Erwartungswert haben soll, wird wohl die größere Herausforderung sein.

Wenn wir z.B. bei "Korrelationen am Wendepunkt Ansatz" bleiben, so ist es doch so, dass ein jedes Ende einer Bewegung im Abwärtstrend die gleiche Charakteristika und gleiche begleitende Korrelatinen haben wird. Was man halt in dem Moment nie wissen wird, ist halt, ob dieser eine Wendepunkt nicht nur zu einer Korrektur, sondern auch zum Trendbruch führt. Was man wahrscheinlich ins Augenschein nehmen muss, wäre die Entwicklung/Evolution dieser Korrelationen auf der Zeitachse und zwar determiniiert von Bewegung zur Bewegung, von Korrektur zur Korrektur. Diese Evolution müsste dann mit einer Funktion beschrieben werden können, die dann ggf auch ein Signal liefert.

 
21.07.18 15:59 #21 AttributeError: module 'urllib' has no attribute '
der "coole Code" funktioniert nicht (mehr) mit

zumindest nicht mit Python 3.6.5 unter Win10  
21.07.18 16:08 #22 so jetzt die vollst. Meldung
AttributeError: module 'urllib' has no attribute 'urlretrieve'

was funktioniert mit Python 3.6.5/Win10:

CODE =========================================
#Quelle: https://pydigger.com/pypi/fix-yahoo-finance

from pandas_datareader import data as pdr

import fix_yahoo_finance as yf
yf.pdr_override() # <== that's all it takes :-)

# download dataframe
data = pdr.get_data_yahoo("SPY", start="2017-01-01", end="2017-04-30")

# download Panel
data = pdr.get_data_yahoo(["SPY", "^GDAXI", "IWM"], start="2017-01-01", end="2017-04-30")

print (data)
CODE =========================================  
Antwort einfügen - nach oben
Lesezeichen mit Kommentar auf diesen Thread setzen: