-
Notifications
You must be signed in to change notification settings - Fork 0
/
investment.html
330 lines (292 loc) · 36.7 KB
/
investment.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
<!DOCTYPE HTML>
<!--
-->
<html>
<head>
<title>Xiao Tianyou Theo Portfolio</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<link rel="stylesheet" href="assets/css/main.css" />
<noscript><link rel="stylesheet" href="assets/css/noscript.css" /></noscript>
</head>
<body class="is-preload">
<!-- Wrapper -->
<div id="wrapper">
<!-- Header -->
<header id="header">
<a href="index.html" class="logo">Theo</a>
</header>
<!-- Nav -->
<nav id="nav">
<ul class="links">
<li><a href="index.html">Projects</a></li>
<li><a href="handwriting_recognition.html">Handwriting</a></li>
<li><a href="binary_search.html">Binary_Search</a></li>
<li class = "active"><a href="investment.html">Investment</a></li>
<li><a href="mnist.html">MNIST</a></li>
<li><a href="passion_computing.html">Passion_Programming</a></li>
<li><a href="myself.html">Myself</a></li>
</ul>
<ul class="icons">
<li><a href="https://github.com/theo-xiao-sg" class="icon brands fa-github" target="_blank""><span class="label">GitHub</span></a></li>
</ul>
</nav>
<!-- Main -->
<div id="main">
<!-- Post -->
<section class="post">
<header class="major">
<h1>Backtesting Moving Average trading strategy</h1>
<a href="https://github.com/theo-xiao-sg/investment_python" target="_blank" class="button">Source code</a>
</header>
<!-- Lists -->
<h3>Introduction</h3>
<p>During every Chinese New Year, I receive some money from my parents, grandparents, and other relatives and friends. I have been investing this money in technology stocks such as Apple, Tesla, Amazon, Microsoft, Tencent, and others. My simple investment strategy is to buy the stocks of the companies which a lot of us use the products of. Following the technology boom in 2020, I made significant profits. However, I experienced a significant loss when the market underwent a drawdown towards the end of 2021.</p>
<p>To mitigate such drawdowns and participate in market rallies, I turned to YouTube for guidance. There are numerous stock trading videos that teach strategies to avoid drawdowns and identify market rallies. One of the most popular tools recommended is the Simple Moving Average (SMA or MA) with a period of 200 days. Many content creators advertised SMA 200 as a miracle, able to participate in the market rallies while avoiding drawdowns. I was sceptical about that as it sounded too good to be true and I built a backtest model to test this popular strategy using Python.</p>
<p>After carefully backtesting the SMA strategies, a clear disparity emerges. Investment videos, particularly those seeking to attract paying customers, often emphasize a wrongly backtested SMA strategy that showcases remarkably high returns. This can lead to unrealistic expectations. In contrast, the correctly backtested SMA profit, which is rarely disclosed, provides a more realistic perspective. </p>
<p>I hope my careful research and backtest can help many investors become more careful while surrounded by much unsound paid investment advice. In addition, the backtest framework can be used for testing other trading strategies, or even apply AI models on it in the future. It again shows I become much more resourceful with the help of Python programming.</p>
<h3>Data and Method</h3>
<p>The Simple Moving Average (SMA or MA) trading strategy is a popular technical analysis approach used by traders to identify potential trend reversals or entry/exit points in financial markets. The strategy involves calculating the average price of an asset over a specified period and using it as a reference for making trading decisions.</p>
<p>Here's how the Simple Moving Average trading strategy typically works:</p>
<ol>
<li>Select a time period: Determine the time period for calculating the moving average. Common choices include 50 days, 100 days, or 200 days. In this example, I choose 200 days.</li>
<li>Calculate the moving average: Add up the daily prices of the stock over the selected time period and divide it by the number of days to get the average. This forms the moving average line.</li>
<li>Monitor the price movement: Compare the current price of the stock with the moving average line. If the price crosses above the moving average line, it may indicate a positive signal, suggesting a potential uptrend. Conversely, if the price crosses below the moving average line, it may suggest a negative signal, indicating a potential downtrend.</li>
<li>Make trading decisions: If the price crosses above the moving average line, you should buy the stock to participate in the market rally; if the price crosses below the moving average line, you should sell the stock to avoid drawdown.</li>
</ol>
<p>The yfinance (Yahoo Finance) package is a powerful tool in Python for downloading historical stock market data. It allows users to fetch data directly from Yahoo Finance. To illustrate, I show the prices of Tesla and Microsoft from 2020-01-01 to 2023-06-16.</p>
<!-- Image -->
<style>
.image-caption {
text-align: center;
font-style: italic;
}
</style>
<div class="box alt">
<div class="row gtr-50 gtr-uniform">
<div class="col-6">
<figure>
<span class="image fit">
<img src="images/Tesla, Inc._prices.png" alt="" />
</span>
</figure>
</div>
<div class="col-6">
<figure>
<span class="image fit">
<img src="images/Microsoft Corporation_prices.png" alt="" />
</span>
</figure>
</div>
</div>
</div>
<h3>Results</h3>
<div class="image main"><img src="images/Tesla, Inc._200ma.png" style="width: 80%; height: auto;"></div>
<p>In the plot displayed above, I have depicted the daily price movement of my favourite stock, Tesla, from January 2020 to Jun 2023. Additionally, the 200-day moving average line has been included in the graph. By observing the plot, it becomes evident that when the stock prices rise above the moving average line from beginning of 2020 to beginning of 2022 and just recently. It serves as a clear positive signal, and you can make quite some money if you hold this stock during this period. Conversely, when the price crosses below the moving average line from beginning of 2022 to recently, it signifies a negative signal, suggesting a potential drawdown, and you should sell this stock just when it happens. </p>
<p>It sounds quite easy to be successful in investing in stock markets. And it is what most youtubers hope to achieve as shown in the following graph. The orange line represents the profits and losses of the SMA 200 strategy, while the blue line represents the profits and losses of the buy-and-hold strategy. The buy-and-hold strategy simply means I keep the stock throughout this period, and it serves as a benchmark to assess any dynamic trading strategy. As shown by the following plot, the moving average strategy makes significant profit than simply holding the stock. Thus, we always participate in the market rally and avoid market drawdown. </p>
<div class="image main"><img src="images/Tesla, Inc._200ma_pnl1.png" style="width: 80%; height: auto;"></div>
<p>However, during my careful backtest, I found out this performance line is not realistic and wrongly backtested. Many people misaligned the prices and signals. They forgot the signals are only known after the prices are available for the day. So, they can only trade the signal the next day and it means we should have shifted the signal by one day. As the below graph shows, this small mistake has a huge impact on the backtested performance. Thus, I name the above graph as the fake SMA line as they are usually shown by many so-called investment experts in their YouTube videos.</p>
<p>After conducting a careful backtest, the plot below illustrates the profit and loss (PnL) of the correctly backtested SMA 200 strategy. While the SMA still generated okay performance, it falls short of the performance of a simple buy-and-hold strategy. This indicates that the real SMA 200 strategy does not live up to the claims made by numerous investment gurus. We could have used the time and effort to do other useful things in life rather than trading in-out in the stock markets following this strategy.</p>
<div class="image main"><img src="images/Tesla, Inc._200ma_pnl2.png" style="width: 80%; height: auto;"></div>
<p>When examining the performance of the fake SMA, real SMA, and buy-and-hold strategies in a single plot, a distinct disparity becomes even more evident. The green line corresponds to the wrongly backtested SMA profit frequently emphasized in investment videos, particularly those aiming to entice viewers into paying for investment lessons. It portrays remarkably higher returns, potentially creating unrealistic expectations. In contrast, the orange line represents the correctly backtested SMA profit, a perspective seldom disclosed by individuals within the investment community. The contrast between the two lines emphasizes the exaggerated claims made by some individuals in the investment community. It highlights the need for critical evaluation and scrutiny when encountering investment advice.</p>
<div class="image main"><img src="images/Tesla, Inc._200ma_pnl3.png" style="width: 80%; height: auto;"></div>
<p>After conducting tests on this moving average strategy with other technology stocks (Microsoft, Amazon, Apple, ...), it has become apparent that this approach does not always enhance performance compared to simply holding the stock throughout the given period. Certainly, the strategy's performance falls considerably short of the claims made by many investment gurus on YouTube.</p>
<!-- Image -->
<style>
.image-caption {
text-align: center;
font-style: italic;
}
</style>
<div class="box alt">
<div class="row gtr-50 gtr-uniform">
<div class="col-6">
<figure>
<span class="image fit">
<img src="images/Apple Inc._200ma.png" alt="" />
</span>
</figure>
</div>
<div class="col-6">
<figure>
<span class="image fit">
<img src="images/Apple Inc._200ma_pnl3.png" alt="" />
</span>
</figure>
</div>
</div>
</div>
<div class="box alt">
<div class="row gtr-50 gtr-uniform">
<div class="col-6">
<figure>
<span class="image fit">
<img src="images/Amazon.com, Inc._200ma.png" alt="" />
</span>
</figure>
</div>
<div class="col-6">
<figure>
<span class="image fit">
<img src="images/Amazon.com, Inc._200ma_pnl3.png" alt="" />
</span>
</figure>
</div>
</div>
</div>
<div class="box alt">
<div class="row gtr-50 gtr-uniform">
<div class="col-6">
<figure>
<span class="image fit">
<img src="images/Microsoft Corporation_200ma.png" alt="" />
</span>
</figure>
</div>
<div class="col-6">
<figure>
<span class="image fit">
<img src="images/Microsoft Corporation_200ma_pnl3.png" alt="" />
</span>
</figure>
</div>
</div>
</div>
<p>If this piques your interest, and you want to try it out with other stocks as well, you can always just use this code and replace the variable called “Ticker” with another stock. The code always update you with the up-to-date prices from Yahoo Finance. Also, if you are interested in the results for a different SMA window than 200 days, you can always just use this code and replace the variable called “ma_window” with another range.</p>
<p>To this end, this backtest framework can be used for testing other trading strategies, or even training AI models on it in the future. It again shows we become much more resourceful to solve real life problem with the help of Python programming.</p>
<p>Check my code in GitHub:</p>
<a href="https://github.com/theo-xiao-sg/investment_python" target="_blank" class="button">Source code</a>
<p> </p>
<p>Or you can find the main code here below:</p>
<!-- Preformatted Code -->
<link rel="stylesheet" href="styles.css">
<pre><code class="highlight"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">yfinance</span> <span class="k">as</span> <span class="nn">yf</span>
<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="sd">"""</span>
<span class="sd"># retrieve historical data from Yahoo Finance</span>
<span class="sd">"""</span>
<span class="c1"># Define a start date and End Date to retrieve the historical data from Yahoo Finance</span>
<span class="n">start</span> <span class="o">=</span> <span class="s1">'2010-01-01'</span>
<span class="c1">#setting today date as End Date</span>
<span class="n">end</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">today</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Y-%m-</span><span class="si">%d</span><span class="s1">'</span><span class="p">)</span>
<span class="c1"># Define the ticker symbol for the NASDAQ 100 index or the tech stocks</span>
<span class="c1"># ticker = '^NDX'</span>
<span class="c1"># ticker = 'TSLA'</span>
<span class="c1"># ticker = 'MSFT'</span>
<span class="n">ticker</span> <span class="o">=</span> <span class="s1">'AAPL'</span>
<span class="c1"># ticker = 'AMZN'</span>
<span class="c1"># ticker = 'GOOG'</span>
<span class="c1"># ticker = '0700.HK'</span>
<span class="c1"># ticker = 'NFLX'</span>
<span class="c1"># Create a Ticker object for the desired ticker symbol</span>
<span class="n">ticker_y</span> <span class="o">=</span> <span class="n">yf</span><span class="o">.</span><span class="n">Ticker</span><span class="p">(</span><span class="n">ticker</span><span class="p">)</span>
<span class="c1"># Get the short name of the ticker</span>
<span class="n">company_name</span> <span class="o">=</span> <span class="n">ticker_y</span><span class="o">.</span><span class="n">info</span><span class="p">[</span><span class="s2">"shortName"</span><span class="p">]</span>
<span class="c1"># Download historical data for the NASDAQ 100 index from Yahoo Finance</span>
<span class="n">download_data</span> <span class="o">=</span> <span class="n">yf</span><span class="o">.</span><span class="n">download</span><span class="p">(</span><span class="n">ticker</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="n">end</span><span class="p">)</span>
<span class="sd">"""</span>
<span class="sd"># calculate moving average and daily returns</span>
<span class="sd">"""</span>
<span class="n">stock_data</span> <span class="o">=</span> <span class="n">download_data</span><span class="p">[[</span><span class="s1">'Close'</span><span class="p">]]</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="c1"># rename column name to 'price'</span>
<span class="n">stock_data</span><span class="o">.</span><span class="n">rename</span><span class="p">(</span><span class="n">columns</span><span class="o">=</span><span class="p">{</span><span class="s1">'Close'</span><span class="p">:</span> <span class="s1">'price'</span><span class="p">},</span> <span class="n">inplace</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="c1"># Calculate the 200-day moving average</span>
<span class="n">ma_window</span> <span class="o">=</span> <span class="mi">200</span>
<span class="n">stock_data</span><span class="p">[</span><span class="s1">'moving_average'</span><span class="p">]</span> <span class="o">=</span> <span class="n">stock_data</span><span class="p">[</span><span class="s1">'price'</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="n">ma_window</span><span class="p">)</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span>
<span class="c1"># Calculate the daily returns</span>
<span class="n">stock_data</span><span class="p">[</span><span class="s1">'daily_return'</span><span class="p">]</span> <span class="o">=</span> <span class="n">stock_data</span><span class="p">[</span><span class="s1">'price'</span><span class="p">]</span><span class="o">.</span><span class="n">pct_change</span><span class="p">()</span>
<span class="n">stock_data</span><span class="p">[</span><span class="s1">'daily_return'</span><span class="p">]</span> <span class="o">=</span> <span class="n">stock_data</span><span class="p">[</span><span class="s1">'daily_return'</span><span class="p">]</span><span class="o">.</span><span class="n">fillna</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="sd">"""</span>
<span class="sd"># calculate the trading signal</span>
<span class="sd">"""</span>
<span class="c1"># Create a new column to store the trading signal</span>
<span class="n">stock_data</span><span class="p">[</span><span class="s1">'signal'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
<span class="c1"># Apply the trading signal logic based on 200d MA</span>
<span class="n">stock_data</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">stock_data</span><span class="p">[</span><span class="s1">'price'</span><span class="p">]</span> <span class="o">>=</span> <span class="n">stock_data</span><span class="p">[</span><span class="s1">'moving_average'</span><span class="p">],</span> <span class="s1">'signal'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
<span class="c1"># Calculate the daily returns based on the trading signal</span>
<span class="n">stock_data</span><span class="p">[</span><span class="s1">'signal_return'</span><span class="p">]</span> <span class="o">=</span> <span class="n">stock_data</span><span class="p">[</span><span class="s1">'daily_return'</span><span class="p">]</span> <span class="o">*</span> <span class="n">stock_data</span><span class="p">[</span><span class="s1">'signal'</span><span class="p">]</span><span class="o">.</span><span class="n">shift</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">stock_data</span><span class="p">[</span><span class="s1">'fake_signal_return'</span><span class="p">]</span> <span class="o">=</span> <span class="n">stock_data</span><span class="p">[</span><span class="s1">'daily_return'</span><span class="p">]</span> <span class="o">*</span> <span class="n">stock_data</span><span class="p">[</span><span class="s1">'signal'</span><span class="p">]</span><span class="o">.</span><span class="n">shift</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="c1"># slice the data to plot pnl from 2020-01-01 to today</span>
<span class="n">stock_data_slice</span> <span class="o">=</span> <span class="n">stock_data</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="s1">'2020-01-01'</span><span class="p">:]</span>
<span class="c1"># Calculate the cumulative returns</span>
<span class="n">stock_data_slice</span><span class="p">[</span><span class="s1">'cumulative_signal_return'</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">+</span> <span class="n">stock_data_slice</span><span class="p">[</span><span class="s1">'signal_return'</span><span class="p">])</span><span class="o">.</span><span class="n">cumprod</span><span class="p">()</span>
<span class="n">stock_data_slice</span><span class="p">[</span><span class="s1">'fake_cumulative_signal_return'</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">+</span> <span class="n">stock_data_slice</span><span class="p">[</span><span class="s1">'fake_signal_return'</span><span class="p">])</span><span class="o">.</span><span class="n">cumprod</span><span class="p">()</span>
<span class="c1"># Calculate the PnL for the MA strategy, assuming we invest $100</span>
<span class="n">stock_data_slice</span><span class="p">[</span><span class="s1">'MA_PnL'</span><span class="p">]</span> <span class="o">=</span> <span class="n">stock_data_slice</span><span class="p">[</span><span class="s1">'cumulative_signal_return'</span><span class="p">]</span> <span class="o">*</span> <span class="mi">100</span>
<span class="n">stock_data_slice</span><span class="p">[</span><span class="s1">'fake_MA_PnL'</span><span class="p">]</span> <span class="o">=</span> <span class="n">stock_data_slice</span><span class="p">[</span><span class="s1">'fake_cumulative_signal_return'</span><span class="p">]</span> <span class="o">*</span> <span class="mi">100</span>
<span class="c1"># Calculate the PnL for Buy and Hold investment strategy, assuming we invest $100</span>
<span class="n">stock_data_slice</span><span class="p">[</span><span class="s1">'cumulative_return'</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">+</span> <span class="n">stock_data_slice</span><span class="p">[</span><span class="s1">'daily_return'</span><span class="p">])</span><span class="o">.</span><span class="n">cumprod</span><span class="p">()</span>
<span class="n">stock_data_slice</span><span class="p">[</span><span class="s1">'Buy_Hold_PnL'</span><span class="p">]</span> <span class="o">=</span> <span class="n">stock_data_slice</span><span class="p">[</span><span class="s1">'cumulative_return'</span><span class="p">]</span> <span class="o">*</span> <span class="mi">100</span>
<span class="sd">"""</span>
<span class="sd"># make plots</span>
<span class="sd">"""</span>
<span class="n">images_folder</span> <span class="o">=</span> <span class="s1">'images'</span>
<span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">images_folder</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="c1"># Plot prices and the moving average</span>
<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">stock_data_slice</span><span class="p">[</span><span class="s1">'price'</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s1">'Price'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">stock_data_slice</span><span class="p">[</span><span class="s1">'moving_average'</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">ma_window</span><span class="p">)</span><span class="o">+</span><span class="s1">'-day Moving Average'</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="n">company_name</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">Prices and '</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">ma_window</span><span class="p">)</span><span class="o">+</span><span class="s1">'-day Moving Average'</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="s1">'Date'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">xticks</span><span class="p">(</span><span class="n">rotation</span><span class="o">=</span><span class="mi">45</span><span class="p">,</span> <span class="n">ha</span><span class="o">=</span><span class="s1">'right'</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="s1">'Price'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">tight_layout</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">grid</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">(</span><span class="n">block</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">savefig</span><span class="p">(</span><span class="sa">r</span><span class="s1">'</span><span class="si">{}</span><span class="s1">\</span><span class="si">{}</span><span class="s1">_</span><span class="si">{}</span><span class="s1">ma.png'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">images_folder</span><span class="p">,</span> <span class="n">company_name</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">ma_window</span><span class="p">)))</span>
<span class="n">plt</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="c1"># Plot the cumulative PnL for both the Buy-Hold and MA strategy</span>
<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">stock_data_slice</span><span class="p">[</span><span class="s1">'Buy_Hold_PnL'</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s1">'Buy_Hold'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">stock_data_slice</span><span class="p">[</span><span class="s1">'fake_MA_PnL'</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s1">'fake_MA'</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="n">company_name</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">Comparison of Buy_Hold vs MA Strategies - Cumulative PnL'</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="s1">'Date'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">xticks</span><span class="p">(</span><span class="n">rotation</span><span class="o">=</span><span class="mi">45</span><span class="p">,</span> <span class="n">ha</span><span class="o">=</span><span class="s1">'right'</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="s1">'PnL ($)'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">tight_layout</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">grid</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">(</span><span class="n">block</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">savefig</span><span class="p">(</span><span class="sa">r</span><span class="s1">'</span><span class="si">{}</span><span class="s1">\</span><span class="si">{}</span><span class="s1">_</span><span class="si">{}</span><span class="s1">ma_pnl1.png'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">images_folder</span><span class="p">,</span> <span class="n">company_name</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">ma_window</span><span class="p">)))</span>
<span class="n">plt</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="c1"># Plot the cumulative PnL for both the Buy-Hold and MA strategy</span>
<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">stock_data_slice</span><span class="p">[</span><span class="s1">'Buy_Hold_PnL'</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s1">'Buy_Hold'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">stock_data_slice</span><span class="p">[</span><span class="s1">'MA_PnL'</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s1">'MA'</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="n">company_name</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">Comparison of Buy_Hold vs MA Strategies - Cumulative PnL'</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="s1">'Date'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">xticks</span><span class="p">(</span><span class="n">rotation</span><span class="o">=</span><span class="mi">45</span><span class="p">,</span> <span class="n">ha</span><span class="o">=</span><span class="s1">'right'</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="s1">'PnL ($)'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">tight_layout</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">grid</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">(</span><span class="n">block</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">savefig</span><span class="p">(</span><span class="sa">r</span><span class="s1">'</span><span class="si">{}</span><span class="s1">\</span><span class="si">{}</span><span class="s1">_</span><span class="si">{}</span><span class="s1">ma_pnl2.png'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">images_folder</span><span class="p">,</span> <span class="n">company_name</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">ma_window</span><span class="p">)))</span>
<span class="n">plt</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="c1"># Plot the cumulative PnL for both the Buy-Hold and MA strategy</span>
<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">stock_data_slice</span><span class="p">[</span><span class="s1">'Buy_Hold_PnL'</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s1">'Buy_Hold'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">stock_data_slice</span><span class="p">[</span><span class="s1">'MA_PnL'</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s1">'MA'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">stock_data_slice</span><span class="p">[</span><span class="s1">'fake_MA_PnL'</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="s1">'fake_MA'</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="n">company_name</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">Comparison of Buy_Hold vs MA Strategies - Cumulative PnL'</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="s1">'Date'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">xticks</span><span class="p">(</span><span class="n">rotation</span><span class="o">=</span><span class="mi">45</span><span class="p">,</span> <span class="n">ha</span><span class="o">=</span><span class="s1">'right'</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="s1">'PnL ($)'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">tight_layout</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">grid</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">(</span><span class="n">block</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">savefig</span><span class="p">(</span><span class="sa">r</span><span class="s1">'</span><span class="si">{}</span><span class="s1">\</span><span class="si">{}</span><span class="s1">_</span><span class="si">{}</span><span class="s1">ma_pnl3.png'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">images_folder</span><span class="p">,</span> <span class="n">company_name</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">ma_window</span><span class="p">)))</span>
<span class="n">plt</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Done'</span><span class="p">)</span></pre></div></code></pre>
</section>
</div>
<!-- Scripts -->
<script src="assets/js/jquery.min.js"></script>
<script src="assets/js/jquery.scrollex.min.js"></script>
<script src="assets/js/jquery.scrolly.min.js"></script>
<script src="assets/js/browser.min.js"></script>
<script src="assets/js/breakpoints.min.js"></script>
<script src="assets/js/util.js"></script>
<script src="assets/js/main.js"></script>
</body>
</html>