html formatter
This commit is contained in:
parent
207c0067b3
commit
bd31897f79
70
scraper.ts
70
scraper.ts
@ -119,6 +119,61 @@ async function throttle<T>(
|
|||||||
await Promise.all(queue);
|
await Promise.all(queue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function buildHtmlTable(
|
||||||
|
results: { ticker: string; model: ReturnType<typeof linearRegression> }[],
|
||||||
|
): string {
|
||||||
|
const rows = results.map(({ ticker, model }) => {
|
||||||
|
const link = `<a href="https://www.tradingview.com/symbols/NASDAQ-${ticker}/?timeframe=6M" target="_blank">${ticker}</a>`;
|
||||||
|
return `
|
||||||
|
<tr>
|
||||||
|
<td>${link}</td>
|
||||||
|
<td class="extra">${model.slope.toFixed(6)}</td>
|
||||||
|
<td class="extra">${model.intercept.toFixed(6)}</td>
|
||||||
|
<td class="extra">${model.r2.toFixed(4)}</td>
|
||||||
|
<td>${(model.growth * 100).toFixed(2)}%</td>
|
||||||
|
</tr>
|
||||||
|
`;
|
||||||
|
}).join("");
|
||||||
|
|
||||||
|
return `
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>S&P 500 Regression Results</title>
|
||||||
|
<style>
|
||||||
|
body { font-family: Arial, sans-serif; padding: 20px; }
|
||||||
|
table { border-collapse: collapse; width: 100%; }
|
||||||
|
th, td { border: 1px solid #ccc; padding: 8px; text-align: left; }
|
||||||
|
th { background: #f4f4f4; }
|
||||||
|
tr:nth-child(even) { background: #fafafa; }
|
||||||
|
.extra{display:none;}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>S&P 500 Regression Results</h1>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th style="width:75px;">Ticker</th>
|
||||||
|
<th class="extra">Slope</th>
|
||||||
|
<th class="extra">Intercept</th>
|
||||||
|
<th class="extra">R²</th>
|
||||||
|
<th>Growth (30d)</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
${rows}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
// Main Dump
|
// Main Dump
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
@ -139,7 +194,7 @@ async function Dump() {
|
|||||||
const tickers = await fetchSP500Tickers();
|
const tickers = await fetchSP500Tickers();
|
||||||
console.log(`${tickers.length} S&P 500 stocks found...`);
|
console.log(`${tickers.length} S&P 500 stocks found...`);
|
||||||
console.log(
|
console.log(
|
||||||
`Finding stocks with slope better than the S&P Index slope (${spx.slope.toFixed(6)})...`,
|
`Finding stocks with growth better than the S&P Index growth (${spx.growth.toFixed(4)})...`,
|
||||||
);
|
);
|
||||||
|
|
||||||
const limit = 5;
|
const limit = 5;
|
||||||
@ -159,16 +214,11 @@ async function Dump() {
|
|||||||
// Sort by growth descending
|
// Sort by growth descending
|
||||||
results.sort((a, b) => b.model.growth - a.model.growth);
|
results.sort((a, b) => b.model.growth - a.model.growth);
|
||||||
|
|
||||||
// Serialize CSV
|
// Build HTML
|
||||||
const rows = ["ticker,slope,intercept,r2,growth"];
|
const html = buildHtmlTable(results);
|
||||||
for (const { ticker, model } of results) {
|
|
||||||
rows.push(
|
|
||||||
`${ticker},${model.growth.toFixed(2)}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
await Deno.writeTextFile("sp500_regression.csv", rows.join("\n"));
|
await Deno.writeTextFile("sp500_regression.html", html);
|
||||||
console.log("Dumped output to sp500_regression.csv");
|
console.log("Dumped output to sp500_regression.html");
|
||||||
}
|
}
|
||||||
|
|
||||||
Dump();
|
Dump();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user