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: | 26.223 |
Forum: | Talk | Leser heute: | 4 | |
Bewertet mit: | ||||
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'
------------------------------------------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'
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.
#!/usr/bin/python
einfügen, damit das Skript läuft. Aber das wissen die Linux Freaks wahrscheinlich alle.
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.
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.
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.
Was ist eigentlich aus unserem Fundamentaldaten-Projekt geworden?
Da hatten wir doch mal was mit Excel gemacht.
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')
@ 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.
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.
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.
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.
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 =========================================