Can someone suggest a more elegant way of doing this?

This question is more of a conceptual question than a coding question.
I’m trying to draw a “tunnel” around the price of a stock (Apple in this example). The upper boundary on any particular day is the highest price achieved in the n days before (20 in the example). The lower boundary is the lowest price. I begin by adding columns to the pandas dataframe for the Highest High (HH) and Lowest Low (LL).

I did manage to code this using scatter3d, but the chart looks awfully “busy”. Comment out line 8 and and the issue becomes even more pronounced.

I also had another go using Surface, with four “walls” around the price. But still, a lot of traces in the chart!

So my question is: is there a more elegant way of visualizing this data? Plotly’s mesh3d perhaps? What would a data scientist have used to?

import plotly.graph_objects as go
import pandas as pd

df = pd.read_csv('')
df["HH"] = df["AAPL.High"].rolling(20).max() #the highest price in the 20 days before each trading day
df["LL"] = df["AAPL.Low"].rolling(20).min()  #the lowest price

df = df.tail(50) #comment out this line and the issue becomes more evident

fig = go.Figure()

#close price as a lines scatter in the middle of the chart
fig.add_scatter3d(x = df.index*0 + len(df)/2, #just so the price centers in mid-chart
                 y = df["Date"],
                 z = df["AAPL.Close"],
                 mode = "lines",
                 line = dict(width = 4),

#for each date, drawing a rectangle around the price showing (HH) and lower boundaries
for i in range(0, len(df)):
    xs = [ 0,                  len(df),            len(df),            0,                  0                  ]
    ys = [ df.iloc[i]['Date'], df.iloc[i]['Date'], df.iloc[i]['Date'], df.iloc[i]['Date'], df.iloc[i]['Date'] ]
    zs = [ df.iloc[i]['LL'],   df.iloc[i]['LL'],   df.iloc[i]['HH'],   df.iloc[i]['HH'],   df.iloc[i]['LL']   ]
    fig.add_scatter3d(x=xs, y=ys, z=zs, mode = "lines", line=dict(color = "red"))

Thanks in advance