The Nasdaq to S&P 500 Ratio measures the relative difference in valuation between the tech stocks represented in the Nasdaq 100 and a basket of broader industry stocks from the S&P 500. This metric peaked at the height of the tech bubble.
Stock indices hold different baskets of underlying companies. The Dow has 30 well-known big company stocks, the S&P 500 has a lot more stocks covering a large portion of the total market, and the Nasdaq has a lot of technology stocks.
Because of the differences in the underlying constituents of each stock index, you can create some interesting ratio comparisons by simply dividing one index by another. A great example takes the Nasdaq divided by the S&P 500:
The way to understand this series is that changes in the ratio over time are driven by different performances between the indices. When this series rises, it means that investments in the Nasdaq outperform the S&P 500. Since the ratio has generally risen over time, it shows that tech has made larger gains than the broader market.
The large deviation represented by the spike was caused by the tech bubble. At that time, the value of tech stocks skyrocketed beyond the overall market.
So, what do we make then of the current rise? It hasn’t been a sharp spike like the tech bubble but since the Financial Crisis the climb has been relentless. Most recently, it actually did spike, as the coronavirus benefited the large tech companies in terms of stock performance.
While tech companies have make amazing products and provide awesome services, it does seem surprising that tech could outperform everything else by that much. This is even crazier when you realize the S&P 500 has a lot of tech companies in the index as well.
Ultimately, for this trend to reverse, we’ll have to see huge underperformance of the large tech companies. That’s, honestly, not a bet I’m willing to put money on right now.
// set the dimensions and margins of the graph var margin = {top: 20, right: 20, bottom: 30, left: 40}, width = 960 - margin.left - margin.right, height = 500 - margin.top - margin.bottom;
// set the ranges var x = d3.scaleBand() .range([0, width]) .padding(0.1); var y = d3.scaleLinear() .range([height, 0]);
// append the svg object to the body of the page // append a 'group' element to 'svg' // moves the 'group' element to the top left margin var svg = d3.select("body").append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
// get the data d3.csv("sales.csv", function(error, data) { if (error) throw error;
// format the data data.forEach(function(d) { d.sales = +d.sales; });
// Scale the range of the data in the domains x.domain(data.map(function(d) { return d.salesperson; })); y.domain([0, d3.max(data, function(d) { return d.sales; })]);
// append the rectangles for the bar chart svg.selectAll(".bar") .data(data) .enter().append("rect") .attr("class", "bar") .attr("x", function(d) { return x(d.salesperson); }) .attr("width", x.bandwidth()) .attr("y", function(d) { return y(d.sales); }) .attr("height", function(d) { return height - y(d.sales); });
// add the x Axis svg.append("g") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(x));
// add the y Axis svg.append("g") .call(d3.axisLeft(y));
});