Free AI web copilot to create summaries, insights and extended knowledge, download it at here
20150
Abstract
_">get_historical_data</span>(<span class="hljs-params">symbol, start_date</span>):
api_key = <span class="hljs-string">'your_api_key'</span>
api_url = <span class="hljs-string">f'https://api.twelvedata.com/time_series?symbol=<span class="hljs-subst">{symbol}</span>&interval=1day&outputsize=5000&apikey=<span class="hljs-subst">{api_key}</span>'</span>
raw_df = requests.get(api_url).json()
df = pd.DataFrame(raw_df[<span class="hljs-string">'values'</span>]).iloc[::-<span class="hljs-number">1</span>].set_index(<span class="hljs-string">'datetime'</span>).astype(<span class="hljs-built_in">float</span>)
df = df[df.index >= start_date]
df.index = pd.to_datetime(df.index)
<span class="hljs-keyword">return</span> df
aapl = get_historical_data(<span class="hljs-string">'NVDA'</span>, <span class="hljs-string">'2023-01-03'</span>)
aapl.tail()</pre></div><figure id="6e4f"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*AP4fBcG2oCE9t_cj6R9Ovg.jpeg"><figcaption></figcaption></figure><ul><li>Plotting the NVDA stock price data</li></ul><div id="4a33"><pre>plt.plot(aapl.index, aapl[<span class="hljs-string">'close'</span>])
plt.xlabel(<span class="hljs-string">'Date'</span>)
plt.ylabel(<span class="hljs-string">'Closing Prices'</span>)
plt.title(<span class="hljs-string">'Stock Prices'</span>)
plt.show()</pre></div><figure id="114a"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*8v7aMX2I-Wz6uovs7e9syg.jpeg"><figcaption>1Y NVDA stock price data</figcaption></figure><ul><li>Plotting SMA20 vs stock price</li></ul><div id="b006"><pre><span class="hljs-keyword">def</span> <span class="hljs-title function_">sma</span>(<span class="hljs-params">data, window</span>):
sma = data.rolling(window = window).mean()
<span class="hljs-keyword">return</span> sma
aapl[<span class="hljs-string">'sma_20'</span>] = sma(aapl[<span class="hljs-string">'close'</span>], <span class="hljs-number">20</span>)
aapl.tail(<span class="hljs-number">3</span>)
aapl[<span class="hljs-string">'close'</span>].plot(label = <span class="hljs-string">'CLOSE'</span>, alpha = <span class="hljs-number">0.6</span>)
aapl[<span class="hljs-string">'sma_20'</span>].plot(label = <span class="hljs-string">'SMA 20'</span>, linewidth = <span class="hljs-number">2</span>)
plt.xlabel(<span class="hljs-string">'Date'</span>)
plt.ylabel(<span class="hljs-string">'Closing Prices'</span>)
plt.legend(loc = <span class="hljs-string">'upper left'</span>)
plt.show()</pre></div><figure id="1a2f"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*HONQCHNufaWr2N7rSl233w.jpeg"><figcaption>NVDA stock price vs SMA20</figcaption></figure><ul><li>As we can see, SMA helps level price action by filtering out the noise from random price fluctuations.</li><li>SMA values below the current price indicate support levels, as shown above.</li><li>Plotting BB20 vs stock price</li></ul><div id="21ac"><pre><span class="hljs-keyword">def</span> <span class="hljs-title function_">bb</span>(<span class="hljs-params">data, sma, window</span>):
std = data.rolling(window = window).std()
upper_bb = sma + std * <span class="hljs-number">2</span>
lower_bb = sma - std * <span class="hljs-number">2</span>
<span class="hljs-keyword">return</span> upper_bb, lower_bb
aapl[<span class="hljs-string">'upper_bb'</span>], aapl[<span class="hljs-string">'lower_bb'</span>] = bb(aapl[<span class="hljs-string">'close'</span>], aapl[<span class="hljs-string">'sma_20'</span>], <span class="hljs-number">20</span>)
aapl.tail()
aapl[<span class="hljs-string">'close'</span>].plot(label = <span class="hljs-string">'CLOSE PRICES'</span>, color = <span class="hljs-string">'skyblue'</span>)
aapl[<span class="hljs-string">'upper_bb'</span>].plot(label = <span class="hljs-string">'UPPER BB 20'</span>, linestyle = <span class="hljs-string">'--'</span>, linewidth = <span class="hljs-number">1</span>, color = <span class="hljs-string">'black'</span>)
aapl[<span class="hljs-string">'sma_20'</span>].plot(label = <span class="hljs-string">'MIDDLE BB 20'</span>, linestyle = <span class="hljs-string">'--'</span>, linewidth = <span class="hljs-number">1.2</span>, color = <span class="hljs-string">'grey'</span>)
aapl[<span class="hljs-string">'lower_bb'</span>].plot(label = <span class="hljs-string">'LOWER BB 20'</span>, linestyle = <span class="hljs-string">'--'</span>, linewidth = <span class="hljs-number">1</span>, color = <span class="hljs-string">'black'</span>)
plt.legend(loc = <span class="hljs-string">'upper left'</span>)
plt.title(<span class="hljs-string">'BOLLINGER BANDS'</span>)
plt.show()</pre></div><figure id="74ca"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*BGdiFtqU95jzQWbPsoaQ0w.jpeg"><figcaption>NVDA Bollinger Bands vs Stock Price</figcaption></figure><ul><li>BB help determine whether prices are high or low on a relative basis. They are used in pairs, both upper and lower bands and in conjunction with SMA.</li><li><a href="https://www.schwab.com/learn/story/bollinger-bands-what-they-are-and-how-to-use-them">Bollinger Bands</a> can also indicate the end of a strong trend. Strong trends, especially those developing after a breakout of a trading range, will result in an expansion in volatility that will cause the bands to initially move apart.</li><li>Calculating and plotting the NVDA BB strategy trading signals</li></ul><div id="0da1"><pre><span class="hljs-keyword">def</span> <span class="hljs-title function_">implement_bb_strategy</span>(<span class="hljs-params">data, lower_bb, upper_bb</span>):
buy_price = []
sell_price = []
bb_signal = []
signal = <span class="hljs-number">0</span>
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">len</span>(data)):
<span class="hljs-keyword">if</span> data[i-<span class="hljs-number">1</span>] > lower_bb[i-<span class="hljs-number">1</span>] <span class="hljs-keyword">and</span> data[i] < lower_bb[i]:
<span class="hljs-keyword">if</span> signal != <span class="hljs-number">1</span>:
buy_price.append(data[i])
sell_price.append(np.nan)
signal = <span class="hljs-number">1</span>
bb_signal.append(signal)
<span class="hljs-keyword">else</span>:
buy_price.append(np.nan)
sell_price.append(np.nan)
bb_signal.append(<span class="hljs-number">0</span>)
<span class="hljs-keyword">elif</span> data[i-<span class="hljs-number">1</span>] < upper_bb[i-<span class="hljs-number">1</span>] <span class="hljs-keyword">and</span> data[i] > upper_bb[i]:
<span class="hljs-keyword">if</span> signal != -<span class="hljs-number">1</span>:
buy_price.append(np.nan)
sell_price.append(data[i])
signal = -<span class="hljs-number">1</span>
bb_signal.append(signal)
<span class="hljs-keyword">else</span>:
buy_price.append(np.nan)
sell_price.append(np.nan)
bb_signal.append(<span class="hljs-number">0</span>)
<span class="hljs-keyword">else</span>:
buy_price.append(np.nan)
sell_price.append(np.nan)
bb_signal.append(<span class="hljs-number">0</span>)
<span class="hljs-keyword">return</span> buy_price, sell_price, bb_signal
buy_price, sell_price, bb_signal = implement_bb_strategy(aapl[<span class="hljs-string">'close'</span>], aapl[<span class="hljs-string">'lower_bb'</span>], aapl[<span class="hljs-string">'upper_bb'</span>])
aapl[<span class="hljs-string">'close'</span>].plot(label = <span class="hljs-string">'CLOSE PRICES'</span>, alpha = <span class="hljs-number">0.3</span>)
aapl[<span class="hljs-string">'upper_bb'</span>].plot(label = <span class="hljs-string">'UPPER BB'</span>, linestyle = <span class="hljs-string">'--'</span>, linewidth = <span class="hljs-number">1</span>, color = <span class="hljs-string">'black'</span>)
aapl[<span class="hljs-string">'sma_20'</span>].plot(label = <span class="hljs-string">'MIDDLE BB'</span>, linestyle = <span class="hljs-string">'--'</span>, linewidth = <span class="hljs-number">1.2</span>, color = <span class="hljs-string">'grey'</span>)
aapl[<span class="hljs-string">'lower_bb'</span>].plot(label = <span class="hljs-string">'LOWER BB'</span>, linestyle = <span class="hljs-string">'--'</span>, linewidth = <span class="hljs-number">1</span>, color = <span class="hljs-string">'black'</span>)
plt.scatter(aapl.index, buy_price, marker = <span class="hljs-string">'^'</span>, color = <span class="hljs-string">'green'</span>, label = <span class="hljs-string">'BUY'</span>, s = <span class="hljs-number">200</span>)
plt.scatter(aapl.index, sell_price, marker = <span class="hljs-string">'v'</span>, color = <span class="hljs-string">'red'</span>, label = <span class="hljs-string">'SELL'</span>, s = <span class="hljs-number">200</span>)
plt.title(<span class="hljs-string">'BB STRATEGY TRADING SIGNALS'</span>)
plt.legend(loc = <span class="hljs-string">'upper left'</span>)
plt.show()</pre></div><figure id="8aaa"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*9fYT44XI7WgaWlVK9cNLkw.jpeg"><figcaption>NVDA BB strategy trading signals</figcaption></figure><ul><li>Calculating and plotting the NVDA BB strategy daily returns</li></ul><div id="1bcd"><pre>position = []
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">len</span>(bb_signal)):
<span class="hljs-keyword">if</span> bb_signal[i] > <span class="hljs-number">1</span>:
position.append(<span class="hljs-number">0</span>)
<span class="hljs-keyword">else</span>:
position.append(<span class="hljs-number">1</span>)
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">len</span>(aapl[<span class="hljs-string">'close'</span>])):
<span class="hljs-keyword">if</span> bb_signal[i] == <span class="hljs-number">1</span>:
position[i] = <span class="hljs-number">1</span>
<span class="hljs-keyword">elif</span> bb_signal[i] == -<span class="hljs-number">1</span>:
position[i] = <span class="hljs-number">0</span>
<span class="hljs-keyword">else</span>:
position[i] = position[i-<span class="hljs-number">1</span>]
upper_bb = aapl[<span class="hljs-string">'upper_bb'</span>]
lower_bb = aapl[<span class="hljs-string">'lower_bb'</span>]
close_price = aapl[<span class="hljs-string">'close'</span>]
bb_signal = pd.DataFrame(bb_signal).rename(columns = {<span class="hljs-number">0</span>:<span class="hljs-string">'bb_signal'</span>}).set_index(aapl.index)
position = pd.DataFrame(position).rename(columns = {<span class="hljs-number">0</span>:<span class="hljs-string">'bb_position'</span>}).set_index(aapl.index)
frames = [close_price, upper_bb, lower_bb, bb_signal, position]
strategy = pd.concat(frames, join = <span class="hljs-string">'inner'</span>, axis = <span class="hljs-number">1</span>)
<span class="hljs-comment">#strategy.tail(10)</span>
rets = aapl.close.pct_change().dropna()
strat_rets = strategy.bb_position[<span class="hljs-number">1</span>:]*rets
plt.title(<span class="hljs-string">'Daily Returns'</span>)
rets.plot(color = <span class="hljs-string">'blue'</span>, alpha = <span class="hljs-number">0.3</span>, linewidth = <span class="hljs-number">7</span>)
strat_rets.plot(color = <span class="hljs-string">'r'</span>, linewidth = <span class="hljs-number">1</span>)
plt.show()</pre></div><figure id="7ca1"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*ZFNLE4wHpJwkiYsmMy8NJA.jpeg"><figcaption>NVDA BB strategy daily returns</figcaption></figure><ul><li>Calculating and plotting the Keltner Channel (<a href="https://github.com/Nikhil-Adithyan/Algorithmic-Trading-with-Python/blob/main/Volatility/Keltner_Channel.py">KC20</a>)</li></ul><div id="98f4"><pre><span class="hljs-keyword">def</span> <span class="hljs-title function_">get_kc</span>(<span class="hljs-params">high, low, close, kc_lookback, multiplier, atr_lookback</span>):
tr1 = pd.DataFrame(high - low)
tr2 = pd.DataFrame(<span class="hljs-built_in">abs</span>(high - close.shift()))
tr3 = pd.DataFrame(<span class="hljs-built_in">abs</span>(low - close.shift()))
frames = [tr1, tr2, tr3]
tr = pd.concat(frames, axis = <span class="hljs-number">1</span>, join = <span class="hljs-string">'inner'</span>).<span class="hljs-built_in">max</span>(axis = <span class="hljs-number">1</span>)
atr = tr.ewm(alpha = <span class="hljs-number">1</span>/atr_lookback).mean()
kc_middle = close.ewm(kc_lookback).mean()
kc_upper = close.ewm(kc_lookback).mean() + multiplier * atr
kc_lower = close.ewm(kc_lookback).mean() - multiplier * atr
<span class="hljs-keyword">return</span> kc_middle, kc_upper, kc_lower
aapl = aapl.iloc[:,:<span class="hljs-number">4</span>]
aapl[<span class="hljs-string">'kc_middle'</span>], aapl[<span class="hljs-string">'kc_upper'</span>], aapl[<span class="hljs-string">'kc_lower'</span>] = get_kc(aapl[<span class="hljs-string">'high'</span>], aapl[<span class="hljs-string">'low'</span>], aapl[<span class="hljs-string">'close'</span>], <span class="hljs-number">20</span>, <span class="hljs-number">2</span>, <span class="hljs-number">10</span>)
<span class="hljs-comment">#aapl.tail()</span>
<span class="hljs-comment"># KELTNER CHANNEL PLOT</span>
plt.plot(aapl[<span class="hljs-string">'close'</span>], linewidth = <span class="hljs-number">2</span>, label = <span class="hljs-string">'NVDA'</span>)
plt.plot(aapl[<span class="hljs-string">'kc_upper'</span>], linewidth = <span class="hljs-number">2</span>, color = <span class="hljs-string">'orange'</span>, linestyle = <span class="hljs-string">'--'</span>, label = <span class="hljs-string">'KC UPPER 20'</span>)
plt.plot(aapl[<span class="hljs-string">'kc_middle'</span>], linewidth = <span class="hljs-number">1.5</span>, color = <span class="hljs-string">'grey'</span>, label = <span class="hljs-string">'KC MIDDLE 20'</span>)
plt.plot(aapl[<span class="hljs-string">'kc_lower'</span>], linewidth = <span class="hljs-number">2</span>, color = <span class="hljs-string">'orange'</span>, linestyle = <span class="hljs-string">'--'</span>, label = <span class="hljs-string">'KC LOWER 20'</span>)
plt.legend(loc = <span class="hljs-string">'lower right'</span>, fontsize = <span class="hljs-number">15</span>)
plt.title(<span class="hljs-string">'KELTNER CHANNEL 20'</span>)
plt.show()</pre></div><figure id="997c"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*oUEVYFw4F-e5rsGOkD16Xw.jpeg"><figcaption>NVDA Keltner Channel 20 vs stock price</figcaption></figure><ul><li>Performing <a href="https://github.com/Nikhil-Adithyan/Algorithmic-Trading-with-Python/blob/main/Volatility/Bollinger_Bands.py">backtesting</a> of the BB trading strategy by investing $10k</li></ul><div id="5b95"><pre><span class="hljs-keyword">import</span> math
aapl_ret = pd.DataFrame(np.diff(aapl[<span class="hljs-string">'close'</span>])).rename(columns = {<span class="hljs-number">0</span>:<span class="hljs-string">'returns'</span>})
tsi_strategy_ret = []
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">len</span>(aapl_ret)):
returns = aapl_ret[<span class="hljs-string">'returns'</span>][i]*strategy[<span class="hljs-string">'bb_position'</span>][i]
tsi_strategy_ret.append(returns)
tsi_strategy_ret_df = pd.DataFrame(tsi_strategy_ret).rename(columns = {<span class="hljs-number">0</span>:<span class="hljs-string">'bb_returns'</span>})
investment_value = <span class="hljs-number">10000</span>
number_of_stocks = math.floor(investment_value/aapl[<span class="hljs-string">'close'</span>][<span class="hljs-number">0</span>])
tsi_investment_ret = []
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">len</span>(tsi_strategy_ret_df[<span class="hljs-string">'bb_returns'</span>])):
returns = number_of_stocks*tsi_strategy_ret_df[<span class="hljs-string">'bb_returns'</span>][i]
tsi_investment_ret.append(returns)
tsi_investment_ret_df = pd.DataFrame(tsi_investment_ret).rename(columns = {<span class="hljs-number">0</span>:<span class="hljs-string">'investment_returns'</span>})
total_investment_ret = <span class="hljs-built_in">round</span>(<span class="hljs-built_in">sum</span>(tsi_investment_ret_df[<span class="hljs-string">'investment_returns'</span>]), <span class="hljs-number">2</span>)
profit_percentage = math.floor((total_investment_ret/investment_value)*<span class="hljs-number">100</span>)
<span class="hljs-built_in">print</span>(cl(<span class="hljs-string">'Profit gained from the BB strategy by investing $10k : {}'</span>.<span class="hljs-built_in">format</span>(total_investment_ret), attrs = [<span class="hljs-string">'bold'</span>]))
<span class="hljs-built_in">print</span>(cl(<span class="hljs-string">'Profit percentage of the BB strategy : {}%'</span>.<span class="hljs-built_in">format</span>(profit_percentage), attrs = [<span class="hljs-string">'bold'</span>]))
Profit gained <span class="hljs-keyword">from</span> the BB strategy by investing 10k : <span class="hljs-number">19797.48</span>
Profit percentage of the BB strategy : <span class="hljs-number">197</span>%</pre></div><ul><li>Comparing the BB strategy against the <a href="https://github.com/Nikhil-Adithyan/Algorithmic-Trading-with-Python/blob/main/Volatility/Bollinger_Bands.py">SPY ETF benchmark</a> by investing 10k</li></ul><div id="93c7"><pre><span class="hljs-keyword">def</span> <span class="hljs-title function_">get_benchmark</span>(<span class="hljs-params">start_date, investment_value</span>):
spy = get_historical_data(<span class="hljs-string">'SPY'</span>, start_date)[<span class="hljs-string">'close'</span>]
benchmark = pd.DataFrame(np.diff(spy)).rename(columns = {<span class="hljs-number">0</span>:<span class="hljs-string">'benchmark_returns'</span>})
investment_value = investment_value
number_of_stocks = math.floor(investment_value/spy[-<span class="hljs-number">1</span>])
benchmark_investment_ret = []
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">len</span>(benchmark[<span class="hljs-string">'benchmark_returns'</span>])):
returns = number_of_stocks*benchmark[<span class="hljs-string">'benchmark_returns'</span>][i]
benchmark_investment_ret.append(returns)
benchmark_investment_ret_df = pd.DataFrame(benchmark_investment_ret).rename(columns = {<span class="hljs-number">0</span>:<span class="hljs-string">'investment_returns'</span>})
<span class="hljs-keyword">return</span> benchmark_investment_ret_df
benchmark = get_benchmark(<span class="hljs-string">'2023-01-03'</span>, <span class="hljs-number">10000</span>)
investment_value = <span class="hljs-number">10000</span>
total_benchmark_investment_ret = <span class="hljs-built_in">round</span>(<span class="hljs-built_in">sum</span>(benchmark[<span class="hljs-string">'investment_returns'</span>]), <span class="hljs-number">2</span>)
benchmark_profit_percentage = math.floor((total_benchmark_investment_ret/investment_value)*<span class="hljs-number">100</span>)
<span class="hljs-built_in">print</span>(cl(<span class="hljs-string">'Benchmark profit by investing $10k : {}'</span>.<span class="hljs-built_in">format</span>(total_benchmark_investment_ret), attrs = [<span class="hljs-string">'bold'</span>]))
<span class="hljs-built_in">print</span>(cl(<span class="hljs-string">'Benchmark P
Options
rofit percentage : {}%'</span>.<span class="hljs-built_in">format</span>(benchmark_profit_percentage), attrs = [<span class="hljs-string">'bold'</span>]))
<span class="hljs-built_in">print</span>(cl(<span class="hljs-string">'BB Strategy profit is {}% higher than the Benchmark Profit'</span>.<span class="hljs-built_in">format</span>(profit_percentage - benchmark_profit_percentage), attrs = [<span class="hljs-string">'bold'</span>]))
Benchmark profit by investing $10k : <span class="hljs-number">2562.91</span>
Benchmark Profit percentage : <span class="hljs-number">25</span>%
BB Strategy profit <span class="hljs-keyword">is</span> <span class="hljs-number">172</span>% higher than the Benchmark Profit</pre></div><ul><li>Backtesting can provide valuable insights into NVDA historical performance, but it does not guarantee future success. It’s important to combine backtesting with other forms of risk assessment to make well-informed trading decisions.</li><li>Let’s examine the <a href="https://readmedium.com/algorithmic-trading-with-the-aroon-indicator-in-python-3d2277d2f664">Aroon trading strategy</a> that is used to identify <a href="https://www.investopedia.com/terms/a/aroon.asp">trend</a> changes in the price of an asset, as well as the strength of that trend.</li><li>If the Aroon-Up crosses above the Aroon-Down, then a new uptrend may start soon. Conversely, if Aroon-Down crosses above the Aroon-Up, then a new downtrend may start soon. When Aroon-Up reaches 100, a new uptrend may have begun.</li></ul><div id="c4ff"><pre><span class="hljs-keyword">import</span> pandas <span class="hljs-keyword">as</span> pd
<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np
<span class="hljs-keyword">import</span> requests
<span class="hljs-keyword">import</span> matplotlib.pyplot <span class="hljs-keyword">as</span> plt
<span class="hljs-keyword">from</span> math <span class="hljs-keyword">import</span> floor
<span class="hljs-keyword">from</span> termcolor <span class="hljs-keyword">import</span> colored <span class="hljs-keyword">as</span> cl
plt.style.use(<span class="hljs-string">'fivethirtyeight'</span>)
plt.rcParams[<span class="hljs-string">'figure.figsize'</span>] = (<span class="hljs-number">20</span>, <span class="hljs-number">10</span>)
myticker=<span class="hljs-string">'NVDA'</span>
mydate=<span class="hljs-string">'2023-1-1'</span>
myamount=<span class="hljs-number">10000</span>
mywin=<span class="hljs-number">25</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_historical_data</span>(<span class="hljs-params">symbol, start_date</span>):
api_key = <span class="hljs-string">'your_api_key'</span>
api_url = <span class="hljs-string">f'https://api.twelvedata.com/time_series?symbol=<span class="hljs-subst">{symbol}</span>&interval=1day&outputsize=5000&apikey=<span class="hljs-subst">{api_key}</span>'</span>
raw_df = requests.get(api_url).json()
df = pd.DataFrame(raw_df[<span class="hljs-string">'values'</span>]).iloc[::-<span class="hljs-number">1</span>].set_index(<span class="hljs-string">'datetime'</span>).astype(<span class="hljs-built_in">float</span>)
df = df[df.index >= start_date]
df.index = pd.to_datetime(df.index)
<span class="hljs-keyword">return</span> df
tsla = get_historical_data(myticker, mydate)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_aroon</span>(<span class="hljs-params">symbol, lookback, start_date</span>):
api_key = <span class="hljs-string">'your_api_key'</span>
api_url = <span class="hljs-string">f'https://api.twelvedata.com/aroon?symbol=<span class="hljs-subst">{symbol}</span>&interval=1day&time_period=<span class="hljs-subst">{lookback}</span>&outputsize=5000&apikey=<span class="hljs-subst">{api_key}</span>'</span>
raw_df = requests.get(api_url).json()
df = pd.DataFrame(raw_df[<span class="hljs-string">'values'</span>]).iloc[::-<span class="hljs-number">1</span>].set_index(<span class="hljs-string">'datetime'</span>).astype(<span class="hljs-built_in">float</span>)
df = df[df.index >= start_date]
df.index = pd.to_datetime(df.index)
aroon_up = df[<span class="hljs-string">'aroon_up'</span>]
aroon_down = df[<span class="hljs-string">'aroon_down'</span>]
<span class="hljs-keyword">return</span> aroon_up, aroon_down
tsla[<span class="hljs-string">'aroon_up'</span>], tsla[<span class="hljs-string">'aroon_down'</span>] = get_aroon(myticker, <span class="hljs-number">25</span>, mydate)
</pre></div><ul><li>Plotting NVDA Close Price vs Aroon 25</li></ul><div id="f8a1"><pre>ax1 = plt.subplot2grid((<span class="hljs-number">11</span>,<span class="hljs-number">1</span>), (<span class="hljs-number">0</span>,<span class="hljs-number">0</span>), rowspan = <span class="hljs-number">5</span>, colspan = <span class="hljs-number">1</span>)
ax2 = plt.subplot2grid((<span class="hljs-number">11</span>,<span class="hljs-number">1</span>), (<span class="hljs-number">6</span>,<span class="hljs-number">0</span>), rowspan = <span class="hljs-number">4</span>, colspan = <span class="hljs-number">1</span>)
ax1.plot(tsla[<span class="hljs-string">'close'</span>], linewidth = <span class="hljs-number">2.5</span>, color = <span class="hljs-string">'#2196f3'</span>)
ax1.set_title(<span class="hljs-string">'NVDA CLOSE PRICES'</span>)
ax2.plot(tsla[<span class="hljs-string">'aroon_up'</span>], color = <span class="hljs-string">'#26a69a'</span>, linewidth = <span class="hljs-number">2</span>, label = <span class="hljs-string">'AROON UP'</span>)
ax2.plot(tsla[<span class="hljs-string">'aroon_down'</span>], color = <span class="hljs-string">'#ef5350'</span>, linewidth = <span class="hljs-number">2</span>, label = <span class="hljs-string">'AROON DOWN'</span>)
ax2.legend()
ax2.set_title(<span class="hljs-string">'NVDA AROON 25'</span>)
plt.show()</pre></div><figure id="e78d"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*qMpMEuVybxtcnEViv93RZA.jpeg"><figcaption>NVDA Close Price vs Aroon 25</figcaption></figure><ul><li>Implementing the Aroon trading <a href="https://readmedium.com/algorithmic-trading-with-the-aroon-indicator-in-python-3d2277d2f664">strategy</a></li></ul><div id="c3e0"><pre><span class="hljs-keyword">def</span> <span class="hljs-title function_">implement_aroon_strategy</span>(<span class="hljs-params">prices, up, down</span>):
buy_price = []
sell_price = []
aroon_signal = []
signal = <span class="hljs-number">0</span>
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">len</span>(prices)):
<span class="hljs-keyword">if</span> up[i] >= <span class="hljs-number">70</span> <span class="hljs-keyword">and</span> down[i] <= <span class="hljs-number">30</span>:
<span class="hljs-keyword">if</span> signal != <span class="hljs-number">1</span>:
buy_price.append(prices[i])
sell_price.append(np.nan)
signal = <span class="hljs-number">1</span>
aroon_signal.append(signal)
<span class="hljs-keyword">else</span>:
buy_price.append(np.nan)
sell_price.append(np.nan)
aroon_signal.append(<span class="hljs-number">0</span>)
<span class="hljs-keyword">elif</span> up[i] <= <span class="hljs-number">30</span> <span class="hljs-keyword">and</span> down[i] >= <span class="hljs-number">70</span>:
<span class="hljs-keyword">if</span> signal != -<span class="hljs-number">1</span>:
buy_price.append(np.nan)
sell_price.append(prices[i])
signal = -<span class="hljs-number">1</span>
aroon_signal.append(signal)
<span class="hljs-keyword">else</span>:
buy_price.append(np.nan)
sell_price.append(np.nan)
aroon_signal.append(<span class="hljs-number">0</span>)
<span class="hljs-keyword">else</span>:
buy_price.append(np.nan)
sell_price.append(np.nan)
aroon_signal.append(<span class="hljs-number">0</span>)
<span class="hljs-keyword">return</span> buy_price, sell_price, aroon_signal
buy_price, sell_price, aroon_signal = implement_aroon_strategy(tsla[<span class="hljs-string">'close'</span>], tsla[<span class="hljs-string">'aroon_up'</span>], tsla[<span class="hljs-string">'aroon_down'</span>])</pre></div><ul><li>Plotting the NVDA Aroon trading signals</li></ul><div id="ad3c"><pre>ax1 = plt.subplot2grid((<span class="hljs-number">11</span>,<span class="hljs-number">1</span>), (<span class="hljs-number">0</span>,<span class="hljs-number">0</span>), rowspan = <span class="hljs-number">5</span>, colspan = <span class="hljs-number">1</span>)
ax2 = plt.subplot2grid((<span class="hljs-number">11</span>,<span class="hljs-number">1</span>), (<span class="hljs-number">6</span>,<span class="hljs-number">0</span>), rowspan = <span class="hljs-number">4</span>, colspan = <span class="hljs-number">1</span>)
ax1.plot(tsla[<span class="hljs-string">'close'</span>], linewidth = <span class="hljs-number">2.5</span>, color = <span class="hljs-string">'#2196f3'</span>)
ax1.plot(tsla.index, buy_price, marker = <span class="hljs-string">'^'</span>, color = <span class="hljs-string">'#26a69a'</span>, markersize = <span class="hljs-number">12</span>)
ax1.plot(tsla.index, sell_price, marker = <span class="hljs-string">'v'</span>, color = <span class="hljs-string">'#ef5350'</span>, markersize = <span class="hljs-number">12</span>)
ax1.set_title(<span class="hljs-string">'NVDA CLOSE PRICES'</span>)
ax2.plot(tsla[<span class="hljs-string">'aroon_up'</span>], color = <span class="hljs-string">'#26a69a'</span>, linewidth = <span class="hljs-number">2</span>, label = <span class="hljs-string">'AROON UP'</span>)
ax2.plot(tsla[<span class="hljs-string">'aroon_down'</span>], color = <span class="hljs-string">'#ef5350'</span>, linewidth = <span class="hljs-number">2</span>, label = <span class="hljs-string">'AROON DOWN'</span>)
ax2.legend()
ax2.set_title(<span class="hljs-string">'NVDA AROON 25'</span>)
plt.show()</pre></div><figure id="9c50"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*hdCA74p924_LyJiIshYdlQ.jpeg"><figcaption>The NVDA Aroon trading signals</figcaption></figure><ul><li>Performing <a href="https://readmedium.com/algorithmic-trading-with-the-aroon-indicator-in-python-3d2277d2f664">backtesting</a> of these signals by investing $10k</li></ul><div id="d779"><pre>position = []
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">len</span>(aroon_signal)):
<span class="hljs-keyword">if</span> aroon_signal[i] > <span class="hljs-number">1</span>:
position.append(<span class="hljs-number">0</span>)
<span class="hljs-keyword">else</span>:
position.append(<span class="hljs-number">1</span>)
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">len</span>(tsla[<span class="hljs-string">'close'</span>])):
<span class="hljs-keyword">if</span> aroon_signal[i] == <span class="hljs-number">1</span>:
position[i] = <span class="hljs-number">1</span>
<span class="hljs-keyword">elif</span> aroon_signal[i] == -<span class="hljs-number">1</span>:
position[i] = <span class="hljs-number">0</span>
<span class="hljs-keyword">else</span>:
position[i] = position[i-<span class="hljs-number">1</span>]
aroon_up = tsla[<span class="hljs-string">'aroon_up'</span>]
aroon_down = tsla[<span class="hljs-string">'aroon_down'</span>]
close_price = tsla[<span class="hljs-string">'close'</span>]
aroon_signal = pd.DataFrame(aroon_signal).rename(columns = {<span class="hljs-number">0</span>:<span class="hljs-string">'aroon_signal'</span>}).set_index(tsla.index)
position = pd.DataFrame(position).rename(columns = {<span class="hljs-number">0</span>:<span class="hljs-string">'aroon_position'</span>}).set_index(tsla.index)
frames = [close_price, aroon_up, aroon_down, aroon_signal, position]
strategy = pd.concat(frames, join = <span class="hljs-string">'inner'</span>, axis = <span class="hljs-number">1</span>)
tsla_ret = pd.DataFrame(np.diff(tsla[<span class="hljs-string">'close'</span>])).rename(columns = {<span class="hljs-number">0</span>:<span class="hljs-string">'returns'</span>})
aroon_strategy_ret = []
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">len</span>(tsla_ret)):
returns = tsla_ret[<span class="hljs-string">'returns'</span>][i]*strategy[<span class="hljs-string">'aroon_position'</span>][i]
aroon_strategy_ret.append(returns)
aroon_strategy_ret_df = pd.DataFrame(aroon_strategy_ret).rename(columns = {<span class="hljs-number">0</span>:<span class="hljs-string">'aroon_returns'</span>})
investment_value = myamount
number_of_stocks = floor(investment_value/tsla[<span class="hljs-string">'close'</span>][-<span class="hljs-number">1</span>])
aroon_investment_ret = []
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">len</span>(aroon_strategy_ret_df[<span class="hljs-string">'aroon_returns'</span>])):
returns = number_of_stocks*aroon_strategy_ret_df[<span class="hljs-string">'aroon_returns'</span>][i]
aroon_investment_ret.append(returns)
aroon_investment_ret_df = pd.DataFrame(aroon_investment_ret).rename(columns = {<span class="hljs-number">0</span>:<span class="hljs-string">'investment_returns'</span>})
total_investment_ret = <span class="hljs-built_in">round</span>(<span class="hljs-built_in">sum</span>(aroon_investment_ret_df[<span class="hljs-string">'investment_returns'</span>]), <span class="hljs-number">2</span>)
profit_percentage = floor((total_investment_ret/investment_value)*<span class="hljs-number">100</span>)
<span class="hljs-built_in">print</span>(cl(<span class="hljs-string">'Profit gained from the Aroon strategy by investing $10k in NVDA: {}'</span>.<span class="hljs-built_in">format</span>(total_investment_ret), attrs = [<span class="hljs-string">'bold'</span>]))
<span class="hljs-built_in">print</span>(cl(<span class="hljs-string">'Profit percentage of the Aroon strategy : {}%'</span>.<span class="hljs-built_in">format</span>(profit_percentage), attrs = [<span class="hljs-string">'bold'</span>]))
Profit gained <span class="hljs-keyword">from</span> the Aroon strategy by investing 10k <span class="hljs-keyword">in</span> NVDA: <span class="hljs-number">4856.17</span>
Profit percentage of the Aroon strategy : <span class="hljs-number">48</span>%</pre></div><ul><li>Comparing this strategy against the (SPY ETF) <a href="https://readmedium.com/algorithmic-trading-with-the-aroon-indicator-in-python-3d2277d2f664">benchmark profit</a> by investing 10k</li></ul><div id="7d18"><pre><span class="hljs-keyword">def</span> <span class="hljs-title function_">get_benchmark</span>(<span class="hljs-params">start_date, investment_value</span>):
spy = get_historical_data(<span class="hljs-string">'SPY'</span>, start_date)[<span class="hljs-string">'close'</span>]
benchmark = pd.DataFrame(np.diff(spy)).rename(columns = {<span class="hljs-number">0</span>:<span class="hljs-string">'benchmark_returns'</span>})
investment_value = investment_value
number_of_stocks = floor(investment_value/spy[-<span class="hljs-number">1</span>])
benchmark_investment_ret = []
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">len</span>(benchmark[<span class="hljs-string">'benchmark_returns'</span>])):
returns = number_of_stocks*benchmark[<span class="hljs-string">'benchmark_returns'</span>][i]
benchmark_investment_ret.append(returns)
benchmark_investment_ret_df = pd.DataFrame(benchmark_investment_ret).rename(columns = {<span class="hljs-number">0</span>:<span class="hljs-string">'investment_returns'</span>})
<span class="hljs-keyword">return</span> benchmark_investment_ret_df
benchmark = get_benchmark(mydate, myamount)
investment_value = myamount
total_benchmark_investment_ret = <span class="hljs-built_in">round</span>(<span class="hljs-built_in">sum</span>(benchmark[<span class="hljs-string">'investment_returns'</span>]), <span class="hljs-number">2</span>)
benchmark_profit_percentage = floor((total_benchmark_investment_ret/investment_value)*<span class="hljs-number">100</span>)
<span class="hljs-built_in">print</span>(cl(<span class="hljs-string">'Benchmark profit by investing $10k : {}'</span>.<span class="hljs-built_in">format</span>(total_benchmark_investment_ret), attrs = [<span class="hljs-string">'bold'</span>]))
<span class="hljs-built_in">print</span>(cl(<span class="hljs-string">'Benchmark Profit percentage : {}%'</span>.<span class="hljs-built_in">format</span>(benchmark_profit_percentage), attrs = [<span class="hljs-string">'bold'</span>]))
<span class="hljs-built_in">print</span>(cl(<span class="hljs-string">'Aroon Strategy profit is {}% higher than the Benchmark Profit'</span>.<span class="hljs-built_in">format</span>(profit_percentage - benchmark_profit_percentage), attrs = [<span class="hljs-string">'bold'</span>]))
Benchmark profit by investing $10k : <span class="hljs-number">1819.73</span>
Benchmark Profit percentage : <span class="hljs-number">18</span>%
Aroon Strategy profit <span class="hljs-keyword">is</span> <span class="hljs-number">30</span>% higher than the Benchmark Profit</pre></div><h2 id="e205">Summary</h2><ul><li>We have performed fundamental/technical analysis of NVIDIA to determine the real value of NVIDIA within 1 year.</li><li>By analyzing NVIDIA’s financials and various types of growth rates, we have attempted to validate the <a href="https://www.macroaxis.com/valuation/NVDA/NVIDIA">NVIDIA’s intrinsic value</a>.</li><li>We have used a set of Python functions to recognize potential entry and exit points for NVIDIA from various indicators.</li><li>This study will help investors to minimize the risk associated with market volatility and company-specific events by looking at <a href="https://investor.nvidia.com/financial-info/quarterly-results/default.aspx">earnings</a>, fundamental and technical indicators, industry peers as well as independent analyst <a href="https://www.macroaxis.com/technical-analysis/NVDA/NVIDIA">opinions</a>.</li></ul><h2 id="6943">References</h2><ul><li><a href="https://readmedium.com/support-your-algorithmic-trading-with-fundamental-data-e81781b10d9d">Support your algorithmic trading with fundamental data</a></li><li><a href="https://pypi.org/project/fmp-python/">fmp-python 0.1.4</a></li><li><a href="https://github.com/ddalgotrader">ddalgotrader</a>/<a href="https://github.com/ddalgotrader/support_trading_fundamental_data">support_trading_fundamental_data</a></li><li><a href="https://benjaq.medium.com/a-simple-guide-how-to-use-the-financial-modeling-prep-api-in-python-b3e03e742fb8">A simple guide how to use the Financial Modeling Prep API in Python</a></li><li><a href="https://readmedium.com/algorithmic-trading-with-the-keltner-channel-in-python-9c272051d43d">Algorithmic Trading with the Keltner Channel in Python</a></li><li><a href="https://github.com/Nikhil-Adithyan">Nikhil-Adithyan</a>/<a href="https://github.com/Nikhil-Adithyan/Algorithmic-Trading-with-Python">Algorithmic-Trading-with-Python</a></li><li><a href="https://readmedium.com/algorithmic-trading-with-the-aroon-indicator-in-python-3d2277d2f664">Algorithmic Trading with Aroon Indicator in Python</a></li><li><a href="https://www.macroaxis.com/investing/NVDA">Nvidia Stock Technical Analysis</a></li></ul></article></body>