mirror of
https://github.com/redoules/redoules.github.io.git
synced 2025-12-12 15:59:34 +00:00
414 lines
20 KiB
HTML
414 lines
20 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="fr">
|
|
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
|
|
<meta name="description" content="Data Science for Political and Social Phenomena">
|
|
<meta name="author" content="Guillaume Redoulès">
|
|
<link rel="icon" href="../favicon.ico">
|
|
|
|
<title>Computing the Mayer multiple - Cryptocurrencies</title>
|
|
|
|
<!-- JQuery -->
|
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
|
|
<script>
|
|
window.jQuery || document.write('<script src="../theme/js/jquery.min.js"><\/script>')
|
|
</script>
|
|
|
|
<!-- Bootstrap core CSS -->
|
|
<link rel="stylesheet" href="../theme/css/bootstrap.css" />
|
|
<!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
|
|
<link rel="stylesheet" type="text/css" href="../theme/css/ie10-viewport-bug-workaround.css" />
|
|
<!-- Custom styles for this template -->
|
|
<link rel="stylesheet" type="text/css" href="../theme/css/style.css" />
|
|
<link rel="stylesheet" type="text/css" href="../theme/css/notebooks.css" />
|
|
<link href='https://fonts.googleapis.com/css?family=PT+Serif:400,700|Roboto:400,500,700' rel='stylesheet' type='text/css'>
|
|
|
|
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
|
<!--[if lt IE 9]>
|
|
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
|
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
|
|
<![endif]-->
|
|
|
|
|
|
<meta name="tags" content="Visualization" />
|
|
|
|
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<div class="navbar navbar-fixed-top">
|
|
<div class="container">
|
|
<div class="navbar-header">
|
|
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
|
|
<span class="icon-bar"></span>
|
|
<span class="icon-bar"></span>
|
|
<span class="icon-bar"></span>
|
|
</button>
|
|
<a class="navbar-brand" href="..">Guillaume Redoulès</a>
|
|
</div>
|
|
<div class="navbar-collapse collapse" id="searchbar">
|
|
|
|
<ul class="nav navbar-nav navbar-right">
|
|
<li class="dropdown">
|
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">About<span class="caret"></span></a>
|
|
<ul class="dropdown-menu">
|
|
<li><a href="../pages/about.html">About Guillaume</a></li>
|
|
<li><a href="https://github.com/redoules">GitHub</a></li>
|
|
<li><a href="https://www.linkedin.com/in/guillaume-redoul%C3%A8s-33923860/">LinkedIn</a></li>
|
|
</ul>
|
|
</li>
|
|
<li class="dropdown">
|
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Data Science<span class="caret"></span></a>
|
|
<ul class="dropdown-menu">
|
|
<li><a href="..#Blog">Blog</a></li>
|
|
<li><a href="..#Python">Python</a></li>
|
|
<li><a href="..#Bash">Bash</a></li>
|
|
<li><a href="..#SQL">SQL</a></li>
|
|
<li><a href="..#Mathematics">Mathematics</a></li>
|
|
<li><a href="..#Machine_Learning">Machine Learning</a></li>
|
|
<li><a href="..#Projects">Projects</a></li>
|
|
</ul>
|
|
</li>
|
|
<li class="dropdown">
|
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Projects<span class="caret"></span></a>
|
|
<ul class="dropdown-menu">
|
|
<li><a href="https://github.com/redoules/redoules.github.io">Notes (Github)</a></li>
|
|
</ul>
|
|
</li>
|
|
|
|
<!--<li class="dropdown">
|
|
<a href="../feeds/blog.rss.xml">Blog RSS</a>
|
|
</li>-->
|
|
|
|
|
|
</ul>
|
|
|
|
<form class="navbar-form" action="../search.html" onsubmit="return validateForm(this.elements['q'].value);">
|
|
<div class="form-group" style="display:inline;">
|
|
<div class="input-group" style="display:table;">
|
|
<span class="input-group-addon" style="width:1%;"><span class="glyphicon glyphicon-search"></span></span>
|
|
<input class="form-control search-query" name="q" id="tipue_search_input" placeholder="e.g. scikit KNN, pandas merge" required autocomplete="off" type="text">
|
|
</div>
|
|
</div>
|
|
</form>
|
|
|
|
</div>
|
|
<!--/.nav-collapse -->
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<!-- end of header section -->
|
|
<div class="container">
|
|
<!-- <div class="alert alert-warning" role="alert">
|
|
Did you find this page useful? Please do me a quick favor and <a href="#" class="alert-link">endorse me for data science on LinkedIn</a>.
|
|
</div> -->
|
|
<section id="content" class="body">
|
|
<header>
|
|
<h1>
|
|
Computing the Mayer multiple
|
|
</h1>
|
|
<ol class="breadcrumb">
|
|
<li>
|
|
<time class="published" datetime="2018-12-16T08:51:00+01:00">
|
|
16 décembre 2018
|
|
</time>
|
|
</li>
|
|
<li>Cryptocurrencies</li>
|
|
<li>Visualization</li>
|
|
</ol>
|
|
</header>
|
|
<div class='article_content'>
|
|
<p>I've learnt about the Mayer mutliple from <a href="https://www.theinvestorspodcast.com/bitcoin-mayer-multiple/">The Inverstor Podcast</a>. The Mayer multiple is the ratio of the bitcoin price divided by the 200-day moving average. It is designed to understand the price of bitcoin without taking in account the short term volatility. It helps investors filter out their emotions during a bull run.</p>
|
|
<p>Let's see how to compute the Mayer mutliple in python.</p>
|
|
<p>First, we need to import the data, we will use Quandl to download data from coinbase</p>
|
|
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">quandl</span>
|
|
<span class="n">btc_price_data</span> <span class="o">=</span> <span class="n">quandl</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"BCHARTS/COINBASEEUR"</span><span class="p">)</span>
|
|
<span class="n">btc_price_data</span><span class="o">.</span><span class="n">tail</span><span class="p">()</span>
|
|
</pre></div>
|
|
|
|
|
|
<div>
|
|
<style scoped>
|
|
.dataframe tbody tr th:only-of-type {
|
|
vertical-align: middle;
|
|
}
|
|
|
|
.dataframe tbody tr th {
|
|
vertical-align: top;
|
|
}
|
|
|
|
.dataframe thead th {
|
|
text-align: right;
|
|
}
|
|
</style>
|
|
<table border="1" class="dataframe">
|
|
<thead>
|
|
<tr style="text-align: right;">
|
|
<th></th>
|
|
<th>Open</th>
|
|
<th>High</th>
|
|
<th>Low</th>
|
|
<th>Close</th>
|
|
<th>Volume (BTC)</th>
|
|
<th>Volume (Currency)</th>
|
|
<th>Weighted Price</th>
|
|
</tr>
|
|
<tr>
|
|
<th>Date</th>
|
|
<th></th>
|
|
<th></th>
|
|
<th></th>
|
|
<th></th>
|
|
<th></th>
|
|
<th></th>
|
|
<th></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<th>2018-12-12</th>
|
|
<td>2966.00</td>
|
|
<td>3076.71</td>
|
|
<td>2952.05</td>
|
|
<td>3026.00</td>
|
|
<td>1447.627465</td>
|
|
<td>4.372890e+06</td>
|
|
<td>3020.728514</td>
|
|
</tr>
|
|
<tr>
|
|
<th>2018-12-13</th>
|
|
<td>3025.19</td>
|
|
<td>3028.06</td>
|
|
<td>2861.15</td>
|
|
<td>2886.91</td>
|
|
<td>2125.242928</td>
|
|
<td>6.261750e+06</td>
|
|
<td>2946.369017</td>
|
|
</tr>
|
|
<tr>
|
|
<th>2018-12-14</th>
|
|
<td>2886.91</td>
|
|
<td>2919.00</td>
|
|
<td>2800.32</td>
|
|
<td>2835.50</td>
|
|
<td>2527.558347</td>
|
|
<td>7.256959e+06</td>
|
|
<td>2871.134083</td>
|
|
</tr>
|
|
<tr>
|
|
<th>2018-12-15</th>
|
|
<td>2835.49</td>
|
|
<td>2865.00</td>
|
|
<td>2781.47</td>
|
|
<td>2830.45</td>
|
|
<td>1267.004758</td>
|
|
<td>3.568614e+06</td>
|
|
<td>2816.575409</td>
|
|
</tr>
|
|
<tr>
|
|
<th>2018-12-16</th>
|
|
<td>2830.45</td>
|
|
<td>2830.45</td>
|
|
<td>2830.44</td>
|
|
<td>2830.45</td>
|
|
<td>0.144249</td>
|
|
<td>4.082886e+02</td>
|
|
<td>2830.447385</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<p>Next we need to compute the 200 days moving average of the price of bitcoin</p>
|
|
<div class="highlight"><pre><span></span><span class="n">moving_averages</span> <span class="o">=</span> <span class="n">btc_price_data</span><span class="p">[[</span><span class="s2">"Open"</span> <span class="p">,</span><span class="s2">"High"</span> <span class="p">,</span><span class="s2">"Low"</span><span class="p">,</span><span class="s2">"Close"</span><span class="p">]]</span><span class="o">.</span><span class="n">rolling</span><span class="p">(</span><span class="n">window</span><span class="o">=</span><span class="mi">200</span><span class="p">)</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span>
|
|
<span class="n">moving_averages</span><span class="o">.</span><span class="n">tail</span><span class="p">()</span>
|
|
</pre></div>
|
|
|
|
|
|
<div>
|
|
<style scoped>
|
|
.dataframe tbody tr th:only-of-type {
|
|
vertical-align: middle;
|
|
}
|
|
|
|
.dataframe tbody tr th {
|
|
vertical-align: top;
|
|
}
|
|
|
|
.dataframe thead th {
|
|
text-align: right;
|
|
}
|
|
</style>
|
|
<table border="1" class="dataframe">
|
|
<thead>
|
|
<tr style="text-align: right;">
|
|
<th></th>
|
|
<th>Open</th>
|
|
<th>High</th>
|
|
<th>Low</th>
|
|
<th>Close</th>
|
|
</tr>
|
|
<tr>
|
|
<th>Date</th>
|
|
<th></th>
|
|
<th></th>
|
|
<th></th>
|
|
<th></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<th>2018-12-12</th>
|
|
<td>5507.88295</td>
|
|
<td>5611.72570</td>
|
|
<td>5380.60150</td>
|
|
<td>5491.43610</td>
|
|
</tr>
|
|
<tr>
|
|
<th>2018-12-13</th>
|
|
<td>5491.44155</td>
|
|
<td>5595.14440</td>
|
|
<td>5363.77840</td>
|
|
<td>5474.38560</td>
|
|
</tr>
|
|
<tr>
|
|
<th>2018-12-14</th>
|
|
<td>5474.39910</td>
|
|
<td>5577.89585</td>
|
|
<td>5347.27500</td>
|
|
<td>5457.99125</td>
|
|
</tr>
|
|
<tr>
|
|
<th>2018-12-15</th>
|
|
<td>5457.94930</td>
|
|
<td>5559.49145</td>
|
|
<td>5330.78235</td>
|
|
<td>5439.75570</td>
|
|
</tr>
|
|
<tr>
|
|
<th>2018-12-16</th>
|
|
<td>5439.71660</td>
|
|
<td>5540.89425</td>
|
|
<td>5313.62955</td>
|
|
<td>5422.17700</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<p>Finally, we can compute the ratio and plot it.</p>
|
|
<div class="highlight"><pre><span></span><span class="o">%</span><span class="n">matplotlib</span> <span class="n">inline</span>
|
|
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="kn">as</span> <span class="nn">plt</span>
|
|
<span class="n">plt</span><span class="o">.</span><span class="n">rcParams</span><span class="p">[</span><span class="s1">'savefig.dpi'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">300</span>
|
|
<span class="n">plt</span><span class="o">.</span><span class="n">rcParams</span><span class="p">[</span><span class="s1">'figure.dpi'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">163</span>
|
|
<span class="n">plt</span><span class="o">.</span><span class="n">rcParams</span><span class="p">[</span><span class="s1">'figure.autolayout'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">False</span>
|
|
<span class="n">plt</span><span class="o">.</span><span class="n">rcParams</span><span class="p">[</span><span class="s1">'figure.figsize'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">12</span>
|
|
<span class="n">plt</span><span class="o">.</span><span class="n">rcParams</span><span class="p">[</span><span class="s1">'font.size'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">26</span>
|
|
|
|
|
|
<span class="n">mayer_multiple</span> <span class="o">=</span> <span class="n">btc_price_data</span><span class="o">/</span><span class="n">moving_averages</span>
|
|
<span class="n">mayer_multiple</span><span class="p">[</span><span class="s2">"High"</span><span class="p">]</span><span class="o">.</span><span class="n">plot</span><span class="p">()</span>
|
|
<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s2">"Mayer Mutliple over time"</span><span class="p">)</span>
|
|
<span class="n">plt</span><span class="o">.</span><span class="n">ylabel</span><span class="p">(</span><span class="s2">"Mayer Mutliple"</span><span class="p">)</span>
|
|
<span class="n">plt</span><span class="o">.</span><span class="n">xlabel</span><span class="p">(</span><span class="s2">"Time"</span><span class="p">)</span>
|
|
<span class="k">print</span><span class="p">(</span><span class="n">f</span><span class="s2">"Mayer multiple {mayer_multiple.iloc[-1]['High']}"</span><span class="p">)</span>
|
|
<span class="k">print</span><span class="p">(</span><span class="n">f</span><span class="s2">"Mayer multiple average {mayer_multiple.mean()['High']}"</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
|
|
<div class="highlight"><pre><span></span><span class="n">Mayer</span> <span class="n">multiple</span> <span class="mi">0</span><span class="p">.</span><span class="mi">5108290958630005</span>
|
|
<span class="n">Mayer</span> <span class="n">multiple</span> <span class="n">average</span> <span class="mi">1</span><span class="p">.</span><span class="mi">3789102045356179</span>
|
|
</pre></div>
|
|
|
|
|
|
<p><img alt="png" src="../images/mayer_multiple/output_5_1.png"></p>
|
|
<p>Lastly, I wanted to plot the distribution of the Mayer multiple</p>
|
|
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">as</span> <span class="nn">np</span>
|
|
<span class="n">x</span> <span class="o">=</span> <span class="n">mayer_multiple</span><span class="p">[</span><span class="s2">"High"</span><span class="p">]</span><span class="o">.</span><span class="n">values</span>
|
|
<span class="n">x</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="o">~</span><span class="n">np</span><span class="o">.</span><span class="n">isnan</span><span class="p">(</span><span class="n">x</span><span class="p">)]</span>
|
|
<span class="n">n</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">patches</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">hist</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="s1">'green'</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.75</span><span class="p">,</span> <span class="n">density</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
|
|
<span class="n">plt</span><span class="o">.</span><span class="n">axvline</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="mf">2.4</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s2">"red"</span><span class="p">)</span>
|
|
<span class="n">plt</span><span class="o">.</span><span class="n">annotate</span><span class="p">(</span><span class="s1">'We are here today'</span><span class="p">,</span>
|
|
<span class="n">xy</span><span class="o">=</span><span class="p">(</span><span class="n">mayer_multiple</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="s2">"High"</span><span class="p">],</span>
|
|
<span class="n">n</span><span class="p">[(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">bins</span><span class="o">-</span><span class="n">mayer_multiple</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="s2">"High"</span><span class="p">]))</span><span class="o">.</span><span class="n">argmin</span><span class="p">()]),</span>
|
|
<span class="n">xytext</span><span class="o">=</span><span class="p">(</span><span class="n">mayer_multiple</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="s2">"High"</span><span class="p">]</span><span class="o">*</span><span class="mi">3</span><span class="p">,</span><span class="n">n</span><span class="o">.</span><span class="n">max</span><span class="p">()</span><span class="o">/</span><span class="mi">2</span><span class="p">),</span>
|
|
<span class="n">arrowprops</span><span class="o">=</span><span class="nb">dict</span><span class="p">(</span><span class="n">facecolor</span><span class="o">=</span><span class="s1">'black'</span><span class="p">,</span> <span class="n">shrink</span><span class="o">=</span><span class="mf">0.05</span><span class="p">),</span>
|
|
<span class="p">)</span>
|
|
<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s2">"Distribution of the Mayer mutliple"</span><span class="p">)</span>
|
|
<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">()</span>
|
|
</pre></div>
|
|
|
|
|
|
<div class="highlight"><pre><span></span><span class="p">[]</span>
|
|
</pre></div>
|
|
|
|
|
|
<p><img alt="png" src="../images/mayer_multiple/output_7_1.png"></p>
|
|
</div>
|
|
<aside>
|
|
<div class="bug-reporting__panel">
|
|
<h3>Find an error or bug? Have a suggestion?</h3>
|
|
<p>Everything on this site is avaliable on GitHub. Head on over and <a href='https://github.com/redoules/redoules.github.io/issues/new'>submit an issue.</a> You can also message me directly by <a href='mailto:guillaume.redoules@gadz.org'>email</a>.</p>
|
|
</div>
|
|
</aside>
|
|
</section>
|
|
|
|
</div>
|
|
<!-- start of footer section -->
|
|
<footer class="footer">
|
|
<div class="container">
|
|
<p class="text-muted">
|
|
<center>This project contains 105 pages and is available on <a href="https://github.com/redoules/redoules.github.io">GitHub</a>.
|
|
<br/>
|
|
Copyright © Guillaume Redoulès,
|
|
<time datetime="2018">2018</time>.
|
|
</center>
|
|
</p>
|
|
</div>
|
|
</footer>
|
|
|
|
<!-- This jQuery line finds any span that contains code highlighting classes and then selects the parent <pre> tag and adds a border. This is done as a workaround to visually distinguish the code inputs and outputs -->
|
|
<script>
|
|
$( ".hll, .n, .c, .err, .k, .o, .cm, .cp, .c1, .cs, .gd, .ge, .gr, .gh, .gi, .go, .gp, .gs, .gu, .gt, .kc, .kd, .kn, .kp, .kr, .kt, .m, .s, .na, .nb, .nc, .no, .nd, .ni, .ne, .nf, .nl, .nn, .nt, .nv, .ow, .w, .mf, .mh, .mi, .mo, .sb, .sc, .sd, .s2, .se, .sh, .si, .sx, .sr, .s1, .ss, .bp, .vc, .vg, .vi, .il" ).parent( "pre" ).css( "border", "1px solid #DEDEDE" );
|
|
</script>
|
|
|
|
|
|
<!-- Load Google Analytics -->
|
|
<script>
|
|
/*
|
|
(function(i, s, o, g, r, a, m) {
|
|
i['GoogleAnalyticsObject'] = r;
|
|
i[r] = i[r] || function() {
|
|
(i[r].q = i[r].q || []).push(arguments)
|
|
}, i[r].l = 1 * new Date();
|
|
a = s.createElement(o),
|
|
m = s.getElementsByTagName(o)[0];
|
|
a.async = 1;
|
|
a.src = g;
|
|
m.parentNode.insertBefore(a, m)
|
|
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
|
|
|
|
ga('create', 'UA-66582-32', 'auto');
|
|
ga('send', 'pageview');
|
|
*/
|
|
</script>
|
|
<!-- End of Google Analytics -->
|
|
|
|
<!-- Bootstrap core JavaScript
|
|
================================================== -->
|
|
<!-- Placed at the end of the document so the pages load faster -->
|
|
<script src="../theme/js/bootstrap.min.js"></script>
|
|
<!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
|
|
<script src="../theme/js/ie10-viewport-bug-workaround.js"></script>
|
|
|
|
|
|
</body>
|
|
|
|
</html> |