The Soccer World Cup and Stock to Flow Model, a love story

Giovanni Santostasi
5 min readMay 5, 2024

Note: Please read the PS at the end for an important clarification (it is after the code, skip the code if not interested).

The world economy is a weird science.

Did you know, for example, that there is an intimate relationship between the greed of professional soccer players and the price of Bitcoin?

No? Well, now you do.

The only way to fix this insatiable greed is to give the best champions in the world an increasingly high reward when they win the World Cup every 4 years.

This is good for Bitcoin.
It is a mystery why is so but it is, the data say so.

By the way, you know that the halvings in Bitcoin happen also every 4 years.

Coincidence? I don’t think so.

But is not really the cut in supply of Bitcoin that makes the price go up, not at all.

It is the inverse reward to the world champs that makes it go up.

If we make a model based on World Soccer champs greed we get an even better price model for BTC than the one based on scarcity by PlanB. Much better.

You can see from my code below how it works.
But basically, I took all the steps from PlanB original article:

and I reduced the soccer greed flow by the exact amount of millions the Soccer champs receive at the final of the World Cup. I used the date of the final game as my soccer halving event.

Below is the result when compared with the original S2F model by PlanB.

I think the Soccer to Flow model works much better. What do you think?

You can reproduce my results using the code below or your own modification in whatever code language you prefer:


genesisDate = datetime('2009-01-03', 'Format', 'yyyy-MM-dd');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DATES OF THE SOCCER HALVINGS (World Cup Finals)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Fin10='2010-7-10';
Fin14='2014-7-13';
Fin18='2018-7-15';
Fin22='2022-12-18';
NumDays10 = daysact(genesisDate,Fin10);% dasy from the Genesis Block for each soccer halving date
NumDays14 = daysact(genesisDate,Fin14);
NumDays18 = daysact(genesisDate,Fin18);
NumDays22 = daysact(genesisDate,Fin22);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
soc1a=0.01+10^-10*randn(1,length(time1));
% make some random flow (it doesn't matter what it is just make it close to a constant per day, add more noise if you like
% THIS FLOW REPRESENTS THE NEED TO REWARD CHAMPIONS, IT GROWS WITH TIME

a1=min( find(time1>=NumDays10));
a2=min( find(time1>=NumDays14));
a3=min( find(time1>=NumDays18));
a4=min( find(time1>=NumDays22));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
soc1=soc1a;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DECREASE THE FLOW AT THE WORLD CUP FINAL, SOCCER IS GOOD FOR BITCOIN !!!!
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% POOR SOCCER CHAMPS, THEY NEED A MONEY FIX EVERY 4 YEARS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% HERE ARE THE TIMES IN BETWEEN THE SOCCER HALVINGS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
soc1(1:a1)=soc1a(1:a1);
soc1(a1+1:a2)=soc1a(a1+1:a2)/30;% REDUCE THE SOCCER FIX FLOW BY HOW MANY MILLIONS CHAMPS GET AT THE FINAL
soc1(a2+1:a3)=soc1a(a2+1:a3)/34;% REDUCE THE SOCCER FIX FLOW BY HOW MANY MILLIONS CHAMPS GET AT THE FINAL
soc1(a3+1:a4)=soc1a(a3+1:a4)/38;% REDUCE THE SOCCER FIX FLOW BY HOW MANY MILLIONS CHAMPS GET AT THE FINAL
soc1(a4+1:end)=soc1a(a4+1:end)/42;% REDUCE THE SOCCER FIX FLOW BY HOW MANY MILLIONS CHAMPS GET AT THE FINAL

figure(10)
plot(soc1)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sup=cumsum(soc1); % SUPPLY IS THE SUM OF THE FLOW OVER THE YEARS
S2F3=sup./soc1; % STOCK TO FLOW, SUPPLY OVER FLOW

figure(9)
semilogy(S2F3,'k-')

%PLAN B STEPS FROM PLAN B ORIGINAL ARTICLE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% STEP 1: FIT PRICE AND S2F IN LOG-LOG GRAPH
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
S2F3a=S2F3(1:length(Price));% fit only S2F up to price data (FAKE S2F HERE)
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; % "REAl" S2F (yeah as real at it comes) USE REAL FLOW HERE FOR COMPARISON
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=10^PF3(2)*S2F3.^PF3(1);% FAKE SOCCER TO FLOW MODEL
S2FR=10^PFR(2)*S2F.^PFR(1);% "REAL" S2F MODEL
time2=time1(1):time1(end);

figure(2)
semilogy(time1,S2FR,'b-')
hold on
semilogy(time1,Price,'k.')
semilogy(time2,S2FT3,'r-','linewidth',3)
hold off
xlabel('Days')
ylabel('Price Bitcoin $')
legend('Real S2F','Price $','Fake Soccer S2F','location','northwest')
title(['S2F made of Soccer World Cup Inverse Rewards '])
grid on

Important PS:

I received a few comments along the lines: “Your joke doesn't prove anything if not that S2F can work with anything, so actually you are showing S2F really is true”.

Not sure how this works and how somebody would think this. As a science communicator is very difficult sometimes for me to understand how people can go wrong in understanding scientific ideas but I’m very eager to understand how these fallacies can happen. I genuinely want to be better in my communication skills.

But let me try to explain why it is problematic that an algorithm or method that is supposed to reveal a relationship between 2 quantities (S2F and the Price of Bitcoin) fails if it always works no matter the input.

Imagine you have a medical device that is supposed to detect cancer.

You put in some blood samples from a patient with cancer and it tells you that the human patient has cancer (it tells you the blood comes from a human).

So far so good. Then you put in a sample from a patient that doesn’t have cancer (from other tests you did with more sophisticated machines). The same machine above tells you it is a human with cancer.

Then you put in a blood sample from a pig, rabbit, water, Coca-Cola, oil. The machine always says, “IT IS A HUMAN PATIENT WITH CANCER”.

Will you trust such a machine or say “Yeah it is a good machine because it really works with anything”?

Well now you understand why S2F giving us the same answer (it tracks the price well) no matter what data you use to create the fake S2F (random data, the soccer World Cup prizes, the number of pirates in the Gulf of Mexico) or whatever number that changes in time is hugely problematic and it shows it is a fake model and it doesn’t work not for a philosophical reason but because of a fundamental problem in its algorithm (correlation is not causation and 2 things going up in time will be always correlated no matter what).

--

--