FinanceQuery is a simple API to query financial data. It provides endpoints to get quotes, historical prices, indices, market movers, similar stocks, finance news, indicators, search, and sectors. Data is acquired through web scraping and third party libraries. It is the successor to the GoogleFinanceAPI.
- Documentation
- Run Locally
- Deployment
- API Reference
- Websockets Guide
- Usage/Examples
- Proxies
- Environment Variables
- Feedback
- License
Clone the project
git clone https://github.com/Verdenroz/FinanceQuery.git
Go to the project directory
cd finance-query
Install dependencies
pip install -r requirements.txt
Start the server
python.exe -m uvicorn src.main:app --reload
- Follow the AWS Lambda Deployment Guide
- Remember to add the environment variables to the Lambda function
- Alternatively use the AWS Deployment Workflow, providing repository secrets for
AWS_SECRET_ID
andAWS_SECRET_KEY
.- Also edit the
AWS_REGION
,ECR_REPOSITORY
, andFUNCTION_NAME
in the workflow file
- Also edit the
- Follow the Render Deployment Guide
- The deployment should use the
Dockerfile
file in the repository - Be sure to override the CMD in the Dockerfile in your Render project settings to
python -m uvicorn src.main:app --host 0.0.0.0 --port $PORT
- Alternatively use the Render Deployment Workflow, providing repository secrets for
RENDER_DEPLOY_HOOK_URL
.- The deploy hook url can be found in the settings of your Render project
GET /v1/quotes
Query Parameter | Type | Description |
---|---|---|
symbols |
string |
Required. Comma-separated list of stock symbols |
GET /v1/simple-quotes
Query Parameter | Type | Description |
---|---|---|
symbols |
string |
Required. Comma-separated list of stock symbols |
GET /v1/historical
Minutes intervals are available up to 1mo - 1h interval available up to 1Y
Query Parameter | Type | Description |
---|---|---|
symbol |
string |
Required. The symbol of the stock |
time |
string |
Required. Time period: (1d, 5d, 7d, 1mo, 3mo, 6mo, YTD, 1Y, 5Y, 10Y, max) |
interval |
string |
Required. Interval: between data points (1m, 5m, 15m, 30m, 1h, 1d, 1wk, 1mo, 3mo) |
GET /v1/indicators
I would not recommend changing the optional params unless you know what you are doing
Query Parameter | Type | Description |
---|---|---|
function |
string |
Required. The type of indicator: (SMA, EMA, WMA, VWMA, RSI, SRSI, STOCH, CCI, OBV, BBANDS, AROON, ADX, MACD, SUPERTREND, ICHIMOKU) |
symbol |
string |
Required The symbol of the stock |
interval |
string |
Optional [Default 1d] Interval between data points: (15m, 30m, 1h, 1d, 1wk, 1mo, 3mo) |
period |
int |
Optional [Default varies per function] The look-back period |
stoch_period |
int |
Optional [Default 14] The stochastic look-back period for STOCH and SRSI |
signal_period |
int |
Optional [Default varies per function] The signal period for MACD, STOCH, and SRSI |
smooth |
int |
Optional [Default 3] The smoothing period for STOCH and SRSI. |
fast_period |
int |
Optional [Default 12] The fast period for MACD. |
slow_period |
int |
Optional [Default 26] The slow period for MACD. |
std_dev |
int |
Optional [Default 2] The standard deviation for Bollinger Bands. |
sma_periods |
int |
Optional [Default None] The look-back period for the SMA in OBV. |
multiplier |
int |
Optional [Default 3] The multiplier for SuperTrend. |
tenkan_period |
int |
Optional [Default 9] The look-back period for the Tenkan line in Ichimoku. |
kijun_period |
int |
Optional [Default 26] The look-back period for the Kijun line in Ichimoku. |
senkou_period |
int |
Optional [Default 52] The look-back period for the Senkou span in Ichimoku. |
GET /v1/analysis
Query Parameter | Type | Description |
---|---|---|
symbol |
string |
Required. The symbol of the stock |
interval |
string |
Optional [Default 1d]. Interval: between data points (15m, 30m, 1h, 1d, 1wk, 1mo, 3mo) |
GET /v1/similar
Query Parameter | Type | Description |
---|---|---|
symbol |
string |
Required. The symbol of the stock to find similar stocks around |
GET /v1/news
Query Parameter | Type | Description |
---|---|---|
symbol |
string |
Optional. Specify symbol to find specific news around a stock |
GET /v1/search
Query Parameter | Type | Description |
---|---|---|
query |
string |
Optional. Search query by symbol or name |
GET /v1/sectors
Query Parameter | Type | Description |
---|---|---|
symbol |
string |
Optional. Specify symbol to find specific sector performance belonging to the symbol |
name |
string |
Optional. The specific name of the individual sector (Technology, Consumer Cyclical etc) |
GET /v1/indices
GET /v1/actives
GET /v1/losers
GET /v1/gainers
GET /hours
The websockets depend on Redis PubSub and will require Redis credentials in your .env
There are currently four implemented websocket routes: profile
, quotes
, market
, and hours
. These will not be accessible through Lambda. If you are interested in deployment, I recommend deploying to Render as it will be able to host the entire FastAPI server, including the websockets. If you are testing locally, your requests will be ws
instead of wss
. Data is returned on a set interval every 10 seconds.
WSS /profile/{symbol}
WSS /quotes
WSS /market
WSS /hours
The exposed endpoints to the API is
There are two workflows that will automatically deploy to render and AWS, but they will require repository secrets for AWS_SECRET_ID
, AWS_SECRET_KEY
, and RENDER_DEPLOY_HOOK_URL
. Quite frankly, render is easier to work with since it enables the websockets, but will require the paid Starter Plan as this API requires extensive memory. If you are tight on cash, consider Lambda.
An x-api-key header must be added to all requests. The demo key is FinanceQueryDemoAWSHT (2000 requests/day).
If you are deploying this for yourself, you can create your own admin key which will not be rate limited. See the .env template.
Again, remember the websockets above are not available through Lambda. If you deploy to Render instead, you will be able to connect to the websockets through a request that looks like
wss://finance-query.onrender.com/...
Proxies are off by default, but they can be enabled with the correct environment variables. See the .env template. It is recommended that all deployed instances use proxies to avoid any potential blocking. I am currently using BrightData, though you are welcome to change whatever fits you best. FastAPI's lifespan events handles ip address whitelisting and session cleanup.
To run this project locally, you will need to add the following environment variables to your .env.
REDIS_HOST
REDIS_PASSWORD
REDIS_PORT
REDIS_USERNAME
ALGOLIA_APP_ID
ALGOLIA_KEY
USE_PROXY
PROXY_URL
PROXY_USER
PROXY_PASSWORD
USE_SECURITY
ADMIN_API_KEY
- If you do not use redis, you can simply disable the redis cache by deleting the @cache decorator to all routes. Cache can still be enabled with in-memory async-lru. See @alru_cache
- Websockets and Rate Limiting will not work without Redis.
- Search endpoint will not work without Algolia.
- Proxies are optional but recommended for deployment.
- If security is enabled, api keys will be validated and rate limits enforced, though this depends on Redis, so it is off by default.
- Set if admin key security is enabled. Admin API key must be kept secret as this will have no rate limit attached.
As most data is scraped, some endpoints may break
If something is not working or if you have any suggestions, contact me at harveytseng2@gmail.com