Custom Stock List Screener (User-Provided Data)

1. Input Your Stock Data

Market Cap & Avg Volume should be numerical (e.g., Market Cap in millions, ensure consistency).

Screened Stock List

Stock data will appear here after loading. Click table headers to sort.

How to Use the Custom Stock List Screener

This tool allows you to filter and sort a custom list of stocks based on data you provide. It does not fetch live market data or define what a "penny stock" is automatically. If you wish to screen penny stocks, please ensure your input list primarily contains stocks that meet your personal criteria (e.g., low price, small market capitalization).

1. Prepare Your Data:

Your stock data needs to be in a comma-separated value (CSV-like) format. Each stock should be on a new line, with its attributes separated by commas in the following exact order:

SYMBOL,NAME,PRICE,MARKET_CAP,AVG_VOLUME,SECTOR,EXCHANGE

Column Explanations:

  • SYMBOL: The stock ticker symbol (e.g., XYZ, ABC.NS for Indian NSE stocks, LOW.BO for BSE).
  • NAME: The full company name (e.g., XYZ Corporation, ABC India Limited).
  • PRICE: The current or relevant stock price (a numerical value).
  • MARKET_CAP: The market capitalization of the company (a numerical value). Ensure you use a consistent unit for all entries (e.g., all in millions, or all in crores).
  • AVG_VOLUME: The average daily trading volume (a numerical value).
  • SECTOR: The industry sector the company belongs to (text, e.g., Technology, Healthcare, Pharma, Mining).
  • EXCHANGE: The stock exchange where the stock is listed (text, e.g., NASDAQ, OTC, NSE, BSE).

Example Data:

XYZ,XYZ Corp,1.20,50,100000,Technology,OTC
ABC.NS,ABC India Ltd,15,250,50000,Pharma,NSE
LOWP.BO,LowPrice Wonder,0.85,10,20000,Mining,BSE
SPEC,Speculative Co,3.50,150,75000,Biotech,NASDAQ
APPY,Appy Systems,4.90,290,120000,Software,NYSE

Make sure there are no extra commas within a field (e.g., in the company name). If a field is empty, you might still need a comma as a placeholder if it's not the last field, or ensure your parser handles missing trailing fields, but it's best to have data for all fields used in screening.

2. Input Your Data (on "Stock Data & Screener" tab):

  • Title (Optional): Give your list a title for the PDF report.
  • Currency Symbol: Enter the currency symbol (e.g., $, ₹, €) that applies to your PRICE and MARKET_CAP data. This is for display in the table and PDF.
  • Paste Data: Paste your prepared data into the large "Paste Stock Data" textarea.
  • Load Data: Click the "Load Stock Data" button. Your data will appear in the table below, and filter dropdowns for Sector and Exchange will be populated based on your data.

3. Filter and Sort:

  • Use the filter controls (Max Price, Min/Max Market Cap, Min Avg. Volume, Sector, Exchange) to narrow down your list.
  • Click "Apply Filters" to see the results. "Reset Filters" will show your full loaded list.
  • Click on any column header in the table (e.g., "Price", "Market Cap") to sort the displayed data by that column. Click again to reverse the sort order.

4. Download PDF:

Once you have a filtered/sorted list you're happy with, click "Download List as PDF".

This tool operates locally in your browser. Your data is not sent to any server. Refreshing the page will clear any loaded data unless a future version includes local browser storage.

Stock data will appear here after loading. Click table headers to sort.

"; return; } let tableHTML = ``; displayedStockDataPSS.forEach(s => { tableHTML += ``; }); tableHTML += `
Symbol Name Price (${currentCurrencySymbolPSS}) Market Cap (${currentCurrencySymbolPSS}) Avg. Volume Sector Exchange
${s.symbol} ${s.name} ${formatNumberDisplayPSS(s.price, true)} ${formatNumberDisplayPSS(s.marketCap, true)} ${s.avgVolume.toLocaleString()} ${s.sector} ${s.exchange}
`; container.innerHTML = tableHTML; } function downloadStockListPDF() { const listTitle = getStrInputPSS('listTitlePSS') || "My Custom Stock List"; const tableContainer = document.getElementById('stockListTableContainer'); const pdfButton = document.getElementById('toolPdfDownloadPSS'); if (!tableContainer.querySelector('table') || displayedStockDataPSS.length === 0) { alert("No data in the table to download."); return; } if(pdfButton) pdfButton.style.display = 'none'; const { jsPDF } = window.jspdf; const pdf = new jsPDF('l', 'mm', 'a4'); // Landscape for wider table const pdfContentElement = document.createElement('div'); pdfContentElement.classList.add('pdf-content'); let html = `

${listTitle}

`; const today = new Date(); html += `

Report Date: ${today.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' })}

`; html += `

Currency for Price/Market Cap: ${currentCurrencySymbolPSS}


`; // Get table HTML but make it use PDF classes const tableClone = tableContainer.querySelector('table').cloneNode(true); // Remove onclick events from th for PDF tableClone.querySelectorAll('th').forEach(th => th.removeAttribute('onclick')); html += `

Screened Stock List (${displayedStockDataPSS.length} items):

${tableClone.outerHTML}`; html += `
`; html += `

This report is generated from user-provided data. It is for informational purposes only and does not constitute financial advice.

`; pdfContentElement.innerHTML = html; document.body.appendChild(pdfContentElement); html2canvas(pdfContentElement, { scale: 1.2, useCORS: true, windowWidth: pdfContentElement.scrollWidth, windowHeight: pdfContentElement.scrollHeight }).then(canvas => { const imgData = canvas.toDataURL('image/png'); const pdfWidth = pdf.internal.pageSize.getWidth(); const pageHeight = pdf.internal.pageSize.getHeight(); const imgActualWidth = canvas.width; const imgActualHeight = canvas.height; const aspectRatio = imgActualWidth / imgActualHeight; const pageMargin = 10; let imgWidthInPdf = pdfWidth - (2 * pageMargin); let imgHeightInPdf = imgWidthInPdf / aspectRatio; let heightLeft = imgHeightInPdf; let currentYPosition = pageMargin; if (imgHeightInPdf > pageHeight - (2*pageMargin)) { // If image taller than page, scale to fit height imgHeightInPdf = pageHeight - (2 * pageMargin); imgWidthInPdf = imgHeightInPdf * aspectRatio; } // Recenter if scaled by height const xOffset = (pdfWidth - imgWidthInPdf) / 2; pdf.addImage(imgData, 'PNG', xOffset, currentYPosition, imgWidthInPdf, imgHeightInPdf); heightLeft -= (pageHeight - (2 * pageMargin)); // Basic pagination if content is extremely long (unlikely for just a table image scaled to fit one page) // For very long tables not fitting on one canvas, more complex PDF generation for tables is needed. // This html2canvas approach captures what's rendered. pdf.save(`${listTitle.replace(/[^a-zA-Z0-9]/g, '_') || 'Custom_Stock_List'}.pdf`); document.body.removeChild(pdfContentElement); if(pdfButton) pdfButton.style.display = 'inline-block'; }).catch(error => { console.error("Error generating Stock List PDF:", error); alert("Could not generate PDF. See console for details."); if(pdfButton) pdfButton.style.display = 'inline-block'; if (document.body.contains(pdfContentElement)) { document.body.removeChild(pdfContentElement); } }); }
Scroll to Top