Virtual API: the library for finance!¶
Virtual Finance API¶
Interactive¶
Using the Jupyter notebook it is easy to experiment with the virtual_finance_api library.
Install¶
# Setup a virtual environment
$ mkdir vfa
$ cd vfa
$ python3 -m venv venv38
$ . ./venv38/bin/activate
(venv38) feite@salmay:~/vfa$
$ pip install virtual_finance_api
… Or the latest¶
With virtual_finance_api installed, it is directly available via the commandline:
$ virtual_finance_api --help
Usage: vfapi [OPTIONS] COMMAND [ARGS]...
Virtual Finance API commandline app.
Options:
--help Show this message and exit.
Commands:
financials
history
holders
profile Profile.
… additional help on the history command:
vfapi history --help
Usage: vfapi history [OPTIONS] TICKER
Options:
--period [1d|5d|1mo|3mo|6mo|1y|2y|5y|10y|ytd|max]
--interval [1m|2m|5m|15m|30m|60m|90m|1h|1d|5d|1wk|1mo|3mo]
--csv
--help Show this message and exit.
So, lets query for some history for IBM …
$ vfapi history IBM
Open High Low Close Volume
2021-03-01 14:30:00 120.349998 122.320000 119.860001 120.739998 5714500
2021-03-02 14:30:00 120.739998 121.900002 120.260002 120.330002 4522200
2021-03-03 14:30:00 120.500000 122.629997 119.980003 122.360001 7396200
2021-03-04 14:30:00 122.000000 123.220001 118.760002 120.110001 8062100
2021-03-05 14:30:00 120.639999 123.750000 120.250000 122.830002 6944900
2021-03-08 14:30:00 122.989998 126.849998 122.879997 124.809998 7236600
2021-03-09 14:30:00 125.400002 126.430000 124.160004 124.180000 5608200
2021-03-10 14:30:00 125.050003 128.240005 124.610001 127.870003 7243500
2021-03-11 14:30:00 128.089996 128.639999 126.779999 127.139999 5145000
2021-03-12 14:30:00 127.190002 127.680000 126.610001 127.610001 4009600
2021-03-15 13:30:00 127.769997 128.750000 127.540001 128.580002 3420600
2021-03-16 13:30:00 128.279999 128.520004 127.339996 128.240005 4630400
2021-03-17 13:30:00 128.460007 129.490005 127.489998 129.029999 4244800
2021-03-18 13:30:00 128.940002 131.000000 127.790001 130.059998 5834600
2021-03-19 13:30:00 130.020004 130.440002 128.529999 128.899994 9830600
2021-03-22 13:30:00 128.500000 130.720001 127.889999 130.550003 4164900
2021-03-23 13:30:00 130.440002 131.559998 129.800003 130.460007 4356400
2021-03-24 13:30:00 130.949997 132.110001 130.570007 130.619995 4005000
2021-03-25 13:30:00 130.330002 133.240005 129.770004 133.070007 5554000
2021-03-26 13:30:00 133.289993 136.479996 133.119995 136.380005 5562500
2021-03-29 13:30:00 135.979996 137.070007 135.509995 135.860001 4620900
The Virtual Finance API provides access to data from financial sites as if it is accessing a REST-API. Currently covered:
- yahoo ‘endpoints’ to get:
- financials
- history
- holders
- options
- profile
- screener
- screeners
- yahooindex
- business inisder ‘endpoint’:
- fetch ISIN code
- yfinance compatibility ‘endpoints’
- standardized JSON ‘endpoints’
With request-classes for these endpoints, getting data is as easy as:
>>> import json
>>> import virtual_finance_api as fa
>>> import virtual_finance_api.endpoints.yahoo as yh
>>> client = fa.Client()
>>> r = yh.Holders('IBM')
>>> rv = client.request(r)
# lets get the 'major' holders from that JSON response
>>> print(json.dumps(rv['major'], indent=2))
{
"0": {
"0": "0.13%",
"1": "58.58%",
"2": "58.66%",
"3": "2561"
},
"1": {
"0": "% of Shares Held by All Insider",
"1": "% of Shares Held by Institutions",
"2": "% of Float Held by Institutions",
"3": "Number of Institutions Holding Shares"
}
}
With the extensions.stdjson endpoints this looks like:
>>> import virtual_finance_api.extensions.stdjson.endpoints as je
>>> client = fa.Client()
>>> r = je.Holders('IBM')
>>> rv = client.request(r)
# lets get the 'major' holders from that JSON response
>>> print(json.dumps(rv['major'], indent=2))
[
[
"0.13%",
"% of Shares Held by All Insider"
],
[
"58.25%",
"% of Shares Held by Institutions"
],
[
"58.33%",
"% of Float Held by Institutions"
],
[
"2696",
"Number of Institutions Holding Shares"
]
]
It make more sense to group the information. The base classes simply pass the JSON data the way it is scraped from the source URL. Derived classes can be used to transform this data. The extension.stdjson performs this task.
Yfinance compatibility¶
There is a compatibility layer with Yfinance too. It provides requests derived from the base requests, extended with properties that give the same information as Yfinance does.
The Holders-example from above becomes:
>>> import json
>>> import virtual_finance_api as fa
>>> import virtual_finance_api.compat.yfinance.endpoints as yf
>>> client = fa.Client()
>>> r = yf.Holders('IBM')
>>> rv = client.request(r)
>>> # lets get the 'major' holders from that JSON response
>>> print(r.major)
0 1
0 0.13% % of Shares Held by All Insider
1 58.58% % of Shares Held by Institutions
2 58.66% % of Float Held by Institutions
3 2561 Number of Institutions Holding Shares
>>> # or, that same information from the dataframe in JSON
>>> # (dump, load, dump to 'pretty print')
>>> print(json.dumps(json.loads(r.major.to_json()), indent=2))
{
"0": {
"0": "0.13%",
"1": "58.58%",
"2": "58.66%",
"3": "2561"
},
"1": {
"0": "% of Shares Held by All Insider",
"1": "% of Shares Held by Institutions",
"2": "% of Float Held by Institutions",
"3": "Number of Institutions Holding Shares"
}
}
>>> print(r.institutional)
Holder Shares Date Reported % Out Value
0 Vanguard Group, Inc. (The) 73806391 2020-12-30 0.0826 9290748499
1 Blackrock Inc. 62271273 2020-12-30 0.0697 7838707845
2 State Street Corporation 51941856 2020-12-30 0.0581 6538440833
3 Geode Capital Management, LLC 13310817 2020-12-30 0.0149 1675565643
4 Charles Schwab Investment Management, Inc. 12571878 2020-12-30 0.0141 1582548002
5 Northern Trust Corporation 10652880 2020-12-30 0.0119 1340984534
6 Morgan Stanley 9853901 2020-12-30 0.0110 1240409057
7 Bank Of New York Mellon Corporation 9628160 2020-12-30 0.0108 1211992780
8 Norges Bank Investment Management 8865649 2020-12-30 0.0099 1116007896
9 Bank of America Corporation 8074146 2020-12-30 0.0090 1016373498
See the https://virtual-finance-api.readthedocs.io/en/latest/?badge=latest for details.
Credits¶
This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template.
Installation¶
Stable release¶
To install Virtual Finance API, run this command in your terminal:
$ pip install virtual_finance_api
This is the preferred method to install Virtual Finance API, as it will always install the most recent stable release.
If you don’t have pip installed, this Python installation guide can guide you through the process.
From sources¶
The sources for Virtual Finance API can be downloaded from the Github repo.
You can either clone the public repository:
$ git clone git://github.com/hootnot/virtual-finance-API
Or download the tarball:
$ curl -OJL https://github.com/hootnot/virtual-finance-API/tarball/main
Once you have a copy of the source, you can install it with:
$ python setup.py install
Motivation¶
While building a service on a task based concept using Celery or Dramatiq, I ran into connection related issues using for instance a library like yfinance . These issues occured when firing a large number of requests asynchronously.
In the need of an, over all, more fine grained control I, decided to write a new library:
- easy to scale
- easy to maintain
- easy to extend
- integrated logging
- compatibility layers
- yfinance compatibility package
REST-API¶
Since I’m a fan of REST-API’s, the thought was to approach this as a wrapper for a REST-API, in this case a “virtual-REST-API”.
Two basic components¶
Request classes to represent the specfic requests providing an API like a REST-API with route-parameters and query parameters. When executed the request instance will hold the response and the HTTP-status.
A Client performing the requests.
Since finance.yahoo.com provides no real REST-API, the requests of the wrappper fake the REST-API. A request instance holds the details for the URL to call. In case it is HTML-data that needs to be processed to scrape the information, a conversion method is run after the HTML-data is received.
This second stage of processing gives the desired JSON-response or, in case of errors some 4xx error code is returned. The client processes this the same way as if it was the response of a REST-API.
In case the second stage processing fails the original status code is set to a code identifying the final state:
- if processing was without errors, but the desired result could not be created, the status code is changed to 404, ‘Not Found’
- in case processing gave errors, the status code is changed to 422, ‘Unprocessable Entity’
These status codes represent a REST-API server responding to client requests.
There are a handful of endpoints that provide the information we need. The request classes wrap the logic to provide the JSON data fetched (or fabricated) from the response, acting as if that response was provided by site that was called.
Usage¶
To use Virtual Finance API in a project simply create a Client and Requests to be performed by the Client like:
import virtual_finance_api as fa
import virtual_finance_api.endpoints.yahoo as yh
import json
client = fa.Client()
ticker = 'IBM'
r = yh.Profile(ticker)
print(json.dumps(client.request(r), indent=2))
{
"defaultKeyStatistics": {
"annualHoldingsTurnover": null,
"enterpriseToRevenue": 2.274,
"beta3Year": null,
"profitMargins": 0.07593,
"enterpriseToEbitda": 10.955,
"52WeekChange": 0.2859279,
"morningStarRiskRating": null,
"forwardEps": 12.08,
"revenueQuarterlyGrowth": null,
"sharesOutstanding": 893593984,
"fundInceptionDate": null,
"annualReportExpenseRatio": null,
"totalAssets": null,
"bookValue": 23.074,
"sharesShort": 30005072,
"sharesPercentSharesOut": 0.0336,
"fundFamily": null,
"lastFiscalYearEnd": 1609372800,
"heldPercentInstitutions": 0.58584,
"netIncomeToCommon": 5501000192,
"trailingEps": 6.233,
.... And a lot more ....
"maxAge": 86400
},
"pageViews": {
"shortTermTrend": "UP",
"midTermTrend": "UP",
"longTermTrend": "UP",
"maxAge": 1
}
}
Exceptions¶
To catch exceptions, wrap the client.request() in a try/catch like:
import virtual_finance_api as fa
import virtual_finance_api.endpoints.yahoo as yh
import json
client = fa.Client()
ticker = 'IBM'
r = yh.Profile(ticker)
try:
rv = client.request(r)
except fa.VirtualFinanceAPIError as err:
print(err)
else:
print(json.dumps(rv, indent=2))
Logging¶
The virtual_finance_library has logging integrated. By simply importing the logging module and configuring it, you will have logging available.
import virtual_finance_api as fa
import virtual_finance_api.endpoints.yahoo as yh
import json
import logging
logging.basicConfig(
filename="./your_appl_name.log",
level=logging.INFO,
format='%(asctime)s [%(levelname)s] %(name)s : %(message)s',
)
client = fa.Client()
ticker = 'IBM'
r = yh.Profile(ticker)
try:
rv = client.request(r)
except fa.VirtualFinanceAPIError as err:
print(err)
else:
print(json.dumps(rv, indent=2))
… and the log looks like:
2021-04-09 14:26:28,884 [INFO] virtual_finance_api.client : performing request https://finance.yahoo.com/quote/IBM 2021-04-09 14:26:29,359 [INFO] virtual_finance_api.endpoints.yahoo.ticker_bundle : conversion_hook: IBM OK
Reference¶
virtual_finance_api¶
Client and Exceptions¶
Top-level package for Virtual Finance API.
-
class
virtual_finance_api.
Client
(headers: dict = None, request_params: dict = None)[source]¶ Bases:
object
-
__init__
(headers: dict = None, request_params: dict = None) → None[source]¶ Instantiate a Client instance.
Parameters: - headers (dict (optional)) – optional headers to set to requests
- request_params (dict (optional)) – optional parameters to set to requests
for details pls. check requests.readthedocs.io
Example
>>> import virtual_finance_api as fa >>> import virtual_finance_api.endpoints.yahoo as yh >>> import json >>> client = fa.Client() >>> r = yh.Profile('IBM') >>> try: ... rv = client.request(r) ... except VirtualFinanceAPIError as err: ... print(err) ... else: ... print(json.dumps(rv['pageViews'], indent=2)) { "shortTermTrend": "NEUTRAL", "midTermTrend": "UP", "longTermTrend": "UP", "maxAge": 1 }
-
request
(endpoint: virtual_finance_api.endpoints.apirequest.VirtualAPIRequest)[source]¶ Perform a request for the APIRequest instance ‘endpoint’.
Parameters: endpoint (APIRequest (required)) – The endpoint parameter contains an instance of an APIRequest containing the endpoint, method and optionally other parameters or body data.
Raises: - VirtualFinanceAPIError – in case of HTTP response code >= 400
- requests-lib exceptions – Possible exceptions from the requests library, those are re-raised.
-
request_params
¶ request_params property.
-
Yahoo endpoints¶
-
class
virtual_finance_api.endpoints.yahoo.
Profile
(ticker: str)[source]¶ Bases:
virtual_finance_api.endpoints.apirequest.VirtualAPIRequest
,virtual_finance_api.endpoints.yahoo.ticker_bundle.Yhoo
Profile - class to handle the profile endpoint.
-
DOMAIN
= 'https://finance.yahoo.com'¶
-
ENDPOINT
= 'quote/{ticker}'¶
-
EXPECTED_STATUS
= 200¶
-
METHOD
= 'GET'¶
-
RESPONSE_TYPE
= 'txt'¶
-
__init__
(ticker: str) → None[source]¶ Instantiate a Profile APIRequest instance.
Parameters: ticker (string (required)) – the ticker to perform the request for. Example
>>> import virtual_finance_api as fa >>> import virtual_finance_api.endpoints.yahoo as yh >>> client = fa.Client() >>> r = yh.Profile('IBM') >>> rv = client.request(r) >>> print(json.dumps(rv, indent=2))
{ "info": { "zip": "10504", "sector": "Technology", "fullTimeEmployees": 345900, "longBusinessSummary": "International Business Machines Corporation .......", "city": "Armonk", "phone": "914 499 1900", "state": "NY", "country": "United States", "companyOfficers": [], "website": "http://www.ibm.com", "maxAge": 1, "address1": "One New Orchard Road", "industry": "Information Technology Services", "previousClose": 131.18, "regularMarketOpen": 131.305, "twoHundredDayAverage": 123.6211, "trailingAnnualDividendYield": 0.049626473, "payoutRatio": 1.0619999, "volume24Hr": null, "regularMarketDayHigh": 132.66, "navPrice": null, "averageDailyVolume10Day": 4423514, "totalAssets": null, "regularMarketPreviousClose": 131.18, "fiftyDayAverage": 128.79886, "trailingAnnualDividendRate": 6.51, "open": 131.305, "toCurrency": null, "averageVolume10days": 4423514, "expireDate": null, "yield": null, "algorithm": null, "dividendRate": 6.52, "exDividendDate": 1612828800, "beta": 1.225041, "circulatingSupply": null, "...": "..." } }
-
-
class
virtual_finance_api.endpoints.yahoo.
History
(ticker: str, params: dict)[source]¶ Bases:
virtual_finance_api.endpoints.apirequest.VirtualAPIRequest
,virtual_finance_api.endpoints.yahoo.ticker_bundle.Yhoo
History - class to handle the history endpoint.
-
DOMAIN
= 'https://query1.finance.yahoo.com'¶
-
ENDPOINT
= 'v8/finance/chart/{ticker}'¶
-
EXPECTED_STATUS
= 200¶
-
METHOD
= 'GET'¶
-
RESPONSE_TYPE
= 'json'¶
-
__init__
(ticker: str, params: dict) → None[source]¶ Instantiate a History APIRequest instance.
Parameters: - ticker (string (required)) – the ticker to perform the request for.
- params (dict (optional)) – dictionary with optional parameters to perform the request, parameters default to 1 month of daily (1d) historical data.
{ "interval": "1d", "period": "max", "actions": true }
>>> import virtual_finance_api as fa >>> import virtual_finance_api.endpoints.yahoo as yh >>> client = fa.Client() >>> r = yh.History('IBM', params=params) >>> rv = client.request(r)
>>> print(r.response)
{ "meta": { "currency": "USD", "symbol": "IBM", "exchangeName": "NYQ", "instrumentType": "EQUITY", "firstTradeDate": -252322200, "regularMarketTime": 1618419277, "gmtoffset": -14400, "timezone": "EDT", "exchangeTimezoneName": "America/New_York", "regularMarketPrice": 132.23, "chartPreviousClose": 127.61, "priceHint": 2, "currentTradingPeriod": { "pre": { "timezone": "EDT", "start": 1618387200, "end": 1618407000, "gmtoffset": -14400 }, "regular": { "timezone": "EDT", "start": 1618407000, "end": 1618430400, "gmtoffset": -14400 }, "post": { "timezone": "EDT", "start": 1618430400, "end": 1618444800, "gmtoffset": -14400 } }, "dataGranularity": "1d", "range": "1mo", "validRanges": [ "1d", "5d", "1mo", "3mo", "6mo", "1y", "2y", "5y", "10y", "ytd", "max" ] }, "ohlcdata": { "timestamp": [ 1615815000, 1615901400, 1615987800, 1616074200, 1616160600, 1616419800, "..." ], "open": [ "..." ] } }
-
-
class
virtual_finance_api.endpoints.yahoo.
Holders
(ticker: str)[source]¶ Bases:
virtual_finance_api.endpoints.apirequest.VirtualAPIRequest
,virtual_finance_api.endpoints.yahoo.ticker_bundle.Yhoo
Holders - class to handle the holders endpoint.
-
DOMAIN
= 'https://finance.yahoo.com'¶
-
ENDPOINT
= 'quote/{ticker}/holders'¶
-
EXPECTED_STATUS
= 200¶
-
METHOD
= 'GET'¶
-
RESPONSE_TYPE
= 'txt'¶
-
__init__
(ticker: str) → None[source]¶ Instantiate a Holders APIRequest instance.
Parameters: ticker (string (required)) – the ticker to perform the request for. Example
>>> import virtual_finance_api as fa >>> import virtual_finance_api.endpoints.yahoo as yh >>> client = fa.Client() >>> r = yh.Holders('IBM') >>> rv = client.request(r) >>> print(json.dumps(rv, indent=2))
{ "major": [ [ "0.13%", "% of Shares Held by All Insider" ], [ "58.24%", "% of Shares Held by Institutions" ], [ "58.32%", "% of Float Held by Institutions" ], [ "2692", "Number of Institutions Holding Shares" ] ], "institutional": { "legend": { "holder": "Holder", "shares": "Shares", "date_reported": "Date Reported", "pch_out": "% Out", "value": "Value" }, "holders": [ { "holder": "Vanguard Group, Inc. (The)", "shares": 73806391, "date_reported": "Dec 30, 2020", "pch_out": 8.26, "value": 9290748499 }, { "holder": "Blackrock Inc.", "shares": 62271273, "date_reported": "Dec 30, 2020", "pch_out": 6.97, "value": 7838707845 }, { "...": "..." } ] } }
-
-
class
virtual_finance_api.endpoints.yahoo.
Financials
(ticker: str)[source]¶ Bases:
virtual_finance_api.endpoints.apirequest.VirtualAPIRequest
,virtual_finance_api.endpoints.yahoo.ticker_bundle.Yhoo
Financials - class to handle the financials endpoint.
-
DOMAIN
= 'https://finance.yahoo.com'¶
-
ENDPOINT
= 'quote/{ticker}/financials'¶
-
EXPECTED_STATUS
= 200¶
-
METHOD
= 'GET'¶
-
RESPONSE_TYPE
= 'txt'¶
-
__init__
(ticker: str) → None[source]¶ Instantiate a Financials APIRequest instance.
Parameters: ticker (string (required)) – the ticker to perform the request for. Example
>>> import virtual_finance_api as fa >>> import virtual_finance_api.endpoints.yahoo as yh >>> client = fa.Client() >>> r = yh.Financials('IBM') >>> rv = client.request(r) >>> print(json.dumps(rv, indent=2))
{ "cashflow": { "yearly": [ { "investments": -628000000, "changeToLiabilities": 138000000, "totalCashflowsFromInvestingActivities": -3028000000, "netBorrowings": -3714000000, "totalCashFromFinancingActivities": -9721000000, "changeToOperatingActivities": 3023000000, "netIncome": 5590000000, "changeInCash": 5361000000, "endDate": 1609372800, "repurchaseOfStock": -302000000, "effectOfExchangeRate": -87000000, "totalCashFromOperatingActivities": 18197000000, "depreciation": 6695000000, "dividendsPaid": -5797000000, "changeToInventory": -209000000, "changeToAccountReceivables": 5297000000, "otherCashflowsFromFinancingActivities": 92000000, "maxAge": 1, "changeToNetincome": -2337000000, "capitalExpenditures": -2618000000 }, { "investments": 268000000, "changeToLiabilities": -503000000, "totalCashflowsFromInvestingActivities": -26936000000, "netBorrowings": 16284000000, "totalCashFromFinancingActivities": 9042000000, "changeToOperatingActivities": 1159000000, "netIncome": 9431000000, "changeInCash": -3290000000, "endDate": 1577750400, "repurchaseOfStock": -1633000000, "effectOfExchangeRate": -167000000, "totalCashFromOperatingActivities": 14770000000, "depreciation": 6059000000, "dividendsPaid": -5707000000, "changeToInventory": 67000000, "changeToAccountReceivables": 502000000, "otherCashflowsFromFinancingActivities": 98000000, "maxAge": 1, "changeToNetincome": -1945000000, "capitalExpenditures": -2286000000 }, { "...": "... etc. ..." } ] } }
-
-
class
virtual_finance_api.endpoints.yahoo.
Options
(ticker: str, params: dict = None)[source]¶ Bases:
virtual_finance_api.endpoints.apirequest.VirtualAPIRequest
,virtual_finance_api.endpoints.yahoo.ticker_bundle.Yhoo
Options - class to handle the options endpoint.
-
DOMAIN
= 'https://query1.finance.yahoo.com'¶
-
ENDPOINT
= 'v7/finance/options/{ticker}'¶
-
EXPECTED_STATUS
= 200¶
-
METHOD
= 'GET'¶
-
RESPONSE_TYPE
= 'json'¶
-
__init__
(ticker: str, params: dict = None) → None[source]¶ Instantiate a Options APIRequest instance.
Parameters: - ticker (string (required)) – the ticker to perform the request for.
- params – dict with optional ‘date’ parameter.
Example
>>> import virtual_finance_api as fa >>> import virtual_finance_api.endpoints.yahoo as yh >>> client = fa.Client() >>> r = yh.Options('IBM') >>> rv = client.request(r) >>> print(json.dumps(rv, indent=2))
{ "underlyingSymbol": "IBM", "expirationDates": [ 1618531200, 1619136000, 1619740800, 1620345600, 1620950400, 1621555200, 1622160000, 1623974400, 1626393600, 1631836800, 1634256000, 1642723200, 1655424000, 1674172800 ], "strikes": [ 55.0, 60.0, 65.0, 70.0, 75.0, 80.0, 85.0, 90.0, 95.0, "...", 165.0, 170.0, 175.0, 180.0, 185.0, 190.0, 195.0, 200.0 ], "hasMiniOptions": false, "options": [ { "expirationDate": 1618531200, "hasMiniOptions": false, "calls": [ { "contractSymbol": "IBM210416C00060000", "strike": 60.0, "currency": "USD", "lastPrice": 67.05, "change": 0.0, "percentChange": 0.0, "volume": 1, "openInterest": 2, "bid": 73.2, "ask": 76.65, "contractSize": "REGULAR", "expiration": 1618531200, "lastTradeDate": 1615476051, "impliedVolatility": 6.591798635253907, "inTheMoney": true }, { "...": " ... etc ..." } ] } ] }
-
-
class
virtual_finance_api.endpoints.yahoo.
Screener
(name: str)[source]¶ Bases:
virtual_finance_api.endpoints.apirequest.VirtualAPIRequest
Screener - class to handle the screener endpoint.
-
DOMAIN
= 'https://finance.yahoo.com'¶
-
ENDPOINT
= 'screener/predefined/{name}'¶
-
EXPECTED_STATUS
= 200¶
-
METHOD
= 'GET'¶
-
RESPONSE_TYPE
= 'txt'¶
-
__init__
(name: str) → None[source]¶ Instantiate a Screener request instance.
Parameters: name (string (required)) – the name of the predefined screener to perform the request for. >>> import virtual_finance_api as fa >>> import virtual_finance_api.endpoints.yahoo as yh >>> client = fa.Client() >>> r = yh.Screener('MOST_SHORTED_STOCKS') >>> rv = client.request(r)
{ "rows": [ { "symbol": "ESPR", "shortName": "Esperion Therapeutics, Inc.", "longName": "Esperion Therapeutics, Inc.", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 29.39, "fmt": "29.39" }, "regularMarketChange": { "raw": 1.0599995, "fmt": "1.06" }, "regularMarketChangePercent": { "raw": 3.7416148, "fmt": "3.74%" }, "regularMarketVolume": { "raw": 1268153, "fmt": "1.268M", "longFmt": "1,268,153" }, "averageDailyVolume3Month": { "raw": 842390, "fmt": "842,390", "longFmt": "842,390" }, "marketCap": { "raw": 821233024, "fmt": "821.233M", "longFmt": "821,233,024" }, "fiftyTwoWeekLow": { "raw": 23.9, "fmt": "23.90" }, "fiftyTwoWeekHigh": { "raw": 53.73, "fmt": "53.73" }, "regularMarketOpen": { "raw": 28.21, "fmt": "28.21" }, "priceHint": 2 }, { "symbol": "CLVS", "shortName": "Clovis Oncology, Inc.", "longName": "Clovis Oncology, Inc.", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 7.86, "fmt": "7.86" }, "regularMarketChange": { "raw": 2.54, "fmt": "2.54" }, "regularMarketChangePercent": { "raw": 47.744358, "fmt": "47.74%" }, "regularMarketVolume": { "raw": 331763706, "fmt": "331.764M", "longFmt": "331,763,706" }, "averageDailyVolume3Month": { "raw": 13614618, "fmt": "13.615M", "longFmt": "13,614,618" }, "marketCap": { "raw": 821605824, "fmt": "821.606M", "longFmt": "821,605,824" }, "fiftyTwoWeekLow": { "raw": 3.98, "fmt": "3.98" }, "fiftyTwoWeekHigh": { "raw": 11.1, "fmt": "11.10" }, "regularMarketOpen": { "raw": 6.4, "fmt": "6.40" }, "priceHint": 2 }, { "symbol": "BLNK", "shortName": "Blink Charging Co. Common Stock", "longName": "Blink Charging Co.", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 38.24, "fmt": "38.24" }, "regularMarketChange": { "raw": 2.290001, "fmt": "2.29" }, "regularMarketChangePercent": { "raw": 6.3699613, "fmt": "6.37%" }, "regularMarketVolume": { "raw": 5620010, "fmt": "5.62M", "longFmt": "5,620,010" }, "averageDailyVolume3Month": { "raw": 11127281, "fmt": "11.127M", "longFmt": "11,127,281" }, "marketCap": { "raw": 1591166464, "fmt": "1.591B", "longFmt": "1,591,166,464" }, "fiftyTwoWeekLow": { "raw": 1.3, "fmt": "1.30" }, "fiftyTwoWeekHigh": { "raw": 64.5, "fmt": "64.50" }, "regularMarketOpen": { "raw": 36.13, "fmt": "36.13" }, "priceHint": 2 }, { "symbol": "SKT", "shortName": "Tanger Factory Outlet Centers, ", "longName": "Tanger Factory Outlet Centers, Inc.", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 16.83, "fmt": "16.83" }, "regularMarketChange": { "raw": -0.3600006, "fmt": "-0.36" }, "regularMarketChangePercent": { "raw": -2.0942445, "fmt": "-2.09%" }, "regularMarketVolume": { "raw": 2925256, "fmt": "2.925M", "longFmt": "2,925,256" }, "averageDailyVolume3Month": { "raw": 5614301, "fmt": "5.614M", "longFmt": "5,614,301" }, "marketCap": { "raw": 1574779776, "fmt": "1.575B", "longFmt": "1,574,779,776" }, "fiftyTwoWeekLow": { "raw": 4.05, "fmt": "4.05" }, "fiftyTwoWeekHigh": { "raw": 22.4, "fmt": "22.40" }, "regularMarketOpen": { "raw": 17, "fmt": "17.00" }, "priceHint": 2 }, { "symbol": "GEO", "shortName": "Geo Group Inc (The) REIT", "longName": "The GEO Group, Inc.", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 8.13, "fmt": "8.13" }, "regularMarketChange": { "raw": 0.16000032, "fmt": "0.16" }, "regularMarketChangePercent": { "raw": 2.0075324, "fmt": "2.01%" }, "regularMarketVolume": { "raw": 7753531, "fmt": "7.754M", "longFmt": "7,753,531" }, "averageDailyVolume3Month": { "raw": 4881275, "fmt": "4.881M", "longFmt": "4,881,275" }, "marketCap": { "raw": 986225920, "fmt": "986.226M", "longFmt": "986,225,920" }, "trailingPE": { "raw": 8.648936, "fmt": "8.65" }, "fiftyTwoWeekLow": { "raw": 6.7, "fmt": "6.70" }, "fiftyTwoWeekHigh": { "raw": 15.45, "fmt": "15.45" }, "regularMarketOpen": { "raw": 8.05, "fmt": "8.05" }, "priceHint": 2 }, { "symbol": "VIVE", "shortName": "Viveve Medical, Inc.", "longName": "Viveve Medical, Inc.", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 3.42, "fmt": "3.4200" }, "regularMarketChange": { "raw": -0.48000002, "fmt": "-0.4800" }, "regularMarketChangePercent": { "raw": -12.307693, "fmt": "-12.31%" }, "regularMarketVolume": { "raw": 1346134, "fmt": "1.346M", "longFmt": "1,346,134" }, "averageDailyVolume3Month": { "raw": 2191777, "fmt": "2.192M", "longFmt": "2,191,777" }, "marketCap": { "raw": 35368616, "fmt": "35.369M", "longFmt": "35,368,616" }, "fiftyTwoWeekLow": { "raw": 2.54, "fmt": "2.5400" }, "fiftyTwoWeekHigh": { "raw": 14.4, "fmt": "14.4000" }, "regularMarketOpen": { "raw": 3.79, "fmt": "3.7900" }, "priceHint": 4 }, { "symbol": "INO", "shortName": "Inovio Pharmaceuticals, Inc.", "longName": "Inovio Pharmaceuticals, Inc.", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 10.11, "fmt": "10.11" }, "regularMarketChange": { "raw": 0.2699995, "fmt": "0.27" }, "regularMarketChangePercent": { "raw": 2.7438974, "fmt": "2.74%" }, "regularMarketVolume": { "raw": 11353412, "fmt": "11.353M", "longFmt": "11,353,412" }, "averageDailyVolume3Month": { "raw": 15485901, "fmt": "15.486M", "longFmt": "15,485,901" }, "marketCap": { "raw": 2099169536, "fmt": "2.099B", "longFmt": "2,099,169,536" }, "fiftyTwoWeekLow": { "raw": 6.53, "fmt": "6.53" }, "fiftyTwoWeekHigh": { "raw": 33.79, "fmt": "33.79" }, "regularMarketOpen": { "raw": 10.04, "fmt": "10.04" }, "priceHint": 2 }, { "symbol": "MAC", "shortName": "Macerich Company (The)", "longName": "The Macerich Company", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 13, "fmt": "13.00" }, "regularMarketChange": { "raw": -0.32999992, "fmt": "-0.33" }, "regularMarketChangePercent": { "raw": -2.4756184, "fmt": "-2.48%" }, "regularMarketVolume": { "raw": 10771702, "fmt": "10.772M", "longFmt": "10,771,702" }, "averageDailyVolume3Month": { "raw": 8939680, "fmt": "8.94M", "longFmt": "8,939,680" }, "marketCap": { "raw": 2011984000, "fmt": "2.012B", "longFmt": "2,011,984,000" }, "fiftyTwoWeekLow": { "raw": 4.81, "fmt": "4.81" }, "fiftyTwoWeekHigh": { "raw": 25.99, "fmt": "25.99" }, "regularMarketOpen": { "raw": 13.29, "fmt": "13.29" }, "priceHint": 2 }, { "symbol": "HTZGQ", "shortName": "HERTZ GLOBAL HOLDINGS INC", "longName": "Hertz Global Holdings, Inc.", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 1.17, "fmt": "1.1700" }, "regularMarketChange": { "raw": 0.07999992, "fmt": "0.0800" }, "regularMarketChangePercent": { "raw": 7.3394427, "fmt": "7.34%" }, "regularMarketVolume": { "raw": 3663758, "fmt": "3.664M", "longFmt": "3,663,758" }, "averageDailyVolume3Month": { "raw": 5426501, "fmt": "5.427M", "longFmt": "5,426,501" }, "marketCap": { "raw": 182761008, "fmt": "182.761M", "longFmt": "182,761,008" }, "fiftyTwoWeekLow": { "raw": 0.4, "fmt": "0.4000" }, "fiftyTwoWeekHigh": { "raw": 9.04, "fmt": "9.0400" }, "regularMarketOpen": { "raw": 1.14, "fmt": "1.1400" }, "priceHint": 4 }, { "symbol": "WKHS", "shortName": "Workhorse Group, Inc.", "longName": "Workhorse Group Inc.", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 16.12, "fmt": "16.12" }, "regularMarketChange": { "raw": 0.7200012, "fmt": "0.72" }, "regularMarketChangePercent": { "raw": 4.675333, "fmt": "4.68%" }, "regularMarketVolume": { "raw": 10435994, "fmt": "10.436M", "longFmt": "10,435,994" }, "averageDailyVolume3Month": { "raw": 21423000, "fmt": "21.423M", "longFmt": "21,423,000" }, "marketCap": { "raw": 1990916864, "fmt": "1.991B", "longFmt": "1,990,916,864" }, "trailingPE": { "raw": 23.028572, "fmt": "23.03" }, "fiftyTwoWeekLow": { "raw": 1.5, "fmt": "1.50" }, "fiftyTwoWeekHigh": { "raw": 42.96, "fmt": "42.96" }, "regularMarketOpen": { "raw": 15.46, "fmt": "15.46" }, "priceHint": 2 }, { "symbol": "KPTI", "shortName": "Karyopharm Therapeutics Inc.", "longName": "Karyopharm Therapeutics Inc.", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 12.06, "fmt": "12.06" }, "regularMarketChange": { "raw": 0.020000458, "fmt": "0.02" }, "regularMarketChangePercent": { "raw": 0.16611676, "fmt": "0.17%" }, "regularMarketVolume": { "raw": 2934156, "fmt": "2.934M", "longFmt": "2,934,156" }, "averageDailyVolume3Month": { "raw": 2796244, "fmt": "2.796M", "longFmt": "2,796,244" }, "marketCap": { "raw": 900089728, "fmt": "900.09M", "longFmt": "900,089,728" }, "fiftyTwoWeekLow": { "raw": 10.57, "fmt": "10.57" }, "fiftyTwoWeekHigh": { "raw": 25.979, "fmt": "25.98" }, "regularMarketOpen": { "raw": 12.1649, "fmt": "12.16" }, "priceHint": 2 }, { "symbol": "VXRT", "shortName": "Vaxart, Inc. - Common Stock", "longName": "Vaxart, Inc.", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 6.88, "fmt": "6.88" }, "regularMarketChange": { "raw": 0.26000023, "fmt": "0.26" }, "regularMarketChangePercent": { "raw": 3.927496, "fmt": "3.93%" }, "regularMarketVolume": { "raw": 6682371, "fmt": "6.682M", "longFmt": "6,682,371" }, "averageDailyVolume3Month": { "raw": 14987160, "fmt": "14.987M", "longFmt": "14,987,160" }, "marketCap": { "raw": 810236992, "fmt": "810.237M", "longFmt": "810,236,992" }, "fiftyTwoWeekLow": { "raw": 1.6, "fmt": "1.60" }, "fiftyTwoWeekHigh": { "raw": 24.9, "fmt": "24.90" }, "regularMarketOpen": { "raw": 6.66, "fmt": "6.66" }, "priceHint": 2 }, { "symbol": "HRTX", "shortName": "Heron Therapeutics, Inc.", "longName": "Heron Therapeutics, Inc.", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 15.65, "fmt": "15.65" }, "regularMarketChange": { "raw": 0.029999733, "fmt": "0.03" }, "regularMarketChangePercent": { "raw": 0.19205976, "fmt": "0.19%" }, "regularMarketVolume": { "raw": 2699888, "fmt": "2.7M", "longFmt": "2,699,888" }, "averageDailyVolume3Month": { "raw": 1026709, "fmt": "1.027M", "longFmt": "1,026,709" }, "marketCap": { "raw": 1430355072, "fmt": "1.43B", "longFmt": "1,430,355,072" }, "fiftyTwoWeekLow": { "raw": 10.74, "fmt": "10.74" }, "fiftyTwoWeekHigh": { "raw": 22.4, "fmt": "22.40" }, "regularMarketOpen": { "raw": 15.73, "fmt": "15.73" }, "priceHint": 2 }, { "symbol": "ARCH", "shortName": "Arch Resources, Inc.", "longName": "Arch Resources, Inc.", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 46.54, "fmt": "46.54" }, "regularMarketChange": { "raw": -0.9300003, "fmt": "-0.93" }, "regularMarketChangePercent": { "raw": -1.9591326, "fmt": "-1.96%" }, "regularMarketVolume": { "raw": 674780, "fmt": "674,780", "longFmt": "674,780" }, "averageDailyVolume3Month": { "raw": 386693, "fmt": "386,693", "longFmt": "386,693" }, "marketCap": { "raw": 712848512, "fmt": "712.849M", "longFmt": "712,848,512" }, "fiftyTwoWeekLow": { "raw": 21.8, "fmt": "21.80" }, "fiftyTwoWeekHigh": { "raw": 58.88, "fmt": "58.88" }, "regularMarketOpen": { "raw": 47.51, "fmt": "47.51" }, "priceHint": 2 }, { "symbol": "PETS", "shortName": "PetMed Express, Inc.", "longName": "PetMed Express, Inc.", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 34, "fmt": "34.00" }, "regularMarketChange": { "raw": 0.11999893, "fmt": "0.12" }, "regularMarketChangePercent": { "raw": 0.35418808, "fmt": "0.35%" }, "regularMarketVolume": { "raw": 780790, "fmt": "780,790", "longFmt": "780,790" }, "averageDailyVolume3Month": { "raw": 868904, "fmt": "868,904", "longFmt": "868,904" }, "marketCap": { "raw": 689217408, "fmt": "689.217M", "longFmt": "689,217,408" }, "trailingPE": { "raw": 22.222223, "fmt": "22.22" }, "fiftyTwoWeekLow": { "raw": 24.8, "fmt": "24.80" }, "fiftyTwoWeekHigh": { "raw": 57, "fmt": "57.00" }, "regularMarketOpen": { "raw": 34.08, "fmt": "34.08" }, "priceHint": 2 }, { "symbol": "UNFI", "shortName": "United Natural Foods, Inc.", "longName": "United Natural Foods, Inc.", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 34.73, "fmt": "34.73" }, "regularMarketChange": { "raw": 1.6199989, "fmt": "1.62" }, "regularMarketChangePercent": { "raw": 4.8927784, "fmt": "4.89%" }, "regularMarketVolume": { "raw": 1967154, "fmt": "1.967M", "longFmt": "1,967,154" }, "averageDailyVolume3Month": { "raw": 1583036, "fmt": "1.583M", "longFmt": "1,583,036" }, "marketCap": { "raw": 1955160064, "fmt": "1.955B", "longFmt": "1,955,160,064" }, "trailingPE": { "raw": 9.922857, "fmt": "9.92" }, "fiftyTwoWeekLow": { "raw": 8.28, "fmt": "8.28" }, "fiftyTwoWeekHigh": { "raw": 41.37, "fmt": "41.37" }, "regularMarketOpen": { "raw": 33.19, "fmt": "33.19" }, "priceHint": 2 }, { "symbol": "BBBY", "shortName": "Bed Bath & Beyond Inc.", "longName": "Bed Bath & Beyond Inc.", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 31.58, "fmt": "31.58" }, "regularMarketChange": { "raw": 0.9899998, "fmt": "0.99" }, "regularMarketChangePercent": { "raw": 3.2363513, "fmt": "3.24%" }, "regularMarketVolume": { "raw": 5879847, "fmt": "5.88M", "longFmt": "5,879,847" }, "averageDailyVolume3Month": { "raw": 13366711, "fmt": "13.367M", "longFmt": "13,366,711" }, "marketCap": { "raw": 3827969792, "fmt": "3.828B", "longFmt": "3,827,969,792" }, "fiftyTwoWeekLow": { "raw": 3.43, "fmt": "3.43" }, "fiftyTwoWeekHigh": { "raw": 53.9, "fmt": "53.90" }, "regularMarketOpen": { "raw": 30.52, "fmt": "30.52" }, "priceHint": 2 }, { "symbol": "IRBT", "shortName": "iRobot Corporation", "longName": "iRobot Corporation", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 119.15, "fmt": "119.15" }, "regularMarketChange": { "raw": 0.6800003, "fmt": "0.68" }, "regularMarketChangePercent": { "raw": 0.5739852, "fmt": "0.57%" }, "regularMarketVolume": { "raw": 966674, "fmt": "966,674", "longFmt": "966,674" }, "averageDailyVolume3Month": { "raw": 1122757, "fmt": "1.123M", "longFmt": "1,122,757" }, "marketCap": { "raw": 3359922688, "fmt": "3.36B", "longFmt": "3,359,922,688" }, "trailingPE": { "raw": 23.180935, "fmt": "23.18" }, "fiftyTwoWeekLow": { "raw": 37.01, "fmt": "37.01" }, "fiftyTwoWeekHigh": { "raw": 197.4, "fmt": "197.40" }, "regularMarketOpen": { "raw": 118.61, "fmt": "118.61" }, "priceHint": 2 }, { "symbol": "GPRE", "shortName": "Green Plains, Inc.", "longName": "Green Plains Inc.", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 25.63, "fmt": "25.63" }, "regularMarketChange": { "raw": 0.54999924, "fmt": "0.55" }, "regularMarketChangePercent": { "raw": 2.1929796, "fmt": "2.19%" }, "regularMarketVolume": { "raw": 1207272, "fmt": "1.207M", "longFmt": "1,207,272" }, "averageDailyVolume3Month": { "raw": 1073568, "fmt": "1.074M", "longFmt": "1,073,568" }, "marketCap": { "raw": 1108781952, "fmt": "1.109B", "longFmt": "1,108,781,952" }, "fiftyTwoWeekLow": { "raw": 3.81, "fmt": "3.81" }, "fiftyTwoWeekHigh": { "raw": 28.77, "fmt": "28.77" }, "regularMarketOpen": { "raw": 23.81, "fmt": "23.81" }, "priceHint": 2 }, { "symbol": "GME", "shortName": "GameStop Corporation", "longName": "GameStop Corp.", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 202.44, "fmt": "202.44" }, "regularMarketChange": { "raw": 0.69000244, "fmt": "0.69" }, "regularMarketChangePercent": { "raw": 0.34200862, "fmt": "0.34%" }, "regularMarketVolume": { "raw": 24677297, "fmt": "24.677M", "longFmt": "24,677,297" }, "averageDailyVolume3Month": { "raw": 44219059, "fmt": "44.219M", "longFmt": "44,219,059" }, "marketCap": { "raw": 14119582720, "fmt": "14.12B", "longFmt": "14,119,582,720" }, "fiftyTwoWeekLow": { "raw": 2.57, "fmt": "2.57" }, "fiftyTwoWeekHigh": { "raw": 483, "fmt": "483.00" }, "regularMarketOpen": { "raw": 195.73, "fmt": "195.73" }, "priceHint": 2 }, { "symbol": "SRNE", "shortName": "Sorrento Therapeutics, Inc.", "longName": "Sorrento Therapeutics, Inc.", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 9.56, "fmt": "9.56" }, "regularMarketChange": { "raw": 0.11000061, "fmt": "0.11" }, "regularMarketChangePercent": { "raw": 1.1640277, "fmt": "1.16%" }, "regularMarketVolume": { "raw": 14339713, "fmt": "14.34M", "longFmt": "14,339,713" }, "averageDailyVolume3Month": { "raw": 18243480, "fmt": "18.243M", "longFmt": "18,243,480" }, "marketCap": { "raw": 2685031168, "fmt": "2.685B", "longFmt": "2,685,031,168" }, "fiftyTwoWeekLow": { "raw": 1.7, "fmt": "1.70" }, "fiftyTwoWeekHigh": { "raw": 19.39, "fmt": "19.39" }, "regularMarketOpen": { "raw": 9.4584, "fmt": "9.46" }, "priceHint": 2 }, { "symbol": "OMER", "shortName": "Omeros Corporation", "longName": "Omeros Corporation", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 19.91, "fmt": "19.91" }, "regularMarketChange": { "raw": 0.9699993, "fmt": "0.97" }, "regularMarketChangePercent": { "raw": 5.1214323, "fmt": "5.12%" }, "regularMarketVolume": { "raw": 695530, "fmt": "695,530", "longFmt": "695,530" }, "averageDailyVolume3Month": { "raw": 775257, "fmt": "775,257", "longFmt": "775,257" }, "marketCap": { "raw": 1233101952, "fmt": "1.233B", "longFmt": "1,233,101,952" }, "fiftyTwoWeekLow": { "raw": 9.25, "fmt": "9.25" }, "fiftyTwoWeekHigh": { "raw": 25.46, "fmt": "25.46" }, "regularMarketOpen": { "raw": 18.93, "fmt": "18.93" }, "priceHint": 2 }, { "symbol": "TMBR", "shortName": "Timber Pharmaceuticals, Inc.", "longName": "Timber Pharmaceuticals, Inc.", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 2.24, "fmt": "2.2400" }, "regularMarketChange": { "raw": 0.01999998, "fmt": "0.0200" }, "regularMarketChangePercent": { "raw": 0.9009, "fmt": "0.90%" }, "regularMarketVolume": { "raw": 3054710, "fmt": "3.055M", "longFmt": "3,054,710" }, "averageDailyVolume3Month": { "raw": 11088947, "fmt": "11.089M", "longFmt": "11,088,947" }, "marketCap": { "raw": 26541760, "fmt": "26.542M", "longFmt": "26,541,760" }, "fiftyTwoWeekLow": { "raw": 0.665, "fmt": "0.6650" }, "fiftyTwoWeekHigh": { "raw": 10.44, "fmt": "10.4400" }, "regularMarketOpen": { "raw": 2.23, "fmt": "2.2300" }, "priceHint": 4 }, { "symbol": "TRHC", "shortName": "Tabula Rasa HealthCare, Inc.", "longName": "Tabula Rasa HealthCare, Inc.", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 44.51, "fmt": "44.51" }, "regularMarketChange": { "raw": 0.11999893, "fmt": "0.12" }, "regularMarketChangePercent": { "raw": 0.27032876, "fmt": "0.27%" }, "regularMarketVolume": { "raw": 678554, "fmt": "678,554", "longFmt": "678,554" }, "averageDailyVolume3Month": { "raw": 474606, "fmt": "474,606", "longFmt": "474,606" }, "marketCap": { "raw": 1098617984, "fmt": "1.099B", "longFmt": "1,098,617,984" }, "fiftyTwoWeekLow": { "raw": 30.12, "fmt": "30.12" }, "fiftyTwoWeekHigh": { "raw": 69.31, "fmt": "69.31" }, "regularMarketOpen": { "raw": 44.33, "fmt": "44.33" }, "priceHint": 2 }, { "symbol": "BGS", "shortName": "B&G Foods, Inc. B&G Foods, Inc.", "longName": "B&G Foods, Inc.", "quoteType": "EQUITY", "currency": "USD", "regularMarketPrice": { "raw": 33.06, "fmt": "33.06" }, "regularMarketChange": { "raw": 1.3400021, "fmt": "1.34" }, "regularMarketChangePercent": { "raw": 4.2244706, "fmt": "4.22%" }, "regularMarketVolume": { "raw": 2256120, "fmt": "2.256M", "longFmt": "2,256,120" }, "averageDailyVolume3Month": { "raw": 2242804, "fmt": "2.243M", "longFmt": "2,242,804" }, "marketCap": { "raw": 2139778816, "fmt": "2.14B", "longFmt": "2,139,778,816" }, "trailingPE": { "raw": 16.205883, "fmt": "16.21" }, "fiftyTwoWeekLow": { "raw": 15.65, "fmt": "15.65" }, "fiftyTwoWeekHigh": { "raw": 47.84, "fmt": "47.84" }, "regularMarketOpen": { "raw": 31.89, "fmt": "31.89" }, "priceHint": 2 } ], "columns": [ { "data": "symbol" }, { "data": "shortName" }, { "data": "longName" }, { "data": "quoteType" }, { "data": "currency" }, { "data": "currencyCode" }, { "data": "underlyingSymbol" }, { "data": "regularMarketPrice" }, { "data": "regularMarketChange" }, { "data": "regularMarketChangePercent" }, { "data": "regularMarketVolume" }, { "data": "averageDailyVolume3Month" }, { "data": "marketCap" }, { "data": "trailingPE" }, { "data": "fiftyTwoWeekLow" }, { "data": "fiftyTwoWeekHigh" }, { "data": "regularMarketOpen" } ], "total": 4422, "filters": {} }
-
-
class
virtual_finance_api.endpoints.yahoo.
Screeners
[source]¶ Bases:
virtual_finance_api.endpoints.apirequest.VirtualAPIRequest
Screeners - class to handle the screeners endpoint.
-
DOMAIN
= 'https://finance.yahoo.com'¶
-
ENDPOINT
= 'screener'¶
-
EXPECTED_STATUS
= 200¶
-
METHOD
= 'GET'¶
-
RESPONSE_TYPE
= 'txt'¶
-
__init__
() → None[source]¶ Instantiate a Screeners APIRequest instance.
returns the available prefined screeners.
>>> import virtual_finance_api as fa >>> import virtual_finance_api.endpoints.yahoo as yh >>> client = fa.Client() >>> r = yh.Screeners() >>> rv = client.request(r) >>> print(json.dumps(r.response, indent=2))
{ "screeners": [ { "title": "Fair Value Screener", "predefinedScr": true, "description": "Undervalued stocks with a strong & consistent history of earnings and revenue growth, sorted by rate of return", "canonicalName": "FAIR_VALUE_SCREENER" }, { "title": "Most Shorted Stocks", "predefinedScr": true, "description": "Stocks with the highest short interest positions from Nasdaq and NYSE reports released every two weeks.", "canonicalName": "MOST_SHORTED_STOCKS" }, { "title": "Undervalued Growth Stocks", "predefinedScr": true, "description": "Stocks with earnings growth rates better than 25% and relatively low PE and PEG ratios.", "canonicalName": "UNDERVALUED_GROWTH_STOCKS" }, { "title": "Growth Technology Stocks", "predefinedScr": true, "description": "Technology stocks with revenue and earnings growth in excess of 25%.", "canonicalName": "GROWTH_TECHNOLOGY_STOCKS" }, { "title": "Day Gainers - US", "predefinedScr": true, "description": "Stocks ordered in descending order by price percent change greater than 3% with respect to the previous close", "canonicalName": "DAY_GAINERS" }, { "title": "Day Losers - US", "predefinedScr": true, "description": "Stocks ordered in ascending order by price percent change with respect to the previous close", "canonicalName": "DAY_LOSERS" }, { "title": "Most Actives - US", "predefinedScr": true, "description": "Stocks ordered in descending order by intraday trade volume", "canonicalName": "MOST_ACTIVES" }, { "title": "Potentially undervalued large cap stocks", "predefinedScr": true, "description": "Large cap stocks that are potentially undervalued, ordered descending by volume", "canonicalName": "UNDERVALUED_LARGE_CAPS" }, { "title": "Aggresive small cap stocks", "predefinedScr": true, "description": "Small cap stocks with high earnings growth rates", "canonicalName": "AGGRESSIVE_SMALL_CAPS" }, { "title": "Small caps with momentum", "predefinedScr": true, "description": "Small cap stocks with percentchange greater than 5%", "canonicalName": "SMALL_CAP_GAINERS" }, { "title": "Top Mutual Funds", "predefinedScr": true, "description": "Funds with Performance Rating of 4 & 5 ordered by Percent Change", "canonicalName": "TOP_MUTUAL_FUNDS" }, { "title": "Portfolio Anchors", "predefinedScr": true, "description": "Funds with Performance Rating of 4 & 5 and top-half returns that could serve as a rock-solid core of an investor's portfolio", "canonicalName": "PORTFOLIO_ANCHORS" }, { "title": "Solid Large Growth Funds", "predefinedScr": true, "description": "Large Growth Funds with Performance Rating of 4 & 5 and top-half returns", "canonicalName": "SOLID_LARGE_GROWTH_FUNDS" }, { "title": "Solid Mid-Cap Growth Funds", "predefinedScr": true, "description": "Mid-Cap Growth Funds with Performance Rating of 4 & 5 and top-half returns", "canonicalName": "SOLID_MIDCAP_GROWTH_FUNDS" }, { "title": "Conservative Foreign Funds", "predefinedScr": true, "description": "Foreign funds with Performance Rating of 4 & 5, low risk and top-half returns", "canonicalName": "CONSERVATIVE_FOREIGN_FUNDS" }, { "title": "High Yield Bond", "predefinedScr": true, "description": "High Yield Bond with Performance Rating of 4 & 5, low risk and top-half returns", "canonicalName": "HIGH_YIELD_BOND" } ] }
-
-
class
virtual_finance_api.endpoints.yahoo.
YhooIndex
(index: str)[source]¶ Bases:
virtual_finance_api.endpoints.apirequest.VirtualAPIRequest
YhooIndex - request class to handle the index overview endpoint.
-
DOMAIN
= 'https://finance.yahoo.com'¶
-
ENDPOINT
= 'quote/{index}/components'¶
-
EXPECTED_STATUS
= 200¶
-
METHOD
= 'GET'¶
-
RESPONSE_TYPE
= 'txt'¶
-
__init__
(index: str) → None[source]¶ Instantiate a YhooIndex APIRequest instance.
Parameters: index (string (required)) – the ticker of the index to perform the request for. Example
>>> import virtual_finance_api as fa >>> import virtual_finance_api.endpoints.yahoo as yh >>> client = fa.Client() >>> r = yh.YhooIndex('^IXIC') >>> rv = client.request(r) >>> print(json.dumps(rv, indent=2))
{ "Symbol": { "0": "TWST", "1": "SLAB", "2": "SCOA", "3": "STRT", "4": "NEBC", "5": "FEYE", "6": "NVCN", "7": "NVCR", "8": "IFRX", "9": "HLAH", "10": "BBI", "11": "OPTN", "12": "FNLC", "13": "SDC", "14": "ESXB", "15": "KLXE", "16": "OPTT", "17": "CVCY", "18": "CVCO", "19": "BBQ", "20": "NMRD", "21": "NVEC", "22": "SCOR", "23": "STRS", "24": "SCR", "25": "NMRK", "26": "CMRX", "27": "SDH", "28": "FNKO", "29": "AGLE" }, "Company Name": { "0": "Twist Bioscience Corporation", "1": "Silicon Laboratories Inc.", "2": "Scion Tech Growth I", "3": "Strattec Security Corporation", "4": "Nebula Caravel Acquisition Corp.", "5": "FireEye, Inc.", "6": "Neovasc Inc.", "7": "NovoCure Limited", "8": "InflaRx N.V.", "9": "Hamilton Lane Alliance Holdings I, Inc.", "10": "Brickell Biotech, Inc.", "11": "OptiNose, Inc.", "12": "The First Bancorp, Inc.", "13": "SmileDirectClub, Inc.", "14": "Community Bankers Trust Corporation", "15": "KLX Energy Services Holdings, Inc.", "16": "Ocean Power Technologies, Inc.", "17": "Central Valley Community Bancorp", "18": "Cavco Industries, Inc.", "19": "BBQ Holdings, Inc.", "20": "Nemaura Medical Inc.", "21": "NVE Corporation", "22": "comScore, Inc.", "23": "Stratus Properties Inc.", "24": "Score Media and Gaming Inc.", "25": "Newmark Group, Inc.", "26": "Chimerix, Inc.", "27": "Global Internet of People, Inc.", "28": "Funko, Inc.", "29": "Aeglea BioTherapeutics, Inc." }, "Last Price": { "0": 116.73, "1": 136.98, "2": 9.71, "3": 43.34, "4": 9.86, "5": 19.76, "6": 1.13, "7": 127.34, "8": 3.89, "9": 9.62, "10": 1.19, "11": 3.53, "12": 28.7, "13": 10.6, "14": 8.52, "15": 16.79, "16": 2.97, "17": 18.93, "18": 225.89, "19": 7.9, "20": 8.02, "21": 69.0, "22": 3.67, "23": 29.95, "24": 24.96, "25": 10.56, "26": 8.94, "27": 3.91, "28": 20.83, "29": 8.13 }, "Change": { "0": -0.14, "1": 0.49, "2": -0.04, "3": 0.2, "4": -0.05, "5": 0.1, "6": 0.01, "7": -1.54, "8": -0.06, "9": -0.16, "10": 0.02, "11": 0.06, "12": 0.62, "13": 0.23, "14": 0.25, "15": 0.56, "16": 0.11, "17": 0.72, "18": 8.72, "19": 0.31, "20": -0.36, "21": 2.95, "22": 0.17, "23": -1.58, "24": -1.36, "25": 0.59, "26": 0.5, "27": -0.27, "28": 1.59, "29": 0.79 }, "% Change": { "0": "-0.12%", "1": "+0.36%", "2": "-0.41%", "3": "+0.46%", "4": "-0.50%", "5": "+0.51%", "6": "+0.89%", "7": "-1.19%", "8": "-1.52%", "9": "-1.64%", "10": "+1.71%", "11": "+1.73%", "12": "+2.21%", "13": "+2.22%", "14": "+3.02%", "15": "+3.45%", "16": "+3.85%", "17": "+3.95%", "18": "+4.02%", "19": "+4.08%", "20": "-4.30%", "21": "+4.47%", "22": "+4.86%", "23": "-5.01%", "24": "-5.17%", "25": "+5.92%", "26": "+5.92%", "27": "-6.46%", "28": "+8.26%", "29": "+10.76%" }, "Volume": { "0": 1445166, "1": 268814, "2": 51867, "3": 24663, "4": 706581, "5": 2884683, "6": 2224508, "7": 951071, "8": 709346, "9": 29364, "10": 1338888, "11": 324179, "12": 11384, "13": 3558728, "14": 47475, "15": 80304, "16": 3178991, "17": 36728, "18": 36770, "19": 63289, "20": 108626, "21": 40170, "22": 518671, "23": 23291, "24": 593852, "25": 898139, "26": 742752, "27": 330357, "28": 5673662, "29": 179662 } }
-
index
¶
-
-
class
virtual_finance_api.endpoints.yahoo.
AdjustType
[source]¶ Bases:
str
,enum.Enum
An enumeration.
-
auto
= 'auto'¶
-
back
= 'back'¶
-
Business Insider endpoints¶
-
class
virtual_finance_api.endpoints.business_insider.
ISIN
(params: dict)[source]¶ Bases:
virtual_finance_api.endpoints.apirequest.VirtualAPIRequest
ISIN - class to handle the ISIN endpoint.
-
DOMAIN
= 'https://markets.businessinsider.com'¶
-
ENDPOINT
= 'ajax/SearchController_Suggest'¶
-
EXPECTED_STATUS
= 200¶
-
METHOD
= 'GET'¶
-
RESPONSE_TYPE
= 'txt'¶
-
__init__
(params: dict) → None[source]¶ Instantiate a ISIN equest instance.
Parameters: params (dict (required)) – max_results: 25 (default), query: <ticker> Raises: ValueError – in case of a missing query parameter. Example:
params:
{ "query": "IBM" }
>>> print(client.request(ISIN(params=params)))
{ "ticker": "IBM", "ISIN": "US4592001014" }
-
Compatibility requests: yfinance¶
This module provides the yfinance compatible requests.
These requests are derived from the Yahoo base classes, but all classes provide yfinance.Ticker compatible properties. So, some return a dict, some return Pandas series and some return a Pandas dataframe, just like yfinance does.
-
class
virtual_finance_api.compat.yfinance.endpoints.
Financials
(ticker)[source]¶ Bases:
virtual_finance_api.endpoints.yahoo.ticker_bundle.Financials
Financials - class to handle the financials endpoint.
-
__init__
(ticker)[source]¶ Instantiate a Financials APIRequest instance.
Parameters: ticker (string (required)) – the ticker to perform the request for. >>> import virtual_finance_api as fa >>> # import the yfinance compatible endpoints >>> import virtual_finance_api.compat.yfinance.endpoints as yf >>> client = fa.Client() >>> r = yf.Financials('IBM') >>> rv = client.request(r)
>>> # now we can use the request properties to fetch data >>> print(r.earnings) >>> # ... earnings as a dict with Pandas Dataframes equal to yfinance
Note
The full response of the parent request is still available in the return value and the response property
>>> # the dataframes combined as JSON >>> yq = dict([(k, json.loads(r.earnings[k].to_json())) for k in ('yearly', 'quarterly')]) >>> print(json.dumps(yq, indent=2))
{ "yearly": { "Revenue": { "2017": 79139000000, "2018": 79591000000, "2019": 77147000000, "2020": 73621000000 }, "Earnings": { "2017": 5753000000, "2018": 8728000000, "2019": 9431000000, "2020": 5590000000 } }, "quarterly": { "Revenue": { "1Q2020": 17571000000, "2Q2020": 18121000000, "3Q2020": 17561000000, "4Q2020": 20368000000 }, "Earnings": { "1Q2020": 1175000000, "2Q2020": 1361000000, "3Q2020": 1698000000, "4Q2020": 1356000000 } } }
-
balancesheet
¶
-
cashflow
¶
-
earnings
¶
-
financials
¶
-
-
class
virtual_finance_api.compat.yfinance.endpoints.
History
(ticker, params)[source]¶ Bases:
virtual_finance_api.endpoints.yahoo.ticker_bundle.History
History - class to handle the history endpoint.
-
__init__
(ticker, params)[source]¶ Instantiate a History APIRequest instance.
Parameters: - ticker (string (required)) – the ticker to perform the request for.
- params (dict (optional)) – dictionary with optional parameters to perform the request parameters default to 1 month of daily (1d) historical data.
{ "range": "max", "interval": "1d", "events": "div,splits" }
>>> import virtual_finance_api as fa >>> import virtual_finance_api.compat.yfinance.endpoints as yf >>> client = fa.Client() >>> r = yf.History('IBM', params=params) >>> rv = client.request(r)
>>> # now we can use the request properties to fetch data >>> print(r.history) >>> # ... the history as a Pandas Dataframe
{}
-
actions
¶
-
dividends
¶
-
history
¶
-
splits
¶
-
-
class
virtual_finance_api.compat.yfinance.endpoints.
Holders
(ticker)[source]¶ Bases:
virtual_finance_api.endpoints.yahoo.ticker_bundle.Holders
Holders - class to handle the holders endpoint.
-
__init__
(ticker)[source]¶ Instantiate a Holders APIRequest instance.
Parameters: ticker (string (required)) – the ticker to perform the request for. >>> import virtual_finance_api as fa >>> import virtual_finance_api.compat.yfinance.endpoints as yf >>> client = fa.Client() >>> r = yf.Holders('IBM') >>> rv = client.request(r)
>>> # now we can use the request properties to fetch data >>> print(r.majors) >>> # ... the majors as a Pandas Dataframe equal to yfinance
>>> # the JSON representation of the dataframe >>> print(r.majors.to_json())
{ "0": { "0": "0.13%", "1": "58.58%", "2": "58.66%", "3": "2561" }, "1": { "0": "% of Shares Held by All Insider", "1": "% of Shares Held by Institutions", "2": "% of Float Held by Institutions", "3": "Number of Institutions Holding Shares" } }
-
institutional
¶
-
major
¶
-
mutualfund
¶
-
-
class
virtual_finance_api.compat.yfinance.endpoints.
Options
(ticker, params=None)[source]¶ Bases:
virtual_finance_api.endpoints.yahoo.ticker_bundle.Options
Options - class to handle the options endpoint.
-
__init__
(ticker, params=None)[source]¶ Instantiate a Profile APIRequest instance.
Parameters: ticker (string (required)) – the ticker to perform the request for. >>> import virtual_finance_api as fa >>> # import the yfinance compatible endpoints >>> import virtual_finance_api.compat.yfinance.endpoints as yf >>> client = fa.Client() >>> r = yf.Options('IBM') >>> rv = client.request(r)
>>> # now we can use the request properties to fetch data >>> print(r.options) >>> # ... all the expiration dates
[ "2021-03-26", "2021-04-01", "2021-04-09", "2021-04-16", "2021-04-23", "2021-04-30", "2021-05-21", "2021-06-18", "2021-07-16", "2021-09-17", "2021-10-15", "2022-01-21", "2023-01-20" ]
>>> # and, just like yfinance: the dataframes with calls and puts >>> print(r.option_chain('2021-03-26')[0] # all calls >>> print(r.option_chain('2021-03-26')[1] # all puts
-
option_chain
(date=None, proxy=None, tz=None)[source]¶ option_chain - return option chain dataframes for calls/puts.
-
options
¶
-
-
class
virtual_finance_api.compat.yfinance.endpoints.
Profile
(ticker)[source]¶ Bases:
virtual_finance_api.endpoints.yahoo.ticker_bundle.Profile
Profile - class to handle the profile endpoint.
-
COMPONENTS
= ['defaultKeyStatistics', 'details', 'summaryProfile', 'recommendationTrend', 'financialsTemplate', 'earnings', 'price', 'financialData', 'quoteType', 'calendarEvents', 'summaryDetail', 'symbol', 'esgScores', 'upgradeDowngradeHistory', 'pageViews']¶
-
__init__
(ticker)[source]¶ Instantiate a Profile APIRequest instance.
Parameters: ticker (string (required)) – the ticker to perform the request for. >>> import virtual_finance_api as fa >>> # import the yfinance compatible endpoints >>> import virtual_finance_api.compat.yfinance.endpoints as yf >>> client = fa.Client() >>> r = yf.Profile('IBM') >>> rv = client.request(r)
>>> # now we can use the request properties to fetch data >>> print(r.calendar) >>> # ... the calendar as a Pandas Dataframe
>>> # the JSON representation of the dataframe >>> print(r.calendar.to_json())
{ "Value": { "Earnings Date": 1618790400000, "Earnings Average": 1.63, "Earnings Low": 1.39, "Earnings High": 1.82, "Revenue Average": 17377200000, "Revenue Low": 17108000000, "Revenue High": 17607300000 } }
-
calendar
¶
-
info
¶
-
recommendations
¶
-
sustainability
¶
-
yfinance Ticker compatibility class¶
The Ticker-class aims to be the compatible counterpart of yfinance.Ticker. The Ticker class basically wraps all the requests needed to represent all the properties like yfinance.Ticker.
This class is provided for compatibility reasons. If you only need certain data, the advise is to use the request providing that data.
If you still want the yfinance compatible output you can use one of the compat.yfinance.endpoints request classes.
The other option is to use one tof the extensions.stdjson request classes. These classes provide a standardized JSON response.
-
class
virtual_finance_api.compat.yfinance.
Ticker
(ticker)[source]¶ Bases:
object
-
__init__
(ticker)[source]¶ Instantiate a Ticker instance.
Parameters: ticker (string (required)) – the ticker to perform the request for. The constructor will instantiate all the requests needed to fetch data for certain properties. But the requests will only be executed when the data is asked for.
>>> import json >>> import virtual_finance_api.compat.yfinance as yf >>> t = yf.Ticker('IBM')
>>> # now we can use the request properties to fetch data >>> print(t.earnings) >>> print(t.quarterly_earnings) >>> # ... earnings as a dict with Pandas Dataframes equal to yfinance
>>> # the dataframes combined as JSON >>> yq = dict([(k, json.loads(getattr(t, k).to_json())) for k in ('earnings', 'quarterly_earnings')]) >>> print(json.dumps(yq, indent=2))
{ "yearly": { "Revenue": { "2017": 79139000000, "2018": 79591000000, "2019": 77147000000, "2020": 73621000000 }, "Earnings": { "2017": 5753000000, "2018": 8728000000, "2019": 9431000000, "2020": 5590000000 } }, "quarterly": { "Revenue": { "1Q2020": 17571000000, "2Q2020": 18121000000, "3Q2020": 17561000000, "4Q2020": 20368000000 }, "Earnings": { "1Q2020": 1175000000, "2Q2020": 1361000000, "3Q2020": 1698000000, "4Q2020": 1356000000 } } }
-
actions
¶
-
balance_sheet
¶
-
balancesheet
¶
-
calendar
¶
-
cashflow
¶
-
dividends
¶
-
earnings
¶
-
financials
¶
-
info
¶
-
institutional_holders
¶
-
isin
¶
-
major_holders
¶
-
mutualfund_holders
¶
-
options
¶
-
quarterly_balance_sheet
¶
-
quarterly_balancesheet
¶
-
quarterly_cashflow
¶
-
quarterly_earnings
¶
-
quarterly_financials
¶
-
recommendations
¶
-
splits
¶
-
sustainability
¶
-
Indices and tables¶
Changelog¶
[Unreleased]¶
v0.6.0 (2021-06-01)¶
New Features¶
- [types] ReportPeriod added
Bug Fixes¶
- [History] handle adjustment of data correct
Refactoring¶
- [cli] use typer instead of click
- option processing regarding History requests split hprocopt into procopt for the yahoo History request and yfprocopt for the yfinance compat. History request
Administration and Chores¶
- [requirements] update dependencies
v0.5.0 (2021-05-30)¶
New Features¶
- [types] types Period, Interval added
Refactoring¶
- [cli] type hints, apply yahoo types
- [tests] switch to pytest from unittest
- [cli] rename entrypoint to vfapi
Documentation Changes¶
- [README] minor changes/extension in install
Administration and Chores¶
- [setup] correct URL to repository
v0.4.3 (2021-05-17)¶
Documentation Changes¶
- [README] add codestyle ‘black’ badge
Administration and Chores¶
- [setup.py] delete ‘version=’ from version
v0.4.1 (2021-04-15)¶
Style Fixes¶
- [black] black applied to library + tests + setup.py
Refactoring¶
- [endpoints] make the basic requests return the standardized JSON of the extensions.stdjson requests. Remove the extensions.stdjson. Modify compat.yfinance to use the standardized JSON.
Administration and Chores¶
- [pre-commit] added / configured pre-commit
v0.4.0 (2021-04-13)¶
New Features¶
- [endpoints] extensions.stdjson, a standardized JSON layer
Tests¶
- [unittest] unittests regarding virtual_finance_api.extensions.stdjson virtual_finance_api.client
- [unittest] yfinance Ticker class tests extended
Bug Fixes¶
- [Makefile] prevent link creation by pandoc
- [compat.yfinance] Ticker property code fixed for properties: dividends splits actions
Style Fixes¶
- minor EOL whitespace / empty line changes
Refactoring¶
- [enpoints] History, Options now VirtualAPIRequests
Documentation Changes¶
- [endpoints] extensions.stdjson added
Administration and Chores¶
- [CHANGELOG] templates to generate CHANGELOG
v0.3.1 (2021-03-30)¶
Documentation Changes¶
- [README] badges added
- [README] extended with various components
Administration and Chores¶
- [config] setup.py include requirements correctly
- [travis] fix deployment to pypi
v0.3.0 (2021-03-30)¶
New Features¶
- [endpoints] yfinance compatibility endpoints
Tests¶
- [unitttest] yfinance compatible endpoint tests
Bug Fixes¶
- [docs] requirements_dev: missing packages
Refactoring¶
- [endpoints] use rapidjson instead of json
Administration and Chores¶
- [config] requirements, Makefile update requirements: include rapidjson Makefile extended
- [config] update travis / tox config
v0.2.1 (2021-03-27)¶
Documentation Changes¶
- [sphinx] initial documentation setup
- [README] example added
v0.2.0 (2021-03-26)¶
New Features¶
- [yahoo endpoints] Yahoo endpoint request classes
- [endpoints] business_insider ISIN request class
- [generic] ISINCode class to handle ISIN-codes
- [base] base classes classes to handle and setup API requests
Tests¶
- [yahoo endpoints] unittests for yahoo endpoints
- [unittests] test business_insider endpoint(s)
- [unittest] tests to test Client and generic module
Administration and Chores¶
- [config] setup travis for coverage, add badges to README.rst
- [config] setup.py and requirements
- [travis] removed unsupported python 3.5
- [config] fix tox config
- [requirements] packages added