S2F and the zombification of the Bitcoin world

Giovanni Santostasi
3 min readMay 2, 2024

The S2F saga is the craziest mind zombification of the Bitcoin world.

It was a completely fake model that enchanted millions.

It was featured on Forbes, Fidelity analysts showed it to their investors to convince them to invest in Bitcoin.

It is mind-blowing.

Some skeptics used sophisticated autocorrelation tests to show it was not a good model.

These economist types missed the point completely. You don’t need to use some sophisticated stat tools to show that S2f is garbage.

Just use intuitive and direct approaches.

The only reason S2F tracks the price is because it is a model based on a correlation that is trivial and not meaningful.

Flow is the only thing that changes (supply too but it is also a function of flow). Supply grows in time and Price grows in time so it is an obvious correlation that is coincidental (and in fact against what the S2F tries to claim that is scarcity that makes the price go up).

The reduction of flow happens on a single block. All the other flow data points do not correlate with the price in between the halvings.

It is as if it was noise.

Flow has a general time directionality, of the most trivial kind, because every 4 years it is reduced by a factor of 2.

I could use spectators for the soccer World Cup and if they go up every 4 years it could be an equal good model for Bitcoin price given the S2F construction steps.

In fact, we can substitute the real flow with a completely fake flow and get the same price model as the “real” S2F.

Here is how I created a fake S2F (well mine is more fake than the original one but that one is fake too).

By the way, these are the exact steps PlanB followed in his original article with the only exception of generating random flow (he used the real Bitcoin flow).

1) Generate random data with length as the BTC price data.

2) Divide by 2, 4, 8, and so on the random data every 4 years. Choose the fake halving data as you like. This is your flow data.

3) Create fake supply data by cumulative sum of the fake flow.

4) Create fake S2F by dividing fake supply by fake flow.

5) Plot the real price vs the fake S2F in a log-log chart. Do a linear fitting and get the slope m and the c intercept.

6) Create a Price model based on fake S2F as Price=10^c*S2F^m.

7) Now you have your fake S2F model. Notice a difference?

Here is the MatLab code to generate these steps.
You can get real data from Bitcoinity.com for example and then compare.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% CODE TO MAKE YOUR OWN FAKE S2F
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% GET SOME BITCOIN PRICE DATA (Bitcoinity.com for example)
rand1=abs(1+0.6*10^-1*randn(1,length(Price)+4*365)); % random BITCOIN FLOW data with the same length than Price
s1=3.4;%where you want to start the jumps (something close to where the halvings are but you can choose)
a1=1:s1*365; %pre halving data
a2=s1*365+1:(s1+4)*365;% first cycle
a3=(s1+4)*365+1:(s1+8)*365;% second cycle
a4=(s1+8)*365+1:(s1+12)*365;% third cycle
a5=(s1+12)*365+1:length(rand1);% third cycle

a1=round(a1);
a2=round(a2);
a3=round(a3);
a4=round(a4);
a5=round(a5);

% DIVIDE THE FAKE "FLOW" BY 2 EVERY 4 YEARS
n1=2;
n2=4;
n3=8;
n4=16;
rand2=rand1;
rand2(a1)=rand1(a1);
rand2(a2)=rand1(a2)/n1;
rand2(a3)=rand1(a3)/n2;
rand2(a4)=rand1(a4)/n3;
rand2(a5)=rand1(a5)/n4;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sup=cumsum(rand2); % SUPPLY IS THE SUM OF THE FLOW OVER THE YEARS
S2F3=sup./rand2; % STOCK TO FLOW, SUPPLY OVER FLOW

%PLAN B STEPS FROM HIS ORIGINAL ARTICLE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% STEP 1: FIT PRICE AND S2F IN LOG-LOG GRAPH
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
S2F3a=S2F3(1:length(Price));% fit only S2F up to price data
PF3=polyfit(log10(S2F3a),log10(Price),1); % linear regression of log S2F and log Price
YEF3=polyval(PF3,log10(S2F3a));% the log log model

S2F=cumsum(Issuance)./Issuance;
PFR=polyfit(log10(S2F),log10(Price),1); % linear regression of log S2F and log Price


figure(1)
loglog(S2F3a,Price,'k.')
hold on
loglog(S2F3a,10.^YEF3,'r-')
hold off
xlabel('Fake S2F')
ylabel('Real Price $')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% STEP 2: USE THE PARAMETER FROM THE FITTING TO CREATE A S2F PRICE MODEL
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
S2FT3=1.3*10^PF3(2)*S2F3.^PF3(1);
S2FR=10^PFR(2)*S2F.^PFR(1);
time2=time1(1):time1(end)+4*365;

figure(2)
semilogy(time2,S2FT3,'r-')
hold on
%semilogy(time1,S2FR,'b-')
semilogy(time1,Price,'k.')
hold off
xlabel('Days')
ylabel('Price Bitcoin $')
%legend('Fake S2F made of random numbers','Real S2F','Price $','location','northwest')
title(['S2F made of COMPLETE RANDOM NUMBERS and increasing flow'])
grid on

Can we put to rest once and for all this monstrosity and stupid model?

--

--