Usage¶
—
Basic Usage¶
Create an instance of SFinance and extract data for a given stock:
from sfinance.sfinance import SFinance
# Start SFinance instance (you may optionally specify the Chrome binary)
# Example: using "https://www.screener.in/" as the source site
sf = SFinance("https://example.com/")
# Get a ticker object for a given symbol
ticker = sf.ticker("INFY")
# Fetch company-level data
print(ticker.get_overview()) # Returns dict with 'Name' and 'About'
print(ticker.get_income_statement()) # Returns a DataFrame
print(ticker.get_balance_sheet()) # Returns a DataFrame
print(ticker.get_cash_flow()) # Returns a DataFrame
print(ticker.get_quarterly_results()) # Returns a DataFrame
print(ticker.get_shareholding()) # Returns a DataFrame
print(ticker.get_peer_comparison()) # Returns a DataFrame
# Close the browser when done
sf.close()
—
Login (for Screener features)¶
Some functionality like stock screening requires login. You must pass your credentials directly (no environment variables used by default):
# Example: using Screener.in as the source site
sf = SFinance("https://example.com/")
sf.login("your_email@example.com", "your_password")
# Check login status
print(sf.fetcher.is_logged_in())
sf.close()
If login fails (wrong credentials or CAPTCHA), an exception is raised.
—
Stock Screening¶
After logging in, you can use the built-in stock screener to run custom financial queries.
sf = SFinance("https://example.com/")
sf.login("your_email@example.com", "your_password")
screener = sf.screener()
df = screener.load_raw_query(
query="Return on equity > 15 AND Piotroski score > 7",
sort="Market Capitalization",
order="desc",
page=1
)
print(df)
sf.close()
—
Headless Chrome Notes¶
sfinance uses Selenium with a headless Chrome driver under the hood. By default, it launches Chrome from your system path.
To specify a custom Chrome binary:
sf = SFinance("https://example.com/", chrome_binary_path="/path/to/chrome")
—
Documents¶
Access a company’s document section (announcements, annual reports, credit ratings, concalls). Login is required for all document methods.
sf = SFinance("https://example.com/")
sf.login("your_email@example.com", "your_password")
ticker = sf.ticker("INFY")
# Announcements — tab="recent" (default) or "important"
df = ticker.get_announcements()
df = ticker.get_announcements(tab="important")
# Columns: title, subtitle, url
# Annual reports
df = ticker.get_annual_reports()
# Columns: title, source, url
# Credit ratings
df = ticker.get_credit_ratings()
# Columns: title, subtitle, url
# Concalls — columns: period, transcript_url, ppt_url, rec_url (None if unavailable)
df = ticker.get_concalls()
—
Downloading Documents¶
Login is required for all download methods.
Download any single URL directly:
# Filename auto-derived from URL if not provided
ticker.download(url, "/path/to/folder")
ticker.download(url, "/path/to/folder", filename="custom_name.pdf")
# Example: download the latest annual report
reports = ticker.get_annual_reports()
ticker.download(reports.iloc[0]["url"], "/path/to/folder")
Bulk download all documents of a type:
# All recent announcements
ticker.download_documents("announcements", "/path/to/folder")
# Important announcements, latest 3
ticker.download_documents("announcements", "/path/to/folder", tab="important", n=3)
# All annual reports
ticker.download_documents("annual_reports", "/path/to/folder")
# Specific year(s)
ticker.download_documents("annual_reports", "/path/to/folder", year=2025)
ticker.download_documents("annual_reports", "/path/to/folder", year=[2024, 2025])
# All credit ratings
ticker.download_documents("credit_ratings", "/path/to/folder")
# Concall transcripts — all, or filtered by period / latest N
ticker.download_documents("concalls", "/path/to/folder", link_type="transcript")
ticker.download_documents("concalls", "/path/to/folder", period="Jan 2026", link_type="transcript")
ticker.download_documents("concalls", "/path/to/folder", n=5, link_type="all")
download_documents returns a list of saved file paths. Failed downloads are printed
and skipped without raising an exception.
Supported ``link_type`` values for concalls: "transcript", "ppt", "rec", "all"
(YouTube REC links are automatically skipped during download.)
—
Error Handling¶
TickerNotFound – Raised if a stock symbol is not found.
LoginRequiredError – Raised if document/screener methods are accessed without login.
from sfinance.exceptions import TickerNotFound, LoginRequiredError
try:
ticker = sf.ticker("INVALID123")
except TickerNotFound:
print("Invalid ticker symbol")
try:
screener = sf.screener()
df = screener.load_raw_query(query="ROE > 20")
except LoginRequiredError:
print("Please login first")
—
Closing the Session¶
Always call .close() when you’re done:
sf.close()