1
|
Local / Anfänger und Hilfe / Re: [Howto] Adressen-Monitoring
|
on: September 22, 2020, 07:07:45 AM
|
Warnung: Wer Wallet oder Adressen per Electrum überwacht, deanonymisiert sich gegenüber dem Electrum-Server selbst!!!Zum Nachrecherchieren hat mich folgender Beitrag gebracht:
https://bitcointalk.org/index.php?topic=5276680.msg55217179#msg55217179
Und folgende Aussage darin:[...] Dazu sammeln sie z.B. auch Daten von Electrum-Wallet anfragen für die sie selber jede Menge Server betreiben [...] D.h., wer sich mit einem Electrum-Server verbindet und nach einer Balance fragt, ob nun mit oder ohne Privatekeys, muss die entsprechenden Adressen an den Server ausliefern.
https://medium.com/shiftcrypto/use-the-bitbox02-with-electrum-wallet-5088219b8497
Der Server weiss dann, dass sich eine bestimmte IP für bestimmte Adressen interessiert. Die IP selbst ist noch nicht mit einem Namen verknüpft, aber die Gegend, aus welcher die Anfrage kommt kann schon auf der Landkarte eingegrenzt werden. Zusätzlich ändern Standardrouter heutzutage nicht mehr regelmäßig die IP, sodass Angreifer möglicherweise versuchen könnten, diese zu hacken. Oder man kommt anderweitig and die Identität hinter der IP.
Also entweder mit TOR oder VPN oder gar nicht.siehe auch: https://bitcointalk.org/index.php?topic=5202173.0
|
|
|
3
|
Local / Trading und Spekulation / Re: Methoden und Algorithmen zur fortgeschrittenen Kursanalyse
|
on: August 30, 2020, 08:37:33 PM
|
HMM-Update (siehe unten). Änderungen: - Die Höhe des MA50 und MA200 ist jetzt korrekt(er);
- Die x-Achsenbeschriftung ist jetzt konstant(er);
- Die Halvings sind markiert.
Wie führt man den Code aus: - python3 starten;
- Code reinkopieren.
Oder Code in Datei hmm.py abspeichern und dann python3 hmm.py
aufrufen. HMM bis einschliesslich dieser Woche:  Code: import os; import re; import wget; # pip3 install wget import numpy; # pip3 install numpy import pandas; # pip3 install pandas import matplotlib; # pip3 install matplotlib from hmmlearn import hmm; # pip install --upgrade --user hmmlearn
######################################################################
# weighted mean def wm(x): return (x['VOLUME'] * x['PRICE']).sum()/x['VOLUME'].sum();
# weighted mean for rolling window def rolling_wm(ser): return (subdata['VOLUME'].loc[ser.index] * subdata['PRICE'].loc[ser.index]).sum()/subdata['VOLUME'].loc[ser.index].sum();
# removes incomplete weeks def rm(df, column, n): for i in range(n): if df[column].iloc[0] != subdata[column].iloc[i]: return df.iloc[i:df.shape[0]]; return df;
def fill(df, column): x = numpy.zeros([df.shape[0]]); c = 0; x[0] = c; for i in range(df.shape[0]-1): if df[column].iloc[i] != df[column].iloc[i+1]: c += 1; x[i+1] = c; return x.astype(int);
######################################################################
# download and/or load bitstamp data file_name = 'bitstampUSD.csv.gz'; # but make sure, that the file is up to date # if the file already exists locally, the current one # is not downloaded, thus, remove the local version if os.path.exists(file_name) == False: file_name = wget.download('https://api.bitcoincharts.com/v1/csv/bitstampUSD.csv.gz');
data = pandas.read_csv(file_name, compression='gzip', header=None); data.columns = ['EPOCH', 'PRICE', 'VOLUME']; data = data.sort_values(by='EPOCH'); data['DATE'] = pandas.to_datetime(data['EPOCH'],unit='s').dt.tz_localize('utc').dt.tz_convert('Europe/Berlin'); data['DAY'] = [str(x) for x in pandas.Series(data['DATE']).dt.date];
# firstly group by day for faster processing subdata = data.groupby('DAY').first(); subdata['OPEN'] = data.groupby('DAY').first()['PRICE']; subdata['CLOSE'] = data.groupby('DAY').last()['PRICE']; subdata['MAX'] = data.groupby('DAY').max()['PRICE']; subdata['MIN'] = data.groupby('DAY').min()['PRICE']; subdata['VOLUME'] = data.groupby('DAY').sum()['VOLUME']; subdata['PRICE'] = data.groupby(['DAY']).apply(wm);
# weighted moving average, not sure whether this makes a difference rol = subdata['PRICE'].rolling(50); subdata['MA50'] = rol.apply(rolling_wm, raw=False); rol = subdata['PRICE'].rolling(200); subdata['MA200'] = rol.apply(rolling_wm, raw=False); #subdata['MA50'] = subdata["PRICE"].rolling(50).mean(); #subdata['MA200'] = subdata["PRICE"].rolling(200).mean(); subdata['RETURN'] = (subdata['CLOSE'] - subdata['OPEN'])/subdata['OPEN'];
subdata['WEEK'] = [str(pandas.Timestamp(x).week) for x in subdata['DATE']];
###################################################################### # not very elegant way to get unique week annotation
# remove first incomplete WEEK subdata = rm(subdata, 'WEEK', 7);
# remove last incomplete WEEK subdata = subdata.sort_values(by='EPOCH', ascending=False); subdata = rm(subdata, 'WEEK', 7); subdata = subdata.sort_values(by='EPOCH');
subdata['WEEK'] = fill(subdata,'WEEK');
######################################################################
# secondly group by week subsubdata = subdata.groupby('WEEK').first(); subsubdata['DAY'] = [str(x) for x in pandas.Series(subsubdata['DATE']).dt.date]; subsubdata['OPEN'] = subdata.groupby('WEEK').first()['OPEN']; subsubdata['CLOSE'] = subdata.groupby('WEEK').last()['CLOSE']; subsubdata['MAX'] = subdata.groupby('WEEK').max()['MAX']; subsubdata['MIN'] = subdata.groupby('WEEK').min()['MIN']; subsubdata['VOLUME'] = subdata.groupby('WEEK').sum()['VOLUME']; subsubdata['PRICE'] = subdata.groupby(['WEEK']).apply(wm); subsubdata['LOG10_PRICE'] = numpy.log10(subsubdata['PRICE']); max_log10_price = numpy.amax(subsubdata['LOG10_PRICE']); subsubdata['LOG10_PRICE'] = subsubdata['LOG10_PRICE']/max_log10_price; subsubdata['LOG10_MA50'] = numpy.log10(subsubdata['MA50']); subsubdata['LOG10_MA50'] = subsubdata['LOG10_MA50']/max_log10_price; # it's all relative to the price subsubdata['LOG10_MA200'] = numpy.log10(subsubdata['MA200']); subsubdata['LOG10_MA200'] = subsubdata['LOG10_MA200']/max_log10_price; # it's all relative to the price subsubdata['RETURN'] = (subsubdata['CLOSE'] - subsubdata['OPEN'])/subsubdata['OPEN'];
# at least not wrong ... subsubdata = subsubdata.sort_values(by='EPOCH');
# create a model and fit it to data model = hmm.GaussianHMM(4, "diag", n_iter=1000);
X = numpy.asarray(subsubdata['RETURN']).reshape(-1,1); fit = model.fit(X);
hidden_states = model.predict(X); hidden_probs = model.predict_proba(X); df = pandas.DataFrame(hidden_probs); df.columns = ['0', '1', '2', '3'];
# my sentiment definition bubble_state = hidden_states[numpy.where(subsubdata['DATE']=='2011-09-19 15:47:03+0200')[0][0]]; sideways_state = hidden_states[numpy.where(subsubdata['DATE']=='2016-10-03 00:00:18+0200')[0][0]]; bullish_state = hidden_states[numpy.where(subsubdata['DATE']=='2013-02-11 00:57:24+0100')[0][0]]; bearish_state = list(set([0,1,2,3]).difference([bubble_state, sideways_state, bullish_state]))[0];
state_index = {'violet':str(bubble_state), 'green':str(bullish_state), 'black':str(sideways_state), 'red':str(bearish_state)}; state_index_= {str(bubble_state):'violet', str(bullish_state):'green', str(sideways_state):'black', str(bearish_state):'red'};
# plot the result import matplotlib.pyplot as plt;
fig, ax = plt.subplots(figsize=(2.24,2.24)); df[state_index['violet']].plot(ax=ax, color='violet', linewidth=0.6, label='bubble'); df[state_index['green']].plot(ax=ax, color='green', linewidth=0.6, label='bullish'); df[state_index['black']].plot(ax=ax, color='black', linewidth=0.6, label='sideways'); df[state_index['red']].plot(ax=ax, color='red', linewidth=0.6, label='bearish'); subsubdata['LOG10_PRICE'].plot(ax=ax, color='blue', linewidth=0.6, label='log10(price)'); subsubdata['LOG10_MA50'].plot(ax=ax, color='cyan', linewidth=0.6, label='log10(MA50)'); subsubdata['LOG10_MA200'].plot(ax=ax, color='orange', linewidth=0.6, label='log10(MA200)');
for i in range(len(hidden_states)): rect = matplotlib.patches.Rectangle((i-0.5,0),1,-0.1,linewidth=1,edgecolor='none',facecolor=state_index_[str(hidden_states[i])]); ax.add_patch(rect);
blubb = [str(x) for x in subsubdata["DATE"]]; blubb = [re.match('^[0-9]{4}', x).group() for x in blubb]; indices = []; for i in range(len(blubb)-1): if blubb[i] != blubb[i+1]: indices.append(i+1);
quarts = [0, 26]; ticks = []; for index in indices: for quart in quarts: if index + quart > len(blubb): break; ticks.append(index + quart);
ticks = numpy.asarray(ticks); ax.legend(); plt.xticks(ticks=ticks, labels=subsubdata['DAY'].iloc[ticks], rotation='horizontal'); for tick in ax.xaxis.get_major_ticks(): tick.label.set_fontsize(7);
plt.title('Four states HMM (last week starting at ' + subsubdata['DAY'].iloc[subsubdata.shape[0]-1] + ')');
# first halving ~ 1354060800 (2012-11-28) i = numpy.amax(numpy.where(subsubdata["EPOCH"] < 1354060800)); plt.axvline(i, linewidth=0.6); # second halving ~ 1468022400 (2016-07-09) i = numpy.amax(numpy.where(subsubdata["EPOCH"] < 1468022400)); plt.axvline(i, linewidth=0.6); # third halving ~ 1589155200 (2020-05-11) i = numpy.amax(numpy.where(subsubdata["EPOCH"] < 1589155200)); plt.axvline(i, linewidth=0.6);
plt.show();
|
|
|
4
|
Local / Deutsch (German) / Re: PoW vs. PoS – was verhindert Akkumulation vieler Coins bei reichen Besitzern?
|
on: June 20, 2020, 09:45:59 AM
|
Eine Erkenntnis meinerseits, die vielleicht anderen schon lange klar ist: Ob PoW oder PoS, die Besitzverteilung bleibt im Idealfall immer gleich! Da nehmen sich die Systeme nichts (quick and dirty und langsam in R): x_ <- c(); # Endverteilung von Partei X y_ <- c(); # Endverteilung von Partei Y # simuliere 100x for (j in 1:100){ x = 9.9*10^3; # Anzahl des Assets von X y = 0.1*10^3; # Anzahl des Assets von Y # 144 Blöcke am Tag ein Jahr lang: for (i in 1:365*144){ # abhängig vom Gewinner geht der Reward an X oder Y if (runif(1) <= x/(x+y)){ x <- x + 50; } else { y <- y + 50; } } # speichere Assetverteilung am Ende x_ <- c(x_, x); y_ <- c(y_, y); }
# berechne Prozentsatz p <- c(); for (i in 1:length(x_)){ p <- c(p, x_[i]/(x_[i]+y_[i])); }
# hat sich was getan? median(p);
Was eigentlich auch logisch ist, denn wenn jemand 99% Gewinnwahrscheinlichkeit hat und alle anderen 1% und diese sich nicht verändert, dann bekommt Ersterer 99% und der Rest 1% des Rewards. Die Verteilung ändert sich dadurch im Mittel nicht. Der Unterschied zwischen PoS und PoW reduziert sich also auf das allgemein bekannte Nothing-At-Stake-Problem in neuem erweiterten Gewand. Während der PoW-Miner seine Coins veräussern muss, damit er weiter erfolgreich minen kann (hat 1miau ja schon erwähnt), macht es sich der PoS-Minter gemütlich und muss nur ab und zu seine Stakes updaten. Der PoS-Minter hat aber praktisch keine Risiken (nothing at stake) und kann alle Gewinne in die eigene Tasche stecken, der PoW-Miner kann hingegen schnell mal pleite gehen. In ersterem Fall (PoW) wird Umsatz generiert, in Zweiterem (PoS) gar nichts. In ersterem Fall kann nur auf einer Chain wirtschaftlich gemint werden (eine physikalische notwendige Bedingung), in Zweiterem auf praktisch beliebig Vielen, alles leistungslos und ohne Risiko, wenn man nur früh genug eingestiegen ist. Alle zusätzlichen Gimmicks, welche an PoS drangeklatsch werden, damit es sicherer und/oder fairer aussieht, sind imho Augenwischerei um eben von jenem oben genannten einfachen Punkt abzulenken.
|
|
|
6
|
Local / Altcoins (Deutsch) / Re: Was haltet Ihr von ADA Cardano ?! Potential oder Shitcoin ?!
|
on: June 17, 2020, 06:54:16 AM
|
Dass man bei Cardano jetzt angeblich das Rich-Get-Richer-Problem gelöst haben will bezweifel ich doch stark. Aber natürlich ist es wunderbare Clickbait-Werbung. Hat bei mir ja auch funktioniert.
Das behauptet weder 1miau, noch ich, noch der von mir verlinkte Artikel. "Gelöst" kann das "Problem" auch nicht werden, es können nur Maßnahmen dagegen ergriffen werden um den Effekt abzudämpfen. Wie du schon richtig festgestellt hast greifen diese nur bis zu einem gewissen Punkt und können mit mehr oder weniger Aufwand umgangen und/oder ausgehebelt werden. Ist wie bei der Sicherheit von Softwaresystemen: Du kannst nur Maßnahmen gegen bspw. Hacks ergreifen, 100% schützen wirst du dich nicht können. Das ist aber imho Augenwischerei bzw. schlicht Marketing bzw. Schlangenöl ( https://de.wikipedia.org/wiki/Schlangen%C3%B6l). Für Leute mit Ahnung ist sowas nämlich kein Hindernis und wird in Nullkommanix ausgenutzt. Ob sich die Omma oder der Oppa nun durch die vorgeschlagene Lösung sicherer fühlen bzw. das System für fairer halten ist denen herzlich egal. Vielleicht wäre es eine weitere Idee, dass die Stakes regelmäßig bewegt werden müssen, für Superreiche wäre das viel Arbeit, wenn die ihre ganzen geteilten Stakes laufend verschieben müssten.
Also eine Blockchain der Blockchain willen. Da wäre man ja fast schon wieder bei PoW bzw. PoC: Eine Blockchain, welche durch Stakingtransaktionen anschwillt und durch mehr und mehr Speicherhardware aufrechterhalten wird. Hat nur den Nachteil, dass jeder Node dazu gezwungen wäre, die Hardware auszubauen um mithalten zu können, ohne dass dabei eine Mehrwert abfällt.
|
|
|
7
|
Local / Altcoins (Deutsch) / Re: Was haltet Ihr von ADA Cardano ?! Potential oder Shitcoin ?!
|
on: June 16, 2020, 05:22:51 AM
|
Es gibt immer ein Hintertürchen wenn ein Projekt mit Anonymität wirbt. Dabei reicht es schon aus, wenn es sich nur um Pseudoanonymität handelt. Dass man bei Cardano jetzt angeblich das Rich-Get-Richer-Problem gelöst haben will bezweifel ich doch stark. Aber natürlich ist es wunderbare Clickbait-Werbung. Hat bei mir ja auch funktioniert. Zum ersten kann man den Stake entsprechend stückeln, dann muss erstmal einer nachweisen, dass der Reward nicht zu unterschiedlichen Parteien geht. Das sagst Du ja selbst: Der maximale Blockreward ist limitiert. Dieser so genannte "Dimishing return" Mechanismus führt also dann quasi dazu, dass die Größen von Stakepools automatisch limitiert sind. Das führt uns dann zu Problem Nummer 2, man könnte ja ganz einfach mehrere kleine Stakepools betreiben.
Deinen zweiten Punkt verstehe ich nicht, da er überhaupt nichts auf/nach/beweist. Ein Cardano Dagobert Duck geht einfach zum ersten Punkt zurück. Muss ja nicht gleich ein Exchange sein. Und selbst denen wird was einfallen. Z.B. ein ähnliches System wie bei Banken heute: man arbeitet im Exchange nur mit einem kleinen Anteil der Einlagen, der grosse Rest wird zum (geschickt verschleiertem) Staken genutzt. Um Problem Nummer 2 entgegen zu wirken erhöht Cardano den Block Reward eines Stake Pools, wenn der Owner des Pools selbst einen (anteilsmäßig großen) Teil seiner ADA staked. Die Idee dahinter ist, dass Stake Pools mit höheren Rewards auch mehr Delegater mit wenigen ADAs (so wie der Großteil von uns vmtl.) anziehen, dadurch also diese Pools gestärkt werden.
Ein anderes Beispiel aus der Bitcoinminingwelt: https://bitcoinblog.de/2020/06/15/interner-krieg-bei-bitmain-behindert-auslieferung-neuer-asic-miner/Auch Dein letzter Punkt wird durch den Ersten augehebelt: Conclusio: "Economies of scale" (also, dass Reiche reicher werden) gibt es bei PoS nicht (wirklich), da Reiche keinen Vorteil besitzen und anteilsmäßig genauso viel vom Reward-Kuchen abbekommen. Lässt natürlich außer Acht, dass es so trotzdem über längere Zeit hinweg zu einer Vermögenszentralisierung kommt.
Warum werden die Reichen nicht reicher wo doch Dein erster Punkt genau das Gegenteil zeigt? Und warum kommt es plötzlich doch zu einer Vermögenszentralisierung? Weil die Ehrlichen auf einmal die Gewinner sind? Cardano geht den gleichen Weg wie Ethereum, wobei Ethereum immer noch nicht (vollständig) auf PoS umgestiegen ist: Immer mehr Regel im System, noch komplexer, dass es selbst die (vermeintlichen) Experten nicht mehr verstehen aber immer leichter auszuhebeln. Und das soll die Omma nutzen? PoS wäre gerne und gibt sich wie etwas, dass es nicht ist. Und viele fallen darauf rein. Klimawandel und so ... man könnte fast ein Geschäft draus machen ...
|
|
|
8
|
Local / Trading und Spekulation / Re: Der Aktuelle Kursverlauf
|
on: June 09, 2020, 05:28:21 PM
|
Was war denn überhaupt das Off-Topic? Bin gerade überfragt, wer überhaupt gemeint ist.
Das Trezor-Thema?
Finde ich gar nicht Off-Topic, wenn Leute so ein Ding beim Handeln nutzen (wollen) ... und das dann nicht geht, wenn der Kurs mal so reagiert, wie man hofft.
|
|
|
9
|
Local / Trading und Spekulation / Re: Der Aktuelle Kursverlauf
|
on: June 08, 2020, 06:35:29 AM
|
https://decrypt.co/31463/bitcoin-segwit-bug-fix-could-lock-wallet-users-out-fundsA Bitcoin user running Segwit downloads a specific malware from an attacker. The victim then begins a transaction with two “inputs” (i.e., parts): one input is for 10 BTC and another is for 5.0001 BTC, so the transaction total is 15 BTC for a 0.0001 fee. Upon confirming the transaction, the user is met with an error message asking them to sign again. The attacker then switches the transaction inputs, so that one input is for 15 BTC and the other is for 0.0001.
With this switch, now the 15 BTC is the transaction fee and the 0.0001 BTC is the transaction. But, for this to pay off, the attacker has to be a miner who also happens to be mining the block that the transaction is included in. The victim must also be spending a transaction with more than one input and download the miner’s malware. In other words, a whole lot needs to go right for this to work.
D.h., dass der Angreifer erstmal den Rechner des Opfer mit Malware infiziert haben muss sodass er das Signieren der Transaktion manipulieren kann. Und dann muss der Angreifer derjenige sein, der auch den Block findet in welchem die manipulierte Transaktion landet um den Blockreward abzugreifen. Viel ärgerlicher finde ich Folgendes: https://blog.trezor.io/latest-firmware-updates-correct-possible-segwit-transaction-vulnerability-266df0d2860Unfortunately, some third-party tools like Electrum or PSBT-based tools like BTCPay Server and Wasabi Wallet do not allow Trezor to obtain the previous transaction in case of Segwit inputs, which is why Trezor will not be able to sign transactions using these tools until they are updated to work correctly. We are cooperating with these parties to fix the problem as we speak.
D.h. für mein Verständnis, dass alle Funds, welche einen Segwit-Input haben, für Electrum, BTCPay und Wasabi eingefroren sind, weil diese Tools die zu signierende Transaktion nicht verarbeiten können.
|
|
|
10
|
Local / Trading und Spekulation / Re: Methoden und Algorithmen zur fortgeschrittenen Kursanalyse
|
on: June 08, 2020, 06:17:26 AM
|
Habe den HMM auf python3 umgestellt, da - die HMM-Funktion in R nicht mehr konvergiert bzw. eine Fehlermeldung zurückgibt (warum auch immer),
- die Datenprozessierung schneller ist,
- es weniger Speicher braucht.
import os; import wget; # pip3 install wget import numpy; # pip3 install numpy import pandas; # pip3 install pandas import matplotlib; # pip3 install matplotlib from hmmlearn import hmm; # pip install --upgrade --user hmmlearn
######################################################################
# weighted mean def wm(x): return (x['VOLUME'] * x['PRICE']).sum()/x['VOLUME'].sum();
# removes incomplete weeks def rm(df, column, n): for i in range(n): if df[column].iloc[0] != subdata[column].iloc[i]: return df.iloc[i:df.shape[0]]; return df;
def fill(df, column): x = numpy.zeros([df.shape[0]]); c = 0; x[0] = c; for i in range(df.shape[0]-1): if df[column].iloc[i] != df[column].iloc[i+1]: c += 1; x[i+1] = c; return x.astype(int);
######################################################################
# download and/or load bitstamp data file_name = 'bitstampUSD.csv.gz'; # but make sure, that the file is up to date if os.path.exists(file_name) == False: file_name = wget.download('https://api.bitcoincharts.com/v1/csv/bitstampUSD.csv.gz');
data = pandas.read_csv(file_name, compression='gzip', header=None); data.columns = ['EPOCH', 'PRICE', 'VOLUME']; data = data.sort_values(by='EPOCH'); data['DATE'] = pandas.to_datetime(data['EPOCH'],unit='s').dt.tz_localize('utc').dt.tz_convert('Europe/Berlin'); data['DAY'] = [str(x) for x in pandas.Series(data['DATE']).dt.date];
# firstly group by day for faster processing subdata = data.groupby('DAY').first(); subdata['OPEN'] = data.groupby('DAY').first()['PRICE']; subdata['CLOSE'] = data.groupby('DAY').last()['PRICE']; subdata['MAX'] = data.groupby('DAY').max()['PRICE']; subdata['MIN'] = data.groupby('DAY').min()['PRICE']; subdata['VOLUME'] = data.groupby('DAY').sum()['VOLUME'];
subdata['PRICE'] = data.groupby(['DAY']).apply(wm); subdata['MA50'] = subdata["MAX"].rolling(50).mean(); subdata['MA200'] = subdata["MAX"].rolling(200).mean(); subdata['RETURN'] = (subdata['CLOSE'] - subdata['OPEN'])/subdata['OPEN'];
subdata['WEEK'] = [str(pandas.Timestamp(x).week) for x in subdata['DATE']];
###################################################################### # not very elegant way to get unique week annotation
# remove first incomplete WEEK subdata = rm(subdata, 'WEEK', 7);
# remove last incomplete WEEK subdata = subdata.sort_values(by='EPOCH', ascending=False); subdata = rm(subdata, 'WEEK', 7); subdata = subdata.sort_values(by='EPOCH');
subdata['WEEK'] = fill(subdata,'WEEK');
######################################################################
# secondly group by week subsubdata = subdata.groupby('WEEK').first(); subsubdata['DAY'] = [str(x) for x in pandas.Series(subsubdata['DATE']).dt.date]; subsubdata['OPEN'] = subdata.groupby('WEEK').first()['OPEN']; subsubdata['CLOSE'] = subdata.groupby('WEEK').last()['CLOSE']; subsubdata['MAX'] = subdata.groupby('WEEK').max()['MAX']; subsubdata['MIN'] = subdata.groupby('WEEK').min()['MIN']; subsubdata['VOLUME'] = subdata.groupby('WEEK').sum()['VOLUME']; subsubdata['PRICE'] = subdata.groupby(['WEEK']).apply(wm); subsubdata['LOG10_PRICE'] = numpy.log10(subsubdata['PRICE']); subsubdata['LOG10_PRICE'] = subsubdata['LOG10_PRICE']/numpy.amax(subsubdata['LOG10_PRICE']); subsubdata['LOG10_MA50'] = numpy.log10(subsubdata['MA50']); subsubdata['LOG10_MA50'] = subsubdata['LOG10_MA50']/numpy.amax(subsubdata['LOG10_MA50']); subsubdata['LOG10_MA200'] = numpy.log10(subsubdata['MA200']); subsubdata['LOG10_MA200'] = subsubdata['LOG10_MA200']/numpy.amax(subsubdata['LOG10_MA200']); subsubdata['RETURN'] = (subsubdata['CLOSE'] - subsubdata['OPEN'])/subsubdata['OPEN'];
# at least not wrong ... subsubdata = subsubdata.sort_values(by='EPOCH');
# create a model and fit it to data model = hmm.GaussianHMM(4, "diag", n_iter=1000);
X = numpy.asarray(subsubdata['RETURN']).reshape(-1,1); fit = model.fit(X);
hidden_states = model.predict(X); hidden_probs = model.predict_proba(X); df = pandas.DataFrame(hidden_probs); df.columns = ['0', '1', '2', '3'];
# my sentiment definition bubble_state = hidden_states[numpy.where(subsubdata['DATE']=='2011-09-19 15:47:03+0200')[0][0]]; sideways_state = hidden_states[numpy.where(subsubdata['DATE']=='2016-10-03 00:00:18+0200')[0][0]]; bullish_state = hidden_states[numpy.where(subsubdata['DATE']=='2013-02-11 00:57:24+0100')[0][0]]; bearish_state = list(set([0,1,2,3]).difference([bubble_state, sideways_state, bullish_state]))[0];
state_index = {'violet':str(bubble_state), 'green':str(bullish_state), 'black':str(sideways_state), 'red':str(bearish_state)}; state_index_= {str(bubble_state):'violet', str(bullish_state):'green', str(sideways_state):'black', str(bearish_state):'red'};
# plot the result import matplotlib.pyplot as plt;
fig, ax = plt.subplots(figsize=(2.24,2.24)); df[state_index['violet']].plot(ax=ax, color='violet', linewidth=0.6, label='bubble'); df[state_index['green']].plot(ax=ax, color='green', linewidth=0.6, label='bullish'); df[state_index['black']].plot(ax=ax, color='black', linewidth=0.6, label='sideways'); df[state_index['red']].plot(ax=ax, color='red', linewidth=0.6, label='bearish'); subsubdata['LOG10_PRICE'].plot(ax=ax, color='blue', linewidth=0.6, label='log10(price)'); subsubdata['LOG10_MA50'].plot(ax=ax, color='orange', linewidth=0.6, linestyle='dashed', label='log10(MA50)'); subsubdata['LOG10_MA200'].plot(ax=ax, color='orange', linewidth=0.6, label='log10(MA200)');
for i in range(len(hidden_states)): rect = matplotlib.patches.Rectangle((i-0.5,0),1,-0.1,linewidth=1,edgecolor='none',facecolor=state_index_[str(hidden_states[i])]); ax.add_patch(rect);
ax.legend(); ticks = numpy.asarray(list(range(subsubdata.shape[0]))); ticks = ticks[ticks%52==0]; plt.xticks(ticks=ticks, labels=subsubdata['DAY'].iloc[ticks], rotation='horizontal'); plt.title('Four states HMM (last week starting at ' + subsubdata['DAY'].iloc[subsubdata.shape[0]-1] + ')'); plt.show();
Plot: 
|
|
|
11
|
Local / Trading und Spekulation / Re: Der Aktuelle Kursverlauf
|
on: May 25, 2020, 04:50:30 PM
|
Ich sehe, dass die Meisten keine Geduld haben.
Was habt ihr denn erwartet? Dass der Kurs nach dem Halving gleich bei 100k steht?
Wie war das doch gleich 2016? Das selbe (!) Gefasel gab es damals nämlich auch: "Alles schon eingepreist", "Miner verkaufen, da nicht mehr rentabel", etc. pp.. Anfang 2017 gab es sogar nochmal nen ordentlichen Rücksetzer. Klug von denen, welche trotzdem regelmäßig gekauft haben. Und dann, 8-10 Monate später ...
Also nutzt die Zeit zum Hamstern. Hin und her macht nur Taschen leer.
|
|
|
15
|
Local / Trading und Spekulation / Re: Der Aktuelle Kursverlauf
|
on: May 11, 2020, 07:31:09 PM
|
000000000000000000024 bead8df69990852c202db0e0097c1a12ea637d7e96d https://en.wikipedia.org/wiki/Bead (*duck und weg*) Beads are thought to be one of the earliest forms of trade between members of the human race. It is thought that bead trading was one of the reasons why humans developed language.[7] Beads are said to have been used and traded for most of our history. The oldest beads found to date were at Blombos Cave, about 72,000 years old, and at Ksar Akil[8] in Lebanon, about 40,000 years old. Zum Wohl:  Nachtrag vom 13.05.2020 21:56: Blockchain entspricht einer Perlenkette aus beads und 24(h) beads entspricht 24h/d globalem freien Handel. Wermutstropfen: mit Glasperlen können "Wilde" vom "Zivilisierten" betrogen werden. Nichtsdestotrotz, das Positive überwiegt. "Ein Zeichen, ein Zeichen ..." 
|
|
|
17
|
Local / Trading und Spekulation / Re: Der Aktuelle Kursverlauf
|
on: May 07, 2020, 07:33:55 PM
|
Sieht gut aus. - Ein Goldencross gibt es dann wohl in ca. 2 Wochen, spätestens in 3 Wochen (1-Wochenchart). (Schon das zweite in diesem Jahr!)
- Einwochenchart: einschliesslich dieser Woche acht grüne Kerzen. Die Achte muss natürlich noch am Sonntag bestätigt werden.
- I smell FOMO: https://boerse.ard.de/anlageformen/kryptowaehrungen/neue-bitcoin-rally-voraus100.html
- Der RSI ist auch schon in verschiedensten Zeitskalen über 70.
- Die 10k sind in greifbare Nähe gerückt.
- Das Halving steht vor der Tür!!!!11elf
Disclaimer: Mein letztes solches Posting vom Februar diesen Jahres wurde nicht mit einer Rallye belohnt (Meine Ausrede: Covid19). Macht euch also noch eure eigenen Gedanken dazu. (Eigentlich wollt ich ins Bett, jetzt wart ich noch auf die 10k  ... Edit: argh ich muss ins Bett, der Schlaf fehlt mir und so Satoshi will ...)
|
|
|
|