Hi,
Folgendes Problem: Ich versuche hier grad ein (selbst geschriebenes) Python Script zu modifizieren -bin noch Anfänger- , was auf die sog. TA Library von Python zugreift. Das ist eine Library, die es ermöglicht verschiedene Indikatoren im Bereich Börse zu berechnen. Ein Kollege hat das vor langer Zeit mal auf meinem Server installiert. Nun bin ich bereits recht schnell an einen Punkt geraten, wo es nicht mehr weitergeht:
Und zwar geht es los damit, dass in der entspr. Pyhon Berechnungsdatei anscheinend auf Shortcuts zurückgegriffen wird, dessen Definitionen ich leider nirgends im Netz finden kann....
Konkret sieht das in dem lokalen Quelltext z.b so aus:
arg_df['tsi'] = ta.momentum.TSIIndicator(arg_df["price1"], r=parameter_set.tsi_r_,
s=parameter_set.tsi_s_).tsi() als Bsp. für den Indikator "TSI"
Es gibt hier die Parameter "r" und "s", die man auch an einer weiteren Stelle im Quelltext ändern kann. Das Gleiche wurde bisher für ca. 8 weitere Indikatoren eingescriptet. Was mir jetzt jedoch dringend fehlt wäre eine umfassende Übersicht der Parametercodierungen für alle TA-Indikatoren dieser Library (es gibt mehrere hundert). Auf der offiziellen Dokumentationsseite stehen zwar allerlei Informationen jedoch nicht wie die Parameter in das gewünschte Format kommen bzw. wo überhaupt die Werte "r" , "s", "n" und was es da sonst gibt herkommen bzw. welcher Buchstabe für welchen Parameter steht. Genau dies wird jedoch benötigt...
(oder ich bin wirklich zu blöd das zu finden !?)
In der Documentation findet sich z.b für den "TSI" Folgendes:
close (pandas.Series) – dataset ‘Close’ column.
window_slow (int) – high period.
window_fast (int) – low period.
fillna (bool) – if True, fill nan values.
Im lokalen Script ist leider absolut nichts dergleichen definiert, deshalb vermute ich, dass man die erforderlichen Buchstabenkürzel irgendwo in der Library selbst finden muss bzw. irgendwo aus dieser importiert werden...?
Wer kennt sich mit der Thematik aus? (oder gibt es evtl. mehrere verschiedene gleichlautende Python TA-Libraries, die auch die gleiche Schreibweise arg_df = ... verwenden?)
Wer kennt sich mit der Python TA Library aus?
@Romox,
der Code-Ausschnitt zeigt nicht genug um etwas konkretes zu dem Script zu sagen. "arg_df" sind pandas data-frames.
TA bedient sich der Pandas Library sehr stark. Daher würde ich dir empfehlen dich mal näher damit auseinander zu setzen. Die Dokumentation ist sehr gut:
https://pandas.pydata.org/
Eine Suche nach "python ta" hat einige Ergebnisse gebracht, die du aber vielleicht schon kennst.
TA-Python-Dokumentation
https://technical-analysis-library-in-p ... index.html
TSIIndicator:
https://school.stockcharts.com/doku.php ... ngth_index
Ich habe es mal selbst versucht. Dazu habe ich mir Tesla Daten von Yahoo-Finance geholt und auf die dann einfach den TSIIndicator angewendet.
https://pypi.org/project/yfinance/
Zu den von dir verwendeten Parametern r und s kann ich nichts sagen. Die scheinen aber falsch zu sein.
Die TSIIndicator-Klasse erwartet als erstes eine Spalte einen Pandas-Dataframe, also. Also zum Beispiel den täglichen Eröffnungskurs, dann kommen zwei "Moving-Average"-Parameter, "window_slow" und "window_fast".
Sie sind optional und standardmäßig auf 25 und 13 gesetzt. Ich habe sie einfach mal auf 21 und 7 gesetzt. "fillna" bedeutet, dass fehlende Daten aufgefüllt werde. Kann man True oder False setzen.
https://technical-analysis-library-in-p ... IIndicator
Der Indikator berechnet dann für jede Zeile einen Wert, der zurück in die Tabelle mit den historischen Daten geschrieben werden.
Dann einfach ausgeben. Mit "tabulate" kann man eine schöne Tabelle erstellen.
https://pypi.org/project/tabulate/
der Code-Ausschnitt zeigt nicht genug um etwas konkretes zu dem Script zu sagen. "arg_df" sind pandas data-frames.
TA bedient sich der Pandas Library sehr stark. Daher würde ich dir empfehlen dich mal näher damit auseinander zu setzen. Die Dokumentation ist sehr gut:
https://pandas.pydata.org/
Eine Suche nach "python ta" hat einige Ergebnisse gebracht, die du aber vielleicht schon kennst.
TA-Python-Dokumentation
https://technical-analysis-library-in-p ... index.html
TSIIndicator:
https://school.stockcharts.com/doku.php ... ngth_index
Ich habe es mal selbst versucht. Dazu habe ich mir Tesla Daten von Yahoo-Finance geholt und auf die dann einfach den TSIIndicator angewendet.
https://pypi.org/project/yfinance/
Zu den von dir verwendeten Parametern r und s kann ich nichts sagen. Die scheinen aber falsch zu sein.
Die TSIIndicator-Klasse erwartet als erstes eine Spalte einen Pandas-Dataframe, also. Also zum Beispiel den täglichen Eröffnungskurs, dann kommen zwei "Moving-Average"-Parameter, "window_slow" und "window_fast".
Sie sind optional und standardmäßig auf 25 und 13 gesetzt. Ich habe sie einfach mal auf 21 und 7 gesetzt. "fillna" bedeutet, dass fehlende Daten aufgefüllt werde. Kann man True oder False setzen.
https://technical-analysis-library-in-p ... IIndicator
Der Indikator berechnet dann für jede Zeile einen Wert, der zurück in die Tabelle mit den historischen Daten geschrieben werden.
Dann einfach ausgeben. Mit "tabulate" kann man eine schöne Tabelle erstellen.
https://pypi.org/project/tabulate/
Code: Alles auswählen
from tabulate import tabulate
from ta.momentum import TSIIndicator
import yfinance as yf
# ticker für Tesla anlegen
tesla = yf.Ticker("TSLA")
# historische Daten von Tesla von Yahoo-Finance holen
historic_data = tesla.history(period="max")
# tsi zu den historischen Daten hinzufügen
historic_data["tsi"] = TSIIndicator(historic_data["Close"],window_slow=21, window_fast=7, fillna=True).tsi()
# Ausgabe der letzten 10 Werte mit tabulate
print(tabulate(historic_data[-10:], headers=["Date","Open", "High", "Low", "Close", "Volume", "Dividends", "Stock Splits", "tsi"]))
"""
Ausgabe:
Date Open High Low Close Volume Dividends Stock Splits tsi
------------------- ------- ------- ------- ------- ----------- ----------- -------------- ----------
2021-12-21 00:00:00 916.87 939.5 886.12 938.53 2.38393e+07 0 0 -15.1061
2021-12-22 00:00:00 965.66 1015.66 957.05 1008.87 3.12114e+07 0 0 -12.741
2021-12-23 00:00:00 1006.8 1072.98 997.56 1067 3.09044e+07 0 0 -8.70274
2021-12-27 00:00:00 1073.67 1117 1070.72 1093.94 2.37153e+07 0 0 -4.61958
2021-12-28 00:00:00 1109.49 1119 1078.42 1088.47 2.0108e+07 0 0 -1.60155
2021-12-29 00:00:00 1098.64 1104 1064.14 1086.19 1.8718e+07 0 0 0.734789
2021-12-30 00:00:00 1061.33 1095.55 1053.15 1070.34 1.56803e+07 0 0 2.08103
2021-12-31 00:00:00 1073.44 1082 1054.59 1056.78 1.35287e+07 0 0 2.69726
2022-01-03 00:00:00 1147.75 1201.07 1136.04 1199.78 3.46438e+07 0 0 7.91732
2022-01-04 00:00:00 1189.55 1208 1123.05 1149.59 3.29845e+07 0 0 10.0496
"""
Ok, hier mal ein Codeschnipsel vom besagten Script:
evtl. wird daraus schon mehr klar was ich meine? Die n,r,s Parameter befinden sich hier z.b in Zeile 16-18. Was ich nun nach wie vor nicht verstehe bzw. versuche herauszufinden (und es ist sonst nichts im Script definiert) ist wie diese Applikation zu den Werten n,r,s kommt.....? Diese müssen ja irgendwo mit parameter_set vordefiniert sein...?
Code: Alles auswählen
import ta
import json
import os
import math
from datetime import datetime
from pathlib import Path
import calc_utils
def calc_tsi_dpo_cci_1min(arg_df, parameter_set):
# calculate rsi, tsi, tsi_ma, dpo, dpo_ma, cci
arg_df['rsi'] = ta.momentum.RSIIndicator(arg_df['tick_price'], n=parameter_set.rsi_n_1min).rsi()
arg_df['tsi'] = ta.momentum.TSIIndicator(arg_df["tick_price"], r=parameter_set.tsi_r_1min,
s=parameter_set.tsi_s_1min).tsi()
arg_df['tsi_ma'] = arg_df['tsi'].ewm(span=parameter_set.tsi_ma_ewm_span_1min).mean()
arg_df['dpo'] = arg_df['tick_price'] - arg_df['tick_price'].shift(int(parameter_set.dpo_n_1min / 2 + 1),
fill_value=arg_df['tick_price'].
mean()).rolling(parameter_set.dpo_n_1min,
min_periods=0).mean()
arg_df['dpo_ma'] = arg_df['dpo'].ewm(span=parameter_set.dpo_ma_ewm_span_1min).mean()
arg_df['cci'] = ta.trend.CCIIndicator(arg_df['tick_price'], arg_df['tick_price'], arg_df['tick_price'],
parameter_set.cci_n_1min,
parameter_set.cci_c_1min).cci()
arg_df.fillna(value=0.0, inplace=True)
return arg_df
Welche Version der TA lib verwendest du denn?
Der Parameter n im Konstruktor heißt seit zwei Jahren window (siehe https://github.com/bukosabino/ta/commit ... 3189edcR30) und den Parameter r finde ich gar nicht in auf GitHub. Ich vermute daher das deine Library älter als 4 Jahre ist.
Vielleicht solltest du es mit einer neueren Version der Library versuchen und nicht das tote Pferd weiter reiten, immerhin wird das Projekt scheinbar gepflegt.
Der Parameter n im Konstruktor heißt seit zwei Jahren window (siehe https://github.com/bukosabino/ta/commit ... 3189edcR30) und den Parameter r finde ich gar nicht in auf GitHub. Ich vermute daher das deine Library älter als 4 Jahre ist.
Vielleicht solltest du es mit einer neueren Version der Library versuchen und nicht das tote Pferd weiter reiten, immerhin wird das Projekt scheinbar gepflegt.
Fakt ist, dass die Methode keine Keyword-Argumente wie 'n', 'r' und 's' erwartet. Das geht aus der Dokumentation hervor. (Die ich ja schon geposted hatte)
Es wäre also die Frage was sich der ursprüngliche Autor bei dem Code gedacht hat und ob er überhaupt jemals lauffähig war. Vielleicht basiert das auf einer alten Version...?
Dies sind die Keyword-Argumente laut Dokumentation:
Aber ich hatte dir ja auch ein Beispiel gezeigt wie man 'ta' richtig verwenden kann. Vielleicht wäre es einfacher und vor allem sicherer wenn du dein eigenes Script schreibst. Dann kannst du wenigsten nachvollziehen was es macht und ob die generierten Informationen richtig sind. - besonders wenn finanzielle Entscheidungen davon abhängen.
Es wäre also die Frage was sich der ursprüngliche Autor bei dem Code gedacht hat und ob er überhaupt jemals lauffähig war. Vielleicht basiert das auf einer alten Version...?
Dies sind die Keyword-Argumente laut Dokumentation:
Im besten Fall kann man damit Rückschlüsse aus dem bestehenden Code ziehen und verstehen wofür n, r, und s stehen könnten. Der von dir gezeigte Code gibt das nicht her.high: pandas.core.series.Series,
low: pandas.core.series.Series,
close: pandas.core.series.Series,
window1: int = 7,
window2: int = 14,
window3: int = 28,
weight1: float = 4.0,
weight2: float = 2.0,
weight3: float = 1.0,
fillna: bool = False
Aber ich hatte dir ja auch ein Beispiel gezeigt wie man 'ta' richtig verwenden kann. Vielleicht wäre es einfacher und vor allem sicherer wenn du dein eigenes Script schreibst. Dann kannst du wenigsten nachvollziehen was es macht und ob die generierten Informationen richtig sind. - besonders wenn finanzielle Entscheidungen davon abhängen.
alles klar der Begriff "constructor" hilft evtl. schonmal weiter...
Welche Version hier verwendet wird weiß ich leider nicht aber es ist tatsächlich eine ältere von 2019. Funktionsfähig ist es auf jeden Fall und es werden auch die korrekten Werte berechnet. Der ursprüngliche Autor von dem Ganzen ist leider abgetaucht und hat dummerweise weder stichhaltige Dokumentation, noch den Installationspfad der Libraries hinterlassen (sonst würden sich meine Fragen so wahrscheinlich garnicht stellen)
Einfach auf eine aktuelle Version hochzugraden wäre zwar möglich, würde aber wohl voraussetzen, dass dann auch ein mehr oder weniger großer Teil der Scripte + DB neu geschrieben werden muss, außerdem bräuchte ich auch dafür den Ort? Bislang funktioniert ja alles einwandfrei...
Was ich also wahrscheinlich lediglich wissen muss ist wo ich diesen constructor (mit der alten TA-Version von <2019 finde), Namen irgendeiner Datei hilft evtl. schon weiter um das mögliche Verzeichnis einzugrenzen...
Welche Version hier verwendet wird weiß ich leider nicht aber es ist tatsächlich eine ältere von 2019. Funktionsfähig ist es auf jeden Fall und es werden auch die korrekten Werte berechnet. Der ursprüngliche Autor von dem Ganzen ist leider abgetaucht und hat dummerweise weder stichhaltige Dokumentation, noch den Installationspfad der Libraries hinterlassen (sonst würden sich meine Fragen so wahrscheinlich garnicht stellen)
Einfach auf eine aktuelle Version hochzugraden wäre zwar möglich, würde aber wohl voraussetzen, dass dann auch ein mehr oder weniger großer Teil der Scripte + DB neu geschrieben werden muss, außerdem bräuchte ich auch dafür den Ort? Bislang funktioniert ja alles einwandfrei...
Was ich also wahrscheinlich lediglich wissen muss ist wo ich diesen constructor (mit der alten TA-Version von <2019 finde), Namen irgendeiner Datei hilft evtl. schon weiter um das mögliche Verzeichnis einzugrenzen...
Genau der Link den imonbln geposted hat, zeigt auf die Stelle wo die Änderung von r, s, n zu den neuen Argumenten gemacht wurde.Romox hat geschrieben: Mittwoch 12. Januar 2022, 21:58 Was ich also wahrscheinlich lediglich wissen muss ist wo ich diesen constructor (mit der alten TA-Version von <2019 finde), Namen irgendeiner Datei hilft evtl. schon weiter um das mögliche Verzeichnis einzugrenzen...
Da kann man auch gut sehen, dass beim TSI "r" in "window_slow" und "s" in "window_fast" geändert wurde.
Beim RSi wurde "n" in "window" geändert.
Es wäre einen Versuch wert einfach die Namen entsprechend zu ersetzen.
Falls du dennoch unbedingt mit der alten Version arbeiten möchtest, kannst du mal versuchen die alte Version zu installieren.
Code: Alles auswählen
pip install ta==0.5.8
https://pypi.org/project/ta/#history