Jump to content


Photo
* * * * * 1 votes

Maschinelles Lernen mit Python - Part 1

python machine based lerning

Wichtiger Hinweis für Besucher der Community!

Das Erstellungsdatum des von Dir aufgerufenen Themas liegt bereits einige Zeit zurück. Wir möchten darauf hinweisen, den Inhalt der Diskussion auf seine Aktualität hin zu prüfen. Weitere Informationen findest Du auf dieser Seite.

  • Please log in to reply
5 replies to this topic

#1 cxalgo

cxalgo

    Floor Broker

  • Developer
  • 557 posts
  • 4695 thanks

Posted 17 January 2017 - 09:46 AM

Hallo Zusammen, 

 

nach 2 Monaten habe ich frustriert aufgegeben, mit MQL5 und Ctrader eine saubere Lösung zu programmieren, weil einfach die Anbindung für GPU-Power, genügend freie AI, etc. Bibliotheken fehlen.

 

Fazit: nach einiger Recherche lerne ich eine neue Programmiersprache und baue hier auf die freien Bibliotheken auf. Da ich wirklich von 0 anfange, muss ich natürlich erstmal Finanzdaten visualisieren. Ich habe mich entschlossen, erstmal mit Aktien EOD (Yahoo Finance Histories) anzufangen und will den Fortschritt hier mit euch teilen, soweit Interesse besteht. 

 

Ziel ist es, Lifedaten von MT4 & 5, cTrader und L&P Daten live in eine Mongo-DB zu laden, die Daten automatisch aufzubereiten, zu slicen und anschließend zu plotten (Charts).

Danach werden die Bibliotheken von R, Python, Anaconda und Mathlab angezapft und via Matrix-KPI-Metering und anderen mathematischen & statistischen Verfahren gewertet und der Computer soll mit GPU-Power möglichst präzise Vorhersagen (Predictions) errechnen können.

 

Hier die ersten Codesnippets zum visualisieren von EOD-CSV-Daten.

 

# -*- coding: utf-8 -*-"""Created on Tue Jan 17 09:30:18 2017@author: MarcusLencyzk""""""Slice and plot"""import osimport pandas as pdimport matplotlib.pyplot as pltdef plot_selected(df, columns, start_index, end_index):    """Plot the desired columns over index values in the given range."""    plot_data(df.ix[start_index:end_index, columns], title="Selected Data")def symbol_to_path(symbol, base_dir="data"):    """Return CSV file path given ticker symbol."""    return os.path.join(base_dir, "{}.csv".format(str(symbol)))def get_data(symbols, dates):    """Read stock data (adjusted close) for given symbols from CSV files."""    df = pd.DataFrame(index=dates)    if 'SPY' not in symbols:  # add SPY for reference, if absent        symbols.insert(0, 'SPY')    for symbol in symbols:        df_temp = pd.read_csv(symbol_to_path(symbol), index_col='Date',                parse_dates=True, usecols=['Date', 'Adj Close'], na_values=['nan'])        df_temp = df_temp.rename(columns={'Adj Close': symbol})        df = df.join(df_temp)        if symbol == 'SPY':  # drop dates SPY did not trade            df = df.dropna(subset=["SPY"])    return df    def normalize_data(df):    """Nomalize stock prices using the first row of the dataframe."""    return df/ df.ix[0,:]def plot_data(df, title="Stock prices"):    """Plot stock prices with a custom title and meaningful axis labels."""    ax = df.plot(title=title, fontsize=12)    ax.set_xlabel("Date")    ax.set_ylabel("Price")    plt.show()def test_run():    # Define a date range    dates = pd.date_range('2012-01-01', '2016-12-31')    # Choose stock symbols to read    symbols = ['MSFT', 'IBM', 'TXN']  # SPY will be added in get_data()        # Get stock data    df = get_data(symbols, dates)    # Slice and plot    plot_selected(df, ['SPY', 'IBM', 'MSFT', 'TN'], '2012-03-01', '2016-04-01')if __name__ == "__main__":    test_run()

 

Sieht noch sehr "simple" aus, funktioniert aber schon mal, siehe hier das Ergebnis:

 

Attached Files


  • 7
regards
Marcus

Habe einen Plan oder arbeite den Rest deines Lebens!
(unbekannter Autor)

Thanked by 9 Members:
duncan , whipsaw , Forex1+ , Kleinerbroker , chimbonda , ajkonly , oldschuren , siscop , Vola

#2 Vola

Vola

    Nur noch Pivot Cluster Traderin

  • *_skilled
  • 6,211 posts
  • 36664 thanks
  • Wohnsitz:aktuell in CH

Posted 17 January 2017 - 10:44 AM

Cooles Projekt 10points.gif


  • 0

Gruß Vola
Ich zähle lieber bis 4
Alle von mir gemachten Aussagen und Antworten auf Fragen entsprechen lediglich meiner persönlichen Meinung und stellen keinerlei Rechts- und Anlageberatung oder ähnliches dar


Thanked by 6 Members:
Forex1+ , Kleinerbroker , chimbonda , ajkonly , oldschuren , cxalgo

#3 cxalgo

cxalgo

    Floor Broker

  • Developer
  • 557 posts
  • 4695 thanks

Posted 17 January 2017 - 11:20 AM

heute noch etwas Zeit gehabt um das Beispiel mal mit den Bollinger Band(20) zu coden und gleichzeitig zu zeigen, wie genial einfach es mit der Python Bibliothek pandas und matplotlib zu programmieren ist.

 

# -*- coding: utf-8 -*-"""Created on Tue Jan 17 11:11:22 2017@author: MarcusLencyzk""""""Bollinger Bands."""import osimport pandas as pdimport matplotlib.pyplot as pltdef symbol_to_path(symbol, base_dir="data"):    """Return CSV file path given ticker symbol."""    return os.path.join(base_dir, "{}.csv".format(str(symbol)))def get_data(symbols, dates):    """Read stock data (adjusted close) for given symbols from CSV files."""    df = pd.DataFrame(index=dates)    if 'SPY' not in symbols:  # add SPY for reference, if absent        symbols.insert(0, 'SPY')    for symbol in symbols:        df_temp = pd.read_csv(symbol_to_path(symbol), index_col='Date',                parse_dates=True, usecols=['Date', 'Adj Close'], na_values=['nan'])        df_temp = df_temp.rename(columns={'Adj Close': symbol})        df = df.join(df_temp)        if symbol == 'SPY':  # drop dates SPY did not trade            df = df.dropna(subset=["SPY"])    return dfdef plot_data(df, title="Stock prices"):    """Plot stock prices with a custom title and meaningful axis labels."""    ax = df.plot(title=title, fontsize=12)    ax.set_xlabel("Date")    ax.set_ylabel("Price")    plt.show()def get_rolling_mean(values, window):    """Return rolling mean of given values, using specified window size."""    return pd.rolling_mean(values, window=window)def get_rolling_std(values, window):    """Return rolling standard deviation of given values, using specified window size."""    return pd.rolling_std(values, window=window)    def get_bollinger_bands(rm, rstd):    """Return upper and lower Bollinger Bands."""    upper_band = rm + rstd *2    lower_band = rm - rstd *2    return upper_band, lower_banddef test_run():    # Read data    dates = pd.date_range('2012-01-01', '2012-12-31')    symbols = ['SPY']    df = get_data(symbols, dates)    # Compute Bollinger Bands    # 1. Compute rolling mean    rm_SPY = get_rolling_mean(df['SPY'], window=20)    # 2. Compute rolling standard deviation    rstd_SPY = get_rolling_std(df['SPY'], window=20)    # 3. Compute upper and lower bands    upper_band, lower_band = get_bollinger_bands(rm_SPY, rstd_SPY)        # Plot raw SPY values, rolling mean and Bollinger Bands    ax = df['SPY'].plot(title="Bollinger Bands", label='SPY')    rm_SPY.plot(label='Rolling mean', ax=ax)    upper_band.plot(label='upper band', ax=ax)    lower_band.plot(label='lower band', ax=ax)    # Add axis labels and legend    ax.set_xlabel("Date")    ax.set_ylabel("Price")    ax.legend(loc='upper left')    plt.show()if __name__ == "__main__":    test_run()

 

hier das visuelle Ergebnis in Steps:

 

 

Attached Files


  • 6
regards
Marcus

Habe einen Plan oder arbeite den Rest deines Lebens!
(unbekannter Autor)

Thanked by 7 Members:
whipsaw , Forex1+ , Kleinerbroker , ajkonly , oldschuren , Vola , siscop

#4 cxalgo

cxalgo

    Floor Broker

  • Developer
  • 557 posts
  • 4695 thanks

Posted 17 January 2017 - 11:34 AM

Hier noch etwas für die Statistiker: Daily Returns in %

 

# -*- coding: utf-8 -*-"""Created on Tue Jan 17 11:25:12 2017@author: MarcusLencyzk""""""Compute daily returns."""import osimport pandas as pdimport matplotlib.pyplot as pltdef symbol_to_path(symbol, base_dir="data"):    """Return CSV file path given ticker symbol."""    return os.path.join(base_dir, "{}.csv".format(str(symbol)))def get_data(symbols, dates):    """Read stock data (adjusted close) for given symbols from CSV files."""    df = pd.DataFrame(index=dates)    if 'SPY' not in symbols:  # add SPY for reference, if absent        symbols.insert(0, 'SPY')    for symbol in symbols:        df_temp = pd.read_csv(symbol_to_path(symbol), index_col='Date',                parse_dates=True, usecols=['Date', 'Adj Close'], na_values=['nan'])        df_temp = df_temp.rename(columns={'Adj Close': symbol})        df = df.join(df_temp)        if symbol == 'SPY':  # drop dates SPY did not trade            df = df.dropna(subset=["SPY"])    return dfdef plot_data(df, title="Stock prices", xlabel="Date", ylabel="Price"):    """Plot stock prices with a custom title and meaningful axis labels."""    ax = df.plot(title=title, fontsize=12)    ax.set_xlabel(xlabel)    ax.set_ylabel(ylabel)    plt.show()def compute_daily_returns(df):    """Compute and return the daily return values."""    daily_returns = df.copy() #copy given DateFrame to match size an dcolumn names    #compute daily return for row 1 onwords    daily_returns[1:] = (df[1:]/df[:-1].values)-1    daily_returns.ix[0,:] = 0 #set daily return for row 0 to 0    return daily_returns            def test_run():    # Read data    dates = pd.date_range('2012-07-01', '2012-07-31')  # one month only    symbols = ['SPY','TXN']    df = get_data(symbols, dates)    plot_data(df)    # Compute daily returns    daily_returns = compute_daily_returns(df)    plot_data(daily_returns, title="Daily returns", ylabel="Daily returns")if __name__ == "__main__":    test_run()

 

Attached Files


  • 4
regards
Marcus

Habe einen Plan oder arbeite den Rest deines Lebens!
(unbekannter Autor)

Thanked by 9 Members:
siscop , whipsaw , Forex1+ , Kleinerbroker , chimbonda , ajkonly , oldschuren , Bull68 , Vola

#5 oldschuren

oldschuren

    Floor Broker

  • *_skilled
  • 1,421 posts
  • 7808 thanks
  • Wohnsitz:Brandenburg

Posted 17 January 2017 - 04:57 PM

Viel Erfolg bei Deinem Projekt. An einem Konverter von Kursdaten aus MT4 (MT5) währe ich auch schwer interessiert. Bin mir aber nicht sicher, ob ich das brauche. Scheint Lösungen für Amibroker zu geben.

 

Aber egal:  Warum nicht ein Script schreiben, dass in regelmässigen Abständen durch die MT4-Kursliste geht, einem Moment wg. Kursdatenaktualisierung wartet und dann diese Daten an einem Speicherort der Wahl abspeichert.

 

Zwei Fragen habe ich noch, warum MongoDB und nicht MySQL oder SqLite? Warum die """ im Quellcode? Wg. einer späteren maschinellen Erstellung der Dokumentation des Programms? Fast ein paar


  • 1
ich raube, also bin ich....

Thanked by 6 Members:
whipsaw , Kleinerbroker , chimbonda , Vola , ajkonly , cxalgo

#6 cxalgo

cxalgo

    Floor Broker

  • Developer
  • 557 posts
  • 4695 thanks

Posted 17 January 2017 - 08:10 PM

Danke sehr. Konverter steht auf alle Fälle auf meiner Liste und gebe hier gerne bescheid.

 

MongoDB wegen NoSql und ArrayDB-Funktionalität bzw. In-Memory. Ich will ja nicht immer die Kursdaten als Primary-Key nehmen, sondern Titel zu bestimmte Szenarien indexieren lassen und passende HS via AI finden, bzw. Ableitungen von HS, so die Idee dahinter. 

 

Die """ stehen für Parser-Entries, damit sich das System selbst dokumentiert und hier neue Ableitungen eintragen kann, quasi als Text-Trigger


  • 4
regards
Marcus

Habe einen Plan oder arbeite den Rest deines Lebens!
(unbekannter Autor)

Thanked by 6 Members:
whipsaw , Kleinerbroker , chimbonda , Vola , ajkonly , oldschuren

Wichtiger Hinweis für Besucher der Community!

Das Erstellungsdatum des von Dir aufgerufenen Themas liegt bereits einige Zeit zurück. Wir möchten darauf hinweisen, den Inhalt der Diskussion auf seine Aktualität hin zu prüfen. Weitere Informationen findest Du auf dieser Seite.


0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users