Welcome to plutoPy’s documentation!

model

Fred

St. Louis Fed FRED cache

sources: https://fred.stlouisfed.org/

class plutoPy.model.Fred.Meta(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizUs

Query the FRED meta-data cache

FREQUENCY

‘D’ for day, ‘M’ for month, ‘Q’ for quarter, etc.

NAME

title

SEASON_ADJUST

‘SA’ for seasonally adjusted, etc.

SERIES_ID

use this to query the time-series

TICKER

FRED id

UNITS

‘Miles’, ‘Million of Dollars’, etc.

class plutoPy.model.Fred.TimeSeries(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizUs

Query the FRED time-series cache

SERIES_ID
TIME_STAMP
VAL

World Bank GEM

World Bank Global Economic Monitor data

sources: https://worldbank.org

class plutoPy.model.WorldBank.Meta(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizUs

Query to find the country and indicator id’s of the Global Economic Monitor data published by the World Bank

COUNTRY_ID
COUNTRY_KEY

COUNTRY_KEY and INDICATOR_KEY uniquely identify a time-series

COUNTRY_NAME
END_YEAR

ending year from which time-series is available

INDICATOR_ID
INDICATOR_KEY

COUNTRY_KEY and INDICATOR_KEY uniquely identify a time-series

INDICATOR_NAME
START_YEAR

starting year from which time-series is available

class plutoPy.model.WorldBank.TimeSeries(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizUs

Query the Global Economic Monitor data published by the World Bank

COUNTRY_KEY

COUNTRY_KEY and INDICATOR_KEY uniquely identifies the time-series

INDICATOR_KEY

COUNTRY_KEY and INDICATOR_KEY uniquely identifies the time-series

VALUE
YEAR

InternationalMonetaryFund

International Monetary Fund data

sources: https://www.imf.org

class plutoPy.model.InternationalMonetaryFund.Meta(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizUs

Query IMF meta-data based on geography/indicator. Then use the ID obtained here to query the time-series

AREA

India, Great Britain, United States

AREA_CODE

IN, GB, US…

DATA_DESCRIPTION

description of the data: ‘Primary Commodity Prices, Copper’, ‘Economic Activity, Industrial Production, Index’

DATA_KEY

IMF internal key: PCOPP, AIP_IX

END_YEAR

the year till which TimeSeries data is available

FREQ

A for Annual; Q for Quarterly; M for Monthly

ID

use to query TimeSeries

START_YEAR

the year from which TimeSeries data is available

UNIT_MEASURE

IX for Index; USD for Dollar

UNIT_MULT

0, 3, 6 to multiply by none, thousands and millions

class plutoPy.model.InternationalMonetaryFund.TimeSeries(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizUs

Query the IMF time-series data based on the Meta ID

AUTO_ID
ID

get this from Meta

MONTH
VALUE
YEAR

NASDAQOMX Indices

NASDAQOMX Indices

sources: https://indexes.nasdaqomx.com/ https://www.quandl.com/

class plutoPy.model.NasdaqOmx.Meta(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizUs2

Query to find the time-series id of total-return indices published by the NasdaqOmx

CODE

NasdaqOmx index code

ID

time-series id to be used to query NasdaqOmxTimeSeries

NAME

name of the index

class plutoPy.model.NasdaqOmx.TimeSeries(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizUs2

Query the index time-series published by the NasdaqOmx

CLOSE
ID

time-series id

TIME_STAMP

Yield Curves

Yield curves

sources: https://www.ccilindia.com http://treasury.gov https://www.ecb.europa.eu

class plutoPy.model.YieldCurve.EuroArea(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query Euro area yield curves published by the ECB

CURVE_ID

G_N_A for AAA rated only. G_N_C for all (including AAA) rated.

TENOR_M

month

TENOR_Y

year

TIME_STAMP
VALUE

yield

class plutoPy.model.YieldCurve.IndiaZeroCoupon(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the Indian Zero Coupon Yield Curve published by CCIL

MATURITY
TIME_STAMP
YIELD
class plutoPy.model.YieldCurve.UsTreasury(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the Daily Treasury Yield Curve Rates published by US Treasury

M1

‘M’ implies month

M3
M6
TIME_STAMP
Y1

‘Y’ implies year

Y10
Y2
Y20
Y3
Y30
Y5
Y7

Indices

Indices

sources:
https://nseindia.com/ https://bseindia.com/ https://www.ccilindia.com https://finance.yahoo.com/ https://indices.barclays
class plutoPy.model.Indices.BarclaysMeta(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizUs2

Meta information about the BarclaysTimeSeries by TICKER

CURRENCY
DATE_BASE

Date from when the index is calculated

DATE_LIVE

Date when the index went live

FAMILY
NAME
RETURN_TYPE

Excess/Price/Total Return

TICKER
class plutoPy.model.Indices.BarclaysTimeSeries(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizUs2

Query the index time-series published by Barclays

CLOSE
TICKER
TIME_STAMP
class plutoPy.model.Indices.BseConstituents(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the latest constituents of BSE indices

CODE

BSE security code

NAME

name of the index. Use this to query the constituents

SECURITY_NAME

name of the security

SYMBOL

NSE symbol, if the security is listed in the NSE

TIME_STAMP

date when the constituents of the index was updated

class plutoPy.model.Indices.BseTimeSeries(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the index time-series published by the BSE

CLOSE
HIGH
LOW
NAME
OPEN
TIME_STAMP
class plutoPy.model.Indices.IndiaGsecTimeSeries(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the Indian Government Soverign Bond index time-series published by the CCIL

COUPON

wavg coupon

DURATION

wavg duration

NAME

tenor bucket. possible values: 0_5, 5_10, 10_15, 15_20, 20_30

PRI

Principal Return Index. based on clean price

TIME_STAMP
TRI

Total Return Index. the absolute return that the tenor bucket offers. includes coupon accrued and capital gains (losses)

YTM

wavg yield-to-maturity

class plutoPy.model.Indices.IndiaVixTimeSeries(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the India VIX time-series data published by the NSE

CLOSE
HIGH
LOW
OPEN
TIME_STAMP
class plutoPy.model.Indices.NseConstituents(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the latest constituents of NSE indices

CAP_WEIGHT
INDUSTRY
NAME

name of the index. Use this to query the constituents

SYMBOL
TIME_STAMP

date when the constituents of the index was updated

class plutoPy.model.Indices.NseTimeSeries(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the index time-series published by the NSE

CLOSE
HIGH
LOW
NAME

name of the index. Use this to query the time-series

OPEN
TIME_STAMP
VOLUME
class plutoPy.model.Indices.YahooFinanceTimeSeries(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizUs2

Query the index time-series published by Yahoo Finance

CLOSE
CLOSE_ADJ
HIGH
LOW
NAME

name of the index. Use this to query the time-series

OPEN
TIME_STAMP
VOLUME

US ETFs

ETFs listed in the US

class plutoPy.model.ETFsUs.Meta(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the meta-data

ASSET_CLASS
AUM
EXPENSE_RATIO
ISSUER
LAUNCH_DATE
NAME
SEGMENT
SYMBOL
UNDERLYING_INDEX

MutualFundsIndia

Mutual Funds India

sources: https://www.amfiindia.com/

class plutoPy.model.MutualFundsIndia.AumFundwise(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the fund-wise assets under management (AUM) of different asset managers

AUTO_ID
AVG_AUM_FOFD

AUM held by Fund-of-Funds

AVG_AUM_WO_FOFD

excluding AUM held by Fund-of-Funds

FUND

name of the manager

PERIOD
class plutoPy.model.MutualFundsIndia.AumSchemewise(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the scheme-wise assets under management (AUM) of different asset managers and their ‘schemes’

AUTO_ID
AVG_AUM_FOFD

AUM held by Fund-of-Funds

AVG_AUM_WO_FOFD

excluding AUM held by Fund-of-Funds

PERIOD
SCHEME_CODE

code given by AMFI

SCHEME_NAME

name of the fund - can change multiple times over its life

class plutoPy.model.MutualFundsIndia.Meta(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the meta-data

AS_OF

data capture date

BENCH_NOW

benchmark being used currently

BENCH_ORIG

original benchmark

CATEGORY

Mid-Cap, Index Funds, etc…

EXPENSE

Based on prospectus (%)

EXPENSE_RATIO

Based on what the fund actually charged (%)

SCHEME_CODE

code given by AMFI

TURNOVER_RATIO

churn

class plutoPy.model.MutualFundsIndia.NavTimeSeries(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query for the NAVs of different funds

NAV

before exit loads, STT, etc…

SCHEME_CODE

code given by AMFI

SCHEME_NAME

name of the fund - can change multiple times over its life

TIME_STAMP

mostly daily but some funds declare only twice a week. bond market holidays are different from equity market holidays.

class plutoPy.model.MutualFundsIndia.Portfolio(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query for the monthly reported portfolios of different funds

AUTO_ID
INDUSTRY_BSE

BSE’s SECTOR classification.

INSTRUMENT

EQUITY, BOND, OTHER… broad classification

INSTRUMENT_TYPE

E, BT, CR… clarifies INSTRUMENT

NAME

name of the position

PORTFOLIO_DATE

mostly declared once a month. available after the 10th of each month.

SCHEME_CODE

code given by AMFI

SECTOR

BASIC MATERIALS, FINANCIAL SERVICES, CONSUMER DEFENSIVE, etc…

SYMBOL

where available, the NSE ticker/symbol of the position

WEIGHTAGE

weightage of the position in the portfolio (%)

US Equities

Equities US

sources: https://iexcloud.io https://www.sec.gov/

class plutoPy.model.EquitiesUs.EodAdjustedTimeSeries(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizUs2

Query end-of-day price and volume time-series adjusted for splits, bonus and dividends for listed stocks

CLOSE
HIGH
LOW
OPEN
SYMBOL
TIME_STAMP
VOLUME
class plutoPy.model.EquitiesUs.SecFilings(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizUs2

Links to SEC filings. Useful to keep track of M&A events in your portfolio

ACC_NO
FILING_DATE
FILING_TYPE

SC14D9C => acquisitions; DEFM14A => mergers

FILING_URL
FORM_NAME
SYMBOL
class plutoPy.model.EquitiesUs.SecMeta(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizUs2

Meta information of companies in the SEC EDGAR database. Useful for SIC.

CIK

Central Index Key

NAME
SIC

Standard Industrial Classification code

SIC_DESC

Standard Industrial Classification

SYMBOL
class plutoPy.model.EquitiesUs.Tickers(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizUs2

Query meta data of listed equity (common stock) tickers

EXCHANGE

listed exchange

MKT_CAP

market cap in USD

NAME

name of the company

SYMBOL

ticker/stock symbol. for eg: AAPL

EquitiesIndiaNse

Equities India NSE

sources: https://nseindia.com/

class plutoPy.model.EquitiesIndiaNse.CorporateActions(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the corporate actions for listed stocks

EX_DATE
PURPOSE
SERIES
SYMBOL
WHEN_UPDATED
class plutoPy.model.EquitiesIndiaNse.CorporateEvents(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the corporate events for listed stocks

AUTO_ID
DISC_DATE

when was the event disclosed?

EVENT_DATE

when was the event held?

PURPOSE
SYMBOL
class plutoPy.model.EquitiesIndiaNse.CorporateResults(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query to CorporateResults for a specific period and stock

AUTO_ID
H1

section 1

H2

section 2

H3

section 3

H4

section 4

KEY
REF_ID

lookup CorporateResultsMeta to get this value

VALUE
class plutoPy.model.EquitiesIndiaNse.CorporateResultsMeta(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query to obtain the REF_ID to lookup CorporateResults for a specific period

BROADCAST_DATE
IS_AUDITED
IS_CONSOLIDATED
IS_CUMULATIVE
PERIOD
PERIOD_BEGIN
PERIOD_END
REF_ID

use this to query CorporateResults

SYMBOL
class plutoPy.model.EquitiesIndiaNse.DailyReturns(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the percentage daily return (close-to-close) time-series for listed stocks

SYMBOL
TIME_STAMP
VALUE
class plutoPy.model.EquitiesIndiaNse.EodAdjustedTimeSeries(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizDyn

Query end-of-day price and volume time-series adjusted for splits, bonus and dividends for listed stocks

CLOSE
HIGH
LOW
OPEN
SYMBOL
TIME_STAMP
VOLUME
class plutoPy.model.EquitiesIndiaNse.EodTimeSeries(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query unadjusted end-of-day price and volume time-series for listed stocks

CLOSE

usually a weighted average of price x volume of the last 15-minutes of trading

HIGH
LAST

last traded price

LOW
OPEN
SERIES
SYMBOL
TIME_STAMP
VOLUME
class plutoPy.model.EquitiesIndiaNse.MarketCapDecile(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query market-cap decile of of listed equity tickers

DECILE
SYMBOL
TIME_STAMP
class plutoPy.model.EquitiesIndiaNse.MiscInfo(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query miscellaneous information of listed equity tickers

D2T_PCT

delivery percentage. % of shares which were not squared off the same day out of total shares traded

FF_MKT_CAP_CR

free-float market-cap in crores

LOWER_PX_BAND

trading is halted if the stock trades below this level

SYMBOL
TIME_STAMP
UPPER_PX_BAND

trading is halted if the stock trades above this level

class plutoPy.model.EquitiesIndiaNse.Tickers(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query meta data of listed equity tickers

DATE_LISTING

date of birth of the ticker

FACE

a stock’s face value is the initial cost of the stock, as indicated on the certificate

ISIN

unique identifier

MARKET_LOT

usually, you can trade just 1 stock. but sometimes, only in multiples of “market lot”

NAME

name of the security. for eg: Infosys Limited

PAID_UP

paid-up capital is the amount of money a company has received from shareholders in exchange for shares of stock

SERIES

EQ/BE/BZ as assigned by the NSE

SYMBOL

ticker/stock symbol. for eg: INFY

Equities Futures and Options traded on the NSE

Equities Futures and Options traded on the NSE

sources: https://www.nseindia.com/

class plutoPy.model.EquitiesFuturesAndOptionsIndiaNse.FuturesEodTimeSeries(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the end-of-day prices of equity futures contracts traded on the NSE

CLOSE

usually a weighted average of price x volume of the last 15-minutes of trading

CONTRACTS
EXPIRY
HIGH
LOW
OI
OPEN
SETTLE
SYMBOL
TIME_STAMP
VALUE
class plutoPy.model.EquitiesFuturesAndOptionsIndiaNse.LotSize(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the lot-size of equity futures and options contracts traded on the NSE

CONTRACT

expiry year and month. the ‘date’ part is always set to 1.

LOT_SIZE
SYMBOL
class plutoPy.model.EquitiesFuturesAndOptionsIndiaNse.OptionGreeks(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the end-of-day option greeks of equity options contracts traded on the NSE

DELTA
EXPIRY
GAMMA
IV
LAMBDA
MODEL_PRICE
OTYPE

CE - European calls; PE - European puts

RATE

the interest rate used in the calculation

RHO
SIGMA

the volatility assumption used in the calculation

STRIKE
SYMBOL
THETA
TIME_STAMP
TTM

time to maturity measured in years

VEGA
class plutoPy.model.EquitiesFuturesAndOptionsIndiaNse.OptionsEodTimeSeries(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the end-of-day prices of equity options contracts traded on the NSE

CLOSE

usually a weighted average of price x volume of the last 15-minutes of trading

CONTRACTS
EXPIRY
HIGH
LOW
OI
OPEN
OTYPE

CE - European calls; CA - American calls, etc…

SETTLE
STRIKE
SYMBOL
TIME_STAMP
VALUE

Commodity Futures And Options

Commodity Futures and Options

sources: https://www.mcxindia.com/ https://www.ncdex.com/ https://www.cmegroup.com/

class plutoPy.model.CommodityFuturesAndOptions.CmeEod(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the end-of-day prices of commodity futures contracts traded on the COMEX and NYMEX

CONTRACT
CONTRACT_DAY
CONTRACT_MONTH
CONTRACT_YEAR
HIGH
LAST
LOW
OPEN
PRODUCT_DESCRIPTION
PRODUCT_SYMBOL
SETTLE
TIME_STAMP
VOLUME
class plutoPy.model.CommodityFuturesAndOptions.McxEod(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the end-of-day prices of commodity contracts traded on the MCX

CLOSE
CONTRACT
EXPIRY
EXPIRY_SERIES

0 implies current month contract, etc.

HIGH
LOW
OI

open interest

OPEN
OTYPE

CE - European calls; PE - European puts; XX , FUTCOM - futures

STRIKE

if OTYPE is CE or PE, then the strike

TIME_STAMP
VALUE

value of the contracts traded

VOL

quantity of the underlying commodity traded in VOL_UNITS

VOLUME

number of contracts traded

VOL_UNITS

BALES, KGS, BBL, etc…

class plutoPy.model.CommodityFuturesAndOptions.NcdexEod(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the end-of-day prices of commodity contracts traded on the NCDEX

CLOSE
COMMODITY

Crude palm oil, TURMERIC, etc…

CONTRACT
DELIVERY_CENTRE

Ahmedabad, Kandla, etc…

EXPIRY
EXPIRY_SERIES

0 implies current month contract, etc.

HIGH
LAST_TRADE

day on which the last trade occurred

LOW
MEASURE

for VOLUME. MT, LOT, etc

OI

open interest

OPEN
PRICE_UNIT

RS/QUINTAL, RS/10KGS, RS/BALES, etc…

TIME_STAMP
TRADED_NUM

number of trades

TRADED_QTY

number of contracts traded

TRADED_VAL

traded value in Rs. lakhs

Currencies

Currencies

sources: https://www.alphavantage.co https://www.nseindia.com/

class plutoPy.model.Currencies.Av30minTimeSeries(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizBeka

Query the 30-min bar of currency USD-fx time-series published by AlphaVantage

CLOSE
HIGH
LOW
OPEN
SYMBOL
TIME_STAMP

in UTC

class plutoPy.model.Currencies.AvEodTimeSeries(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizBeka

Query the end-of-day currency USD-fx time-series published by AlphaVantage

CLOSE
HIGH
LOW
OPEN
SYMBOL
TIME_STAMP

in UTC

class plutoPy.model.Currencies.NseFuturesTimeSeries(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the currency futures time-series published by the NSE

CLOSE
CONTRACTS
EXPIRY
HIGH
LOW
OI
OPEN
SETTLE
SYMBOL
TIME_STAMP
VALUE
class plutoPy.model.Currencies.NseOptionsTimeSeries(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query the currency option time-series published by the NSE

CLOSE
CONTRACTS
EXPIRY
HIGH
LOW
OI
OPEN
OTYPE
SETTLE
STRIKE
SYMBOL
TIME_STAMP
VALUE

Investment Flows India

Investment Flows India

sources: http://www.cdslindia.com https://www.sebi.gov.in

class plutoPy.model.InvestmentFlowsIndia.DiiCashMarket(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query purchases and sales of debt and equity by Domestic Institutional Investors

BUY_VALUE

in Rs.

SECURITY_TYPE
SELL_VALUE

in Rs.

TIME_STAMP
class plutoPy.model.InvestmentFlowsIndia.DiiDerivativesMarket(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query purchases and sales of futures and options by Domestic Institutional Investors

BUY_CONTRACTS
BUY_VALUE

in Rs.

OI_CONTRACTS
OI_VALUE

in Rs.

SECURITY_TYPE
SELL_CONTRACTS
SELL_VALUE

in Rs.

TIME_STAMP
class plutoPy.model.InvestmentFlowsIndia.FiiCashMarket(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query purchases and sales of debt and equity by Foreign Institutional Investors

BUY_VALUE

in Rs.

CONVERSION_RATE_USDINR
NET_VALUE_DLR

net flow in USD

ROUTE

Stock Exchange OR Primary market

SECURITY_TYPE
SELL_VALUE

in Rs.

TIME_STAMP
class plutoPy.model.InvestmentFlowsIndia.FiiDerivativesMarket(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockViz

Query purchases and sales of futures and options by Foreign Institutional Investors

BUY_CONTRACTS
BUY_VALUE

in Rs.

OI_CONTRACTS
OI_VALUE

in Rs.

SECURITY_TYPE
SELL_CONTRACTS
SELL_VALUE

in Rs.

TIME_STAMP

Fama-French

Fama French Data-sets

source: http://mba.tuck.dartmouth.edu/pages/faculty/ken.french/index.html

class plutoPy.model.FamaFrench.FiveFactor3x2Daily(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizUs2

Query the Fama-French 5-factor daily returns (http://mba.tuck.dartmouth.edu/pages/faculty/ken.french/Data_Library/f-f_5_factors_2x3.html)

KEY_ID

SMB, RMW, RF, MKT-RF, HML, CMA

RET
TIME_STAMP
class plutoPy.model.FamaFrench.Industry49Daily(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizUs2

Query the Fama-French daily returns of 49 different industries (http://mba.tuck.dartmouth.edu/pages/faculty/ken.french/Data_Library/det_49_ind_port.html)

KEY_ID

AGRIC, BANKS, CHEMS, etc…

RET
RET_TYPE

AVWRD - Average Value Weighted Returns Daily, AEWRD - Average Equal Weighted Returns Daily

TIME_STAMP
class plutoPy.model.FamaFrench.MomentumDaily(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizUs2

Query the Fama-French daily returns of momentum factor and portfolios factor: https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/Data_Library/det_mom_factor_daily.html portfolios: https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/Data_Library/det_10_port_form_pr_12_2_daily.html

KEY_ID

MOM, HI_PRIOR, LO_PRIOR, PRIOR_[2..9]

RET
RET_TYPE

M for KEY_ID = MOM, AVWRD - Average Value Weighted Returns Daily, AEWRD - Average Equal Weighted Returns Daily

TIME_STAMP
class plutoPy.model.FamaFrench.MomentumMonthly(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizUs2

Query the Fama-French daily returns of momentum factor and portfolios factor: https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/Data_Library/det_mom_factor.html portfolios: https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/Data_Library/det_10_port_form_pr_12_2.html

KEY_ID

MOM, HI_PRIOR, LO_PRIOR, PRIOR_[2..9]

RET
RET_TYPE

M for KEY_ID = MOM, AVWRD - Average Value Weighted Returns Daily, AEWRD - Average Equal Weighted Returns Daily

TIME_STAMP

Yale/Shiller

Yale/Shiller Data-sets

source: http://www.econ.yale.edu/~shiller/data.htm

class plutoPy.model.Yale.Confidence(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizUs2

Query Stock Market Confidence Indexes produced by the Yale School of Management. (https://svz.bz/2NzetU3)

NAME
STD_ERR
TIME_STAMP
VALUE
class plutoPy.model.Yale.SP500(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, plutoPy.model.Db.StockVizUs2

Query the monthly stock price, dividends, and earnings data and the consumer price index.

CAPE
CLOSE
CLOSE_REAL
CPI
DIVIDEND
DIVIDEND_REAL
EARNINGS
EARNINGS_REAL
LONG_IR
TIME_STAMP

Using Fred

Notebooks for this code: python; R.

"""This example illustrates how to get a list of all Fred time-series that have 'India' in its title."""

import sys
sys.path.append("..")
    
from sqlalchemy import func
from plutoPy.model import RoutingSession, Fred

#a list of india focused indices mainted by the Fred
results = RoutingSession.session.query(Fred.Meta.SERIES_ID, Fred.Meta.TICKER, Fred.Meta.NAME, func.min(Fred.TimeSeries.TIME_STAMP).label("start_dt"), func.max(Fred.TimeSeries.TIME_STAMP).label("end_dt")).\
                        join(Fred.TimeSeries, Fred.Meta.SERIES_ID == Fred.TimeSeries.SERIES_ID).\
                        filter(Fred.Meta.NAME.ilike('%india %')).\
                        group_by(Fred.Meta.SERIES_ID, Fred.Meta.TICKER, Fred.Meta.NAME).all()

print(f"fetched: {len(results)}")
for instance in results:
    print(instance)

Using World Bank GEM

Notebooks for this code: python; R.

"""This example illustrates how to use the World Bank data-set"""

import sys
sys.path.append("..")
    
from sqlalchemy import func, and_
from plutoPy.model import RoutingSession, WorldBank

#fetch all India related meta data

results = (RoutingSession.session.query(WorldBank.Meta)
           .filter(WorldBank.Meta.COUNTRY_NAME == "India")).all()
           
print(f"fetched: {len(results)}")
for instance in results:
    print(instance)
    
#fetch cpi inflation for India

results = (RoutingSession.session.query(WorldBank.TimeSeries)
           .filter(and_(WorldBank.TimeSeries.COUNTRY_KEY == 135, WorldBank.TimeSeries.INDICATOR_KEY == 6))
           .order_by(WorldBank.TimeSeries.YEAR)).all()
           
print(f"fetched: {len(results)}")
for instance in results:
    print(instance)

Using InternationalMonetaryFund

Notebooks for this code: python; R.

"""This example illustrates how to use the International Monetary Fund data-set"""

import sys
sys.path.append("..")
    
from sqlalchemy import func, and_
from plutoPy.model import RoutingSession, InternationalMonetaryFund
from sqlalchemy.orm import aliased

Meta = aliased(InternationalMonetaryFund.Meta)
TimeSeries = aliased(InternationalMonetaryFund.TimeSeries)

# get meta-data about monthly indicators pertaining to India currently maintained

results = (RoutingSession.session.query(Meta)
            .filter(and_(Meta.AREA == "India", Meta.END_YEAR == 2019, Meta.FREQ == 'M'))
            .all())
           
print(f"fetched: {len(results)}")
for instance in results:
    print(instance)
    
# get Indian IIP index (-2147472396)   

results = (RoutingSession.session.query(TimeSeries)
            .filter(TimeSeries.ID == -2147472396)
            .order_by(TimeSeries.YEAR, TimeSeries.MONTH)
            .all())
           
print(f"fetched: {len(results)}")
for instance in results:
    print(instance)
    

Using NasdaqOmx Indices

Notebooks for this code: python; R.

"""This example illustrates how to get a list of all NASDAQOMX TR Indices and their time-series"""

import sys
sys.path.append("..")
    
from sqlalchemy import func
from plutoPy.model import RoutingSession, NasdaqOmx

# fetch all "India" TR NASDAQOMX indices

results = (RoutingSession.session.query(NasdaqOmx.Meta.NAME,
                                       func.min(NasdaqOmx.TimeSeries.TIME_STAMP).label("start_dt"),
                                       func.max(NasdaqOmx.TimeSeries.TIME_STAMP).label("end_dt"))
            .join(NasdaqOmx.TimeSeries, NasdaqOmx.Meta.ID == NasdaqOmx.TimeSeries.ID)
            .filter(NasdaqOmx.Meta.NAME.ilike('% india %'))
            .group_by(NasdaqOmx.Meta.NAME).all())

print(f"fetched: {len(results)}")
for instance in results:
    print(instance)

Using Yield Curves

Notebooks for this code: python; R.

import sys
sys.path.append("..")
    
from sqlalchemy import func, and_
from sqlalchemy.orm import aliased
from plutoPy.model import RoutingSession, YieldCurve

#fetch the latest India Zero Coupon Bond yields

end_dt = RoutingSession.session.query(func.max(YieldCurve.IndiaZeroCoupon.TIME_STAMP)).scalar()

curve = (RoutingSession.session.query(YieldCurve.IndiaZeroCoupon)
         .filter(YieldCurve.IndiaZeroCoupon.TIME_STAMP == end_dt)
         .order_by(YieldCurve.IndiaZeroCoupon.MATURITY)
         .all())

print("the latest India Zero Coupon Bond yields")
for c in curve:
    print(c)
    
#fetch the latest US Treasury Yield Curve    

end_dt = RoutingSession.session.query(func.max(YieldCurve.UsTreasury.TIME_STAMP)).scalar()

curve = (RoutingSession.session.query(YieldCurve.UsTreasury)
         .filter(YieldCurve.UsTreasury.TIME_STAMP == end_dt)
         .all())

print("the latest US Treasury Yield Curve")
for c in curve:
    print(c)
    
#fetch the latest Euro area yield curve

end_dt = RoutingSession.session.query(func.max(YieldCurve.EuroArea.TIME_STAMP)).scalar()

alias1 = aliased(YieldCurve.EuroArea)
alias2 = aliased(YieldCurve.EuroArea)

curve = (RoutingSession.session.query(alias1.TENOR_Y, alias1.TENOR_M, alias1.VALUE.label('G_N_A'), alias2.VALUE.label('G_N_C'))
         .join(alias2, and_(alias1.TENOR_Y == alias2.TENOR_Y, alias1.TENOR_M == alias2.TENOR_M, alias1.TIME_STAMP == alias2.TIME_STAMP))
         .filter(and_(alias1.TIME_STAMP == end_dt, alias1.CURVE_ID == 'G_N_A', alias2.CURVE_ID == 'G_N_C'))
         .order_by(alias1.TENOR_Y, alias1.TENOR_M)
         .all())

print("the latest Euro Area Yield Curve")
for c in curve:
    print(c)    

Using Indices

Notebooks for this code: python; R.

"""This example illustrates how to get a list of all the latest NSE Indices, and
the constituents of a specific index."""

import sys
sys.path.append("..")
    
from sqlalchemy import func, text
from plutoPy.model import RoutingSession, Indices

# fetch the last 10 day India VIX levels

results = (RoutingSession.session.query(Indices.IndiaVixTimeSeries)
           .order_by(Indices.IndiaVixTimeSeries.TIME_STAMP.desc())
           .limit(10))

for instance in results:
    print(instance)
    
# fetch the latest rates across tenors

end_dt = RoutingSession.session.query(func.max(Indices.IndiaGsecTimeSeries.TIME_STAMP)).scalar()

results = (RoutingSession.session.query(Indices.IndiaGsecTimeSeries)
            .filter(Indices.IndiaGsecTimeSeries.TIME_STAMP == end_dt)
            .all())

print(f"fetched: {len(results)}")
for instance in results:
    print(instance)

# a list of all current NSE indices

end_dt = RoutingSession.session.query(func.max(Indices.NseTimeSeries.TIME_STAMP)).scalar()

results = (RoutingSession.session.query(Indices.NseTimeSeries.NAME)
            .filter(Indices.NseTimeSeries.TIME_STAMP == end_dt)
            .all())

print(f"fetched: {len(results)}")
for instance in results:
    print(instance.NAME)
    
# fetch the latest NSE NIFTY 50 constituents    
    
latest_dt = (RoutingSession.session.query(func.max(Indices.NseConstituents.TIME_STAMP))
            .filter(Indices.NseConstituents.NAME == "NIFTY 50")
            .scalar())    

results = (RoutingSession.session.query(Indices.NseConstituents.SYMBOL, Indices.NseConstituents.CAP_WEIGHT)
            .filter(Indices.NseConstituents.TIME_STAMP == latest_dt, Indices.NseConstituents.NAME == "NIFTY 50")
            .all())

print(f"fetched: {len(results)}")
for instance in results:
    print(instance)

# fetch the latest BSE SENSEX constituents    
    
latest_dt = (RoutingSession.session.query(func.max(Indices.BseConstituents.TIME_STAMP))
             .filter(Indices.BseConstituents.NAME == "sp bse sensex")
             .scalar())    

results = (RoutingSession.session.query(Indices.BseConstituents.SYMBOL, Indices.BseConstituents.SECURITY_NAME)
            .filter(Indices.BseConstituents.TIME_STAMP == latest_dt, Indices.BseConstituents.NAME == "sp bse sensex")
            .all())

print(f"fetched: {len(results)}")
for instance in results:
    print(instance)

# fetch index date ranges published on yahoo finance

results = (RoutingSession.session.query(Indices.YahooFinanceTimeSeries.NAME, 
                                        func.min(Indices.YahooFinanceTimeSeries.TIME_STAMP).label("start_dt"), 
                                        func.max(Indices.YahooFinanceTimeSeries.TIME_STAMP).label("end_dt"))
            .group_by(Indices.YahooFinanceTimeSeries.NAME)
            .all())

print(f"fetched: {len(results)}")
for instance in results:
    print(instance)
    
# fetch index date ranges published by Barclays

results = (RoutingSession.session.query(Indices.BarclaysMeta.FAMILY, Indices.BarclaysMeta.NAME, 
                                        func.min(Indices.BarclaysTimeSeries.TIME_STAMP).label("start_dt"), 
                                        func.max(Indices.BarclaysTimeSeries.TIME_STAMP).label("end_dt"))
            .join(Indices.BarclaysTimeSeries, Indices.BarclaysMeta.TICKER == Indices.BarclaysTimeSeries.TICKER)
            .group_by(Indices.BarclaysMeta.FAMILY, Indices.BarclaysMeta.NAME)
            .all())

print(f"fetched: {len(results)}")
for instance in results:
    print(instance)
    

Using ETFsUs

Notebooks for this code: python; R.

Using MutualFundsIndia

Notebooks for this code: python; R.

"""This example illustrates how to use the MutualFundsIndia data-set"""

import sys
sys.path.append("..")

import pandas as pd
from sqlalchemy import func, or_, and_
from plutoPy.model import RoutingSession, MutualFundsIndia

# who are the biggest 5?

lastAumDate = RoutingSession.session.query(func.max(MutualFundsIndia.AumFundwise.PERIOD)).scalar()
print(f"{lastAumDate}")

aums = (RoutingSession.session.query(MutualFundsIndia.AumFundwise.FUND, MutualFundsIndia.AumFundwise.AVG_AUM_WO_FOFD + MutualFundsIndia.AumFundwise.AVG_AUM_FOFD)
        .filter(MutualFundsIndia.AumFundwise.PERIOD == lastAumDate)
        .order_by((MutualFundsIndia.AumFundwise.AVG_AUM_WO_FOFD + MutualFundsIndia.AumFundwise.AVG_AUM_FOFD).desc())).all()

aumDf = pd.DataFrame(aums, columns=['FUND', 'AUM']) #analyze this!
print(aumDf[0:5])

# deep dive: largest 10 mid-cap funds by AUM

lastMetaDate = RoutingSession.session.query(func.max(MutualFundsIndia.Meta.AS_OF)).scalar()
lastSwDate = RoutingSession.session.query(func.max(MutualFundsIndia.AumSchemewise.PERIOD)).scalar()
print(f"{lastMetaDate}/{lastSwDate}")

# Meta to filter for the 'Mid-Cap' category
# AumSchemewise to sort funds by AUM - largest first
# NavTimeSeries to get the start and end dates for which NAVs are available

midCaps = (RoutingSession.session.query(MutualFundsIndia.Meta.SCHEME_CODE, 
                                       MutualFundsIndia.AumSchemewise.SCHEME_NAME,
                                       MutualFundsIndia.Meta.CATEGORY, 
                                       MutualFundsIndia.AumSchemewise.AVG_AUM_WO_FOFD,
                                       func.min(MutualFundsIndia.NavTimeSeries.TIME_STAMP).label("start_dt"), 
                                       func.max(MutualFundsIndia.NavTimeSeries.TIME_STAMP).label("end_dt"))
        .join(MutualFundsIndia.AumSchemewise, MutualFundsIndia.Meta.SCHEME_CODE == MutualFundsIndia.AumSchemewise.SCHEME_CODE)
        .join(MutualFundsIndia.NavTimeSeries, MutualFundsIndia.NavTimeSeries.SCHEME_CODE == MutualFundsIndia.AumSchemewise.SCHEME_CODE)
        .filter(and_(MutualFundsIndia.AumSchemewise.PERIOD == lastSwDate,
                    MutualFundsIndia.Meta.AS_OF == lastMetaDate, 
                    MutualFundsIndia.Meta.CATEGORY == 'Mid-Cap'))
        .group_by(MutualFundsIndia.Meta.SCHEME_CODE, 
            MutualFundsIndia.AumSchemewise.SCHEME_NAME,
            MutualFundsIndia.Meta.CATEGORY, 
            MutualFundsIndia.AumSchemewise.AVG_AUM_WO_FOFD)
        .order_by(MutualFundsIndia.AumSchemewise.AVG_AUM_WO_FOFD.desc())).all()

print(f"fetched: {len(midCaps)}")

# get a pandas dataframe out of the list of tuples
mcDf = pd.DataFrame(midCaps)

pd.set_option('display.max_columns', None)
print(mcDf[0:10])

# get the NAV time-series
scode = int(mcDf.iloc[2]['SCHEME_CODE'])
navs = (RoutingSession.session.query(MutualFundsIndia.NavTimeSeries.TIME_STAMP, MutualFundsIndia.NavTimeSeries.NAV)
        .filter(MutualFundsIndia.NavTimeSeries.SCHEME_CODE == scode)
        .order_by(MutualFundsIndia.NavTimeSeries.TIME_STAMP)).all()

navDf = pd.DataFrame(navs) #analyze this!
print(navDf[0:10])         

Using EquitiesUs

Notebooks for this code: python; R.

Using Equities India (NSE)

Notebooks for this code: python; R.

"""This example illustrates how to use the EquitiesIndiaNse data-set."""

import sys
sys.path.append("..")
    
from sqlalchemy import func, and_, or_
from plutoPy.model import RoutingSession, EquitiesIndiaNse
from datetime import date, datetime

# fetch the earliest 10 listed equity

results = (RoutingSession.session.query(EquitiesIndiaNse.Tickers)
           .order_by(EquitiesIndiaNse.Tickers.DATE_LISTING)
           .limit(10)
           .all())

for instance in results:
    print(instance)
    
# fetch some "misc" info for State Bank of India   

end_dt = RoutingSession.session.query(func.max(EquitiesIndiaNse.MiscInfo.TIME_STAMP)).scalar() 

results = (RoutingSession.session.query(EquitiesIndiaNse.MiscInfo)
            .filter(and_(EquitiesIndiaNse.MiscInfo.TIME_STAMP == end_dt, EquitiesIndiaNse.MiscInfo.SYMBOL == 'SBIN'))
            .all())

print("misc info for SBIN:")
for instance in results:
    print(instance)

# fetch the market-cap decile of DHFL since we started capturing the data-set

results = (RoutingSession.session.query(EquitiesIndiaNse.MarketCapDecile)
            .filter(EquitiesIndiaNse.MarketCapDecile.SYMBOL == 'DHFL')
            .all())

print("market-cap deciles for DHFL over time:")
for instance in results:
    print(instance)
    
# fetch the latest end-of-day prices for State Bank of India

end_dt = RoutingSession.session.query(func.max(EquitiesIndiaNse.EodTimeSeries.TIME_STAMP)).scalar()

results = (RoutingSession.session.query(EquitiesIndiaNse.EodTimeSeries)
            .filter(and_(EquitiesIndiaNse.EodTimeSeries.TIME_STAMP == end_dt, EquitiesIndiaNse.EodTimeSeries.SYMBOL == 'SBIN'))
            .all())

print(f"fetched: {len(results)}")
for instance in results:
    print(instance)
    
# fetch the last 10 day EOD prices for State Bank of India

results = (RoutingSession.session.query(EquitiesIndiaNse.EodTimeSeries)
            .filter(and_(or_(EquitiesIndiaNse.EodTimeSeries.SERIES == 'EQ', EquitiesIndiaNse.EodTimeSeries.SERIES == 'BE'), 
                         EquitiesIndiaNse.EodTimeSeries.SYMBOL == 'SBIN'))
            .order_by(EquitiesIndiaNse.EodTimeSeries.TIME_STAMP.desc())
            .limit(10)
            .all())

for instance in results:
    print(instance)    
    
    
# UPL did a 1:2 bonus on 2019-07-02. see unadjusted eod vs. adjusted eod

startDt = datetime(2019, 6, 15)    
endDt = datetime(2019, 7, 15)

print("unadjusted eod")
results = (RoutingSession.session.query(EquitiesIndiaNse.EodTimeSeries)
            .filter(and_(or_(EquitiesIndiaNse.EodTimeSeries.SERIES == 'EQ', EquitiesIndiaNse.EodTimeSeries.SERIES == 'BE'), 
                         EquitiesIndiaNse.EodTimeSeries.SYMBOL == 'UPL',
                         EquitiesIndiaNse.EodTimeSeries.TIME_STAMP >= startDt,
                         EquitiesIndiaNse.EodTimeSeries.TIME_STAMP <= endDt))
            .order_by(EquitiesIndiaNse.EodTimeSeries.TIME_STAMP)
            .all())

for instance in results:
    print(instance)

print("adjusted eod")    
results = (RoutingSession.session.query(EquitiesIndiaNse.EodAdjustedTimeSeries)
            .filter(and_(EquitiesIndiaNse.EodAdjustedTimeSeries.SYMBOL == 'UPL',
                         EquitiesIndiaNse.EodAdjustedTimeSeries.TIME_STAMP >= startDt,
                         EquitiesIndiaNse.EodAdjustedTimeSeries.TIME_STAMP <= endDt))
            .order_by(EquitiesIndiaNse.EodAdjustedTimeSeries.TIME_STAMP)
            .all())

for instance in results:
    print(instance)            

 
# fetch the last 10 day returns for State Bank of India

results = (RoutingSession.session.query(EquitiesIndiaNse.DailyReturns)
            .filter(EquitiesIndiaNse.DailyReturns.SYMBOL == 'SBIN')
            .order_by(EquitiesIndiaNse.DailyReturns.TIME_STAMP.desc())
            .limit(10)
            .all())

for instance in results:
    print(instance)        
    
# fetch the last 10 corporate actions for State Bank of India

results = (RoutingSession.session.query(EquitiesIndiaNse.CorporateActions)
            .filter(EquitiesIndiaNse.CorporateActions.SYMBOL == 'SBIN')
            .order_by(EquitiesIndiaNse.CorporateActions.EX_DATE.desc())
            .limit(10)
            .all())

for instance in results:
    print(instance)

# fetch the last 10 corporate events for State Bank of India

results = (RoutingSession.session.query(EquitiesIndiaNse.CorporateEvents)
            .filter(EquitiesIndiaNse.CorporateEvents.SYMBOL == 'SBIN')
            .order_by(EquitiesIndiaNse.CorporateEvents.EVENT_DATE.desc())
            .limit(10)
            .all())

for instance in results:
    print(instance)
        
    
# fetch the last 24 quarter EPS for State Bank of India

refIds = (RoutingSession.session.query(EquitiesIndiaNse.CorporateResultsMeta)
            .filter(and_(EquitiesIndiaNse.CorporateResultsMeta.SYMBOL == 'SBIN'),
                    EquitiesIndiaNse.CorporateResultsMeta.IS_CONSOLIDATED == False,
                    EquitiesIndiaNse.CorporateResultsMeta.PERIOD.ilike('%quarter'))
            .order_by(EquitiesIndiaNse.CorporateResultsMeta.PERIOD_END.desc())
            .limit(24)
            .all())

for instance in refIds:
    print(instance)
    
    results = (RoutingSession.session.query(EquitiesIndiaNse.CorporateResults)
               .filter(and_(EquitiesIndiaNse.CorporateResults.REF_ID == instance.REF_ID,
                            EquitiesIndiaNse.CorporateResults.KEY.ilike('%diluted%before%')))
               .all())
    
    for r in results:
        print(r)
        

Using Equities Futures and Options traded on the NSE

Notebooks for this code: python; R.

"""This example illustrates how to use the EquitiesFuturesAndOptionsIndiaNse data-set."""

import sys
sys.path.append("..")

import pandas as pd    
from sqlalchemy import func, and_, or_, text, Integer
from sqlalchemy.orm import aliased
from sqlalchemy.sql.expression import cast
from plutoPy.model import RoutingSession, EquitiesFuturesAndOptionsIndiaNse
from datetime import date, datetime, timedelta

# get all NIFTY futures contract traded right now

print("NIFTY futures contract traded right now")

end_dt = RoutingSession.session.query(func.max(EquitiesFuturesAndOptionsIndiaNse.FuturesEodTimeSeries.TIME_STAMP)).scalar() 

results = (RoutingSession.session.query(EquitiesFuturesAndOptionsIndiaNse.FuturesEodTimeSeries)
      .filter(and_(EquitiesFuturesAndOptionsIndiaNse.FuturesEodTimeSeries.SYMBOL == "NIFTY", 
                   EquitiesFuturesAndOptionsIndiaNse.FuturesEodTimeSeries.TIME_STAMP == end_dt))
      .all())

for instance in results:
    print(instance)
    
# get all NIFTY option contracts at the nearest expiry traded right now

print("NIFTY option contracts at the nearest expiry traded right now")

end_dt = RoutingSession.session.query(func.max(EquitiesFuturesAndOptionsIndiaNse.OptionsEodTimeSeries.TIME_STAMP)).scalar() 

expiry = (RoutingSession.session.query(func.min(EquitiesFuturesAndOptionsIndiaNse.OptionsEodTimeSeries.EXPIRY))
          .filter(and_(EquitiesFuturesAndOptionsIndiaNse.OptionsEodTimeSeries.SYMBOL == "NIFTY",
                       EquitiesFuturesAndOptionsIndiaNse.OptionsEodTimeSeries.TIME_STAMP == end_dt))
          .scalar())

results = (RoutingSession.session.query(EquitiesFuturesAndOptionsIndiaNse.OptionsEodTimeSeries)
      .filter(and_(EquitiesFuturesAndOptionsIndiaNse.OptionsEodTimeSeries.SYMBOL == "NIFTY", 
                   EquitiesFuturesAndOptionsIndiaNse.OptionsEodTimeSeries.EXPIRY == expiry,
                   cast(EquitiesFuturesAndOptionsIndiaNse.OptionsEodTimeSeries.STRIKE, Integer) % 100 == 0,
                   EquitiesFuturesAndOptionsIndiaNse.OptionsEodTimeSeries.TIME_STAMP == end_dt))
      .order_by(EquitiesFuturesAndOptionsIndiaNse.OptionsEodTimeSeries.STRIKE, EquitiesFuturesAndOptionsIndiaNse.OptionsEodTimeSeries.OTYPE)
      .all())

for instance in results:
    print(instance)
    
# get all greeks for the NIFTY option contracts at the nearest expiry traded right now

print("greeks for the NIFTY option contracts at the nearest expiry traded right now")

end_dt = RoutingSession.session.query(func.max(EquitiesFuturesAndOptionsIndiaNse.OptionGreeks.TIME_STAMP)).scalar() 

expiry = (RoutingSession.session.query(func.min(EquitiesFuturesAndOptionsIndiaNse.OptionGreeks.EXPIRY))
          .filter(and_(EquitiesFuturesAndOptionsIndiaNse.OptionGreeks.SYMBOL == "NIFTY",
                       EquitiesFuturesAndOptionsIndiaNse.OptionGreeks.TIME_STAMP == end_dt))
          .scalar())

results = (RoutingSession.session.query(EquitiesFuturesAndOptionsIndiaNse.OptionGreeks)
      .filter(and_(EquitiesFuturesAndOptionsIndiaNse.OptionGreeks.SYMBOL == "NIFTY", 
                   EquitiesFuturesAndOptionsIndiaNse.OptionGreeks.EXPIRY == expiry,
                   cast(EquitiesFuturesAndOptionsIndiaNse.OptionGreeks.STRIKE, Integer) % 100 == 0,
                   EquitiesFuturesAndOptionsIndiaNse.OptionGreeks.TIME_STAMP == end_dt))
      .order_by(EquitiesFuturesAndOptionsIndiaNse.OptionGreeks.STRIKE, EquitiesFuturesAndOptionsIndiaNse.OptionGreeks.OTYPE)
      .all())


for instance in results:
    print(instance)    
    
# get NIFTY's lot-sizes at different expiries

print("NIFTY's lot-sizes at different expiries")

futureDate = date.today() + timedelta(days=30*3)

results = (RoutingSession.session.query(EquitiesFuturesAndOptionsIndiaNse.LotSize)
      .filter(and_(EquitiesFuturesAndOptionsIndiaNse.LotSize.SYMBOL == "NIFTY", EquitiesFuturesAndOptionsIndiaNse.LotSize.CONTRACT <= futureDate))
      .order_by(EquitiesFuturesAndOptionsIndiaNse.LotSize.CONTRACT.desc())
      .limit(10)
      .all())

for instance in results:
    print(instance)

Using Commodity Futures And Options

Notebooks for this code: python; R.

"""This example illustrates how to use the CommodityFuturesAndOptions data-set."""

import sys
sys.path.append("..")

import pandas as pd    
from sqlalchemy import func, and_, or_, text
from sqlalchemy.orm import aliased
from plutoPy.model import RoutingSession, CommodityFuturesAndOptions
from datetime import date, datetime

pd.set_option('display.max_columns', 500)

# get all the commodities that are being traded in COMEX and NYMEX

print("commodity futures that are being traded in COMEX and NYMEX")

end_dt = RoutingSession.session.query(func.max(CommodityFuturesAndOptions.CmeEod.TIME_STAMP)).scalar() 

alias1 = aliased(CommodityFuturesAndOptions.CmeEod)
alias2 = aliased(CommodityFuturesAndOptions.CmeEod)

t1 = (RoutingSession.session.query(alias1.PRODUCT_SYMBOL, alias1.PRODUCT_DESCRIPTION, func.sum(alias1.VOLUME).label("total_volume"))
      .filter(alias1.TIME_STAMP == end_dt)
      .group_by(alias1.PRODUCT_SYMBOL, alias1.PRODUCT_DESCRIPTION)
      .order_by(text("total_volume desc"))
      .all())

t2 = (RoutingSession.session.query(alias1.PRODUCT_SYMBOL, func.min(alias1.TIME_STAMP).label("start_dt"))
      .group_by(alias1.PRODUCT_SYMBOL)
      .order_by(text("start_dt"))
      .all())

pd1 = pd.DataFrame(t1, columns=['SYMBOL', 'DESCRIPTION', 'VOLUME'])
pd2 = pd.DataFrame(t2, columns=['SYMBOL', 'LISTED_DATE'])
tradedContracts = pd.merge(pd1, pd2, on='SYMBOL')

print(tradedContracts[tradedContracts['VOLUME'] > 0])
    
# get all the commodity futures that are being traded in MCX

print("commodity futures that are being traded in MCX")

end_dt = RoutingSession.session.query(func.max(CommodityFuturesAndOptions.McxEod.TIME_STAMP)).scalar() 

alias1 = aliased(CommodityFuturesAndOptions.McxEod)
alias2 = aliased(CommodityFuturesAndOptions.McxEod)

t1 = (RoutingSession.session.query(alias1.CONTRACT, func.sum(alias1.OI).label("total_oi"))
      .filter(and_(alias1.TIME_STAMP == end_dt, 
                   or_(alias1.OTYPE == 'XX', alias1.OTYPE == 'FUTCOM')))
      .group_by(alias1.CONTRACT)
      .order_by(text("total_oi desc"))
      .all())

t2 = (RoutingSession.session.query(alias1.CONTRACT, func.min(alias1.TIME_STAMP).label("start_dt"))
      .group_by(alias1.CONTRACT)
      .filter(or_(alias1.OTYPE == 'XX', alias1.OTYPE == 'FUTCOM'))
      .order_by(text("start_dt"))
      .all())

pd1 = pd.DataFrame(t1, columns=['SYMBOL', 'OI'])
pd2 = pd.DataFrame(t2, columns=['SYMBOL', 'LISTED_DATE'])
tradedContracts = pd.merge(pd1, pd2, on='SYMBOL')

print(tradedContracts[tradedContracts['OI'] > 0])

# get all the commodity futures that are being traded in MCX

print("commodity futures that are being traded in NCDEX")

end_dt = RoutingSession.session.query(func.max(CommodityFuturesAndOptions.NcdexEod.TIME_STAMP)).scalar() 

alias1 = aliased(CommodityFuturesAndOptions.NcdexEod)
alias2 = aliased(CommodityFuturesAndOptions.NcdexEod)

t1 = (RoutingSession.session.query(alias1.COMMODITY, func.sum(alias1.OI).label("total_oi"))
      .filter(alias1.TIME_STAMP == end_dt)
      .group_by(alias1.COMMODITY)
      .order_by(text("total_oi desc"))
      .all())

t2 = (RoutingSession.session.query(alias1.COMMODITY, func.min(alias1.TIME_STAMP).label("start_dt"))
      .group_by(alias1.COMMODITY)
      .order_by(text("start_dt"))
      .all())

pd1 = pd.DataFrame(t1, columns=['COMMODITY', 'OI'])
pd2 = pd.DataFrame(t2, columns=['COMMODITY', 'LISTED_DATE'])
tradedContracts = pd.merge(pd1, pd2, on='COMMODITY')

print(tradedContracts[tradedContracts['OI'] > 0])

Using Currencies

Notebooks for this code: python; R.

"""This example illustrates how to use the Currencies data-set."""

import sys
sys.path.append("..")

import pandas as pd    
from sqlalchemy import func, and_, or_, text, Integer
from sqlalchemy.orm import aliased
from sqlalchemy.sql.expression import cast
from plutoPy.model import RoutingSession, Currencies
from datetime import date, datetime, timedelta

print("AlphaVantage end-of-day pairs:")

results = (RoutingSession.session.query(Currencies.AvEodTimeSeries.SYMBOL, 
                                        func.min(Currencies.AvEodTimeSeries.TIME_STAMP).label('start_dt'), 
                                        func.max(Currencies.AvEodTimeSeries.TIME_STAMP).label('end_dt'))
            .group_by(Currencies.AvEodTimeSeries.SYMBOL)
            .order_by(text('start_dt'))).all()

for instance in results:
    print(instance)

######################################################


# get traded futures pairs

print("traded futures pairs:")

results = (RoutingSession.session.query(Currencies.NseFuturesTimeSeries.SYMBOL, 
                                        func.min(Currencies.NseFuturesTimeSeries.TIME_STAMP).label('start_dt'), 
                                        func.max(Currencies.NseFuturesTimeSeries.TIME_STAMP).label('end_dt'))
            .group_by(Currencies.NseFuturesTimeSeries.SYMBOL)
            .order_by(text('start_dt'))
            .all())

for instance in results:
    print(instance)
    
# get the latest USDINR option chain for the nearest expiry    

print("latest USDINR option chain for the nearest expiry:")

end_dt = RoutingSession.session.query(func.max(Currencies.NseOptionsTimeSeries.TIME_STAMP)).scalar() 

expiry = (RoutingSession.session.query(func.min(Currencies.NseOptionsTimeSeries.EXPIRY))
          .filter(and_(Currencies.NseOptionsTimeSeries.SYMBOL == "USDINR",
                       Currencies.NseOptionsTimeSeries.TIME_STAMP == end_dt))
          .scalar())

results = (RoutingSession.session.query(Currencies.NseOptionsTimeSeries)
      .filter(and_(Currencies.NseOptionsTimeSeries.SYMBOL == "USDINR", 
                   Currencies.NseOptionsTimeSeries.EXPIRY == expiry,
                   Currencies.NseOptionsTimeSeries.TIME_STAMP == end_dt))
      .order_by(Currencies.NseOptionsTimeSeries.STRIKE, Currencies.NseOptionsTimeSeries.OTYPE)
      .all())

for instance in results:
    print(instance)
    
# get the currencies tracked by AlphaVantage end-of-day

print("AlphaVantage end-of-day pairs:")

results = (RoutingSession.session.query(Currencies.AvEodTimeSeries.SYMBOL, 
                                        func.min(Currencies.AvEodTimeSeries.TIME_STAMP).label('start_dt'), 
                                        func.max(Currencies.AvEodTimeSeries.TIME_STAMP).label('end_dt'))
            .group_by(Currencies.AvEodTimeSeries.SYMBOL)
            .order_by(text('start_dt'))
            .all())

for instance in results:
    print(instance)
    

# get the currencies tracked by AlphaVantage 30-min bars
    
print("AlphaVantage 30-min bars:")

results = (RoutingSession.session.query(Currencies.Av30minTimeSeries.SYMBOL, 
                                        func.min(Currencies.Av30minTimeSeries.TIME_STAMP).label('start_dt'), 
                                        func.max(Currencies.Av30minTimeSeries.TIME_STAMP).label('end_dt'),
                                        func.count(Currencies.Av30minTimeSeries.TIME_STAMP).label('count'))
            .group_by(Currencies.Av30minTimeSeries.SYMBOL)
            .order_by(text('count desc'))
            .all())

for instance in results:
    print(instance)            
    

Using InvestmentFlowsIndia

Notebooks for this code: python; R.

"""This example illustrates how to use the InvestmentFlowsIndia data-set."""

import sys
sys.path.append("..")

import pandas as pd    
from sqlalchemy import func, and_, or_, text, Integer
from sqlalchemy.orm import aliased
from sqlalchemy.sql.expression import cast
from plutoPy.model import RoutingSession, InvestmentFlowsIndia
from datetime import date, datetime, timedelta

# get daily DII and FII flows for the last 20 days for the cash market

print("daily DII and FII flows for the last 20 days for the cash market:")

results = (RoutingSession.session.query(InvestmentFlowsIndia.DiiCashMarket.TIME_STAMP, InvestmentFlowsIndia.DiiCashMarket.SECURITY_TYPE,
                                        func.sum(InvestmentFlowsIndia.DiiCashMarket.BUY_VALUE + InvestmentFlowsIndia.FiiCashMarket.BUY_VALUE).label('BUY'), 
                                        func.sum(InvestmentFlowsIndia.DiiCashMarket.SELL_VALUE + InvestmentFlowsIndia.FiiCashMarket.SELL_VALUE).label('SELL'),
                                        func.sum(InvestmentFlowsIndia.DiiCashMarket.BUY_VALUE + InvestmentFlowsIndia.FiiCashMarket.BUY_VALUE
                                         - InvestmentFlowsIndia.DiiCashMarket.SELL_VALUE - InvestmentFlowsIndia.FiiCashMarket.SELL_VALUE).label('NET'))
            .outerjoin(InvestmentFlowsIndia.FiiCashMarket, and_(InvestmentFlowsIndia.FiiCashMarket.TIME_STAMP == InvestmentFlowsIndia.DiiCashMarket.TIME_STAMP,
                                                                InvestmentFlowsIndia.FiiCashMarket.SECURITY_TYPE == InvestmentFlowsIndia.DiiCashMarket.SECURITY_TYPE))
            .group_by(InvestmentFlowsIndia.DiiCashMarket.TIME_STAMP, InvestmentFlowsIndia.DiiCashMarket.SECURITY_TYPE)
            .order_by(InvestmentFlowsIndia.DiiCashMarket.TIME_STAMP.desc())
            .limit(20)
            .all())

for instance in results:
    print(instance)
    
# get instruments traced for DIIs in the derivative market   

print("instruments traced for DIIs in the derivative market") 

results = (RoutingSession.session.query(InvestmentFlowsIndia.DiiDerivativesMarket.SECURITY_TYPE,
                                        func.min(InvestmentFlowsIndia.DiiDerivativesMarket.TIME_STAMP).label('start_dt'),
                                        func.max(InvestmentFlowsIndia.DiiDerivativesMarket.TIME_STAMP).label('end_dt'))
            .group_by(InvestmentFlowsIndia.DiiDerivativesMarket.SECURITY_TYPE)
            .order_by(text('start_dt'))
            .all())

for instance in results:
    print(instance)
    
# get instruments traced for FIIs in the derivative market   

print("instruments traced for FIIs in the derivative market") 

results = (RoutingSession.session.query(InvestmentFlowsIndia.FiiDerivativesMarket.SECURITY_TYPE,
                                        func.min(InvestmentFlowsIndia.FiiDerivativesMarket.TIME_STAMP).label('start_dt'),
                                        func.max(InvestmentFlowsIndia.FiiDerivativesMarket.TIME_STAMP).label('end_dt'))
            .group_by(InvestmentFlowsIndia.FiiDerivativesMarket.SECURITY_TYPE)
            .order_by(text('start_dt'))
            .all())

for instance in results:
    print(instance)
    

Using FamaFrench

Notebooks for this code: python; R.

"""This example illustrates how to use the Fama-French dataset."""

import sys
sys.path.append("..")
    
from sqlalchemy import func, text
from plutoPy.model import RoutingSession, FamaFrench

# show data-ranges for Fama-french factors

results = (RoutingSession.session.query(FamaFrench.FiveFactor3x2Daily.KEY_ID, 
                                        func.min(FamaFrench.FiveFactor3x2Daily.TIME_STAMP).label("start_dt"), 
                                        func.max(FamaFrench.FiveFactor3x2Daily.TIME_STAMP).label("end_dt"))
            .group_by(FamaFrench.FiveFactor3x2Daily.KEY_ID)
            .all())

print(f"fetched: {len(results)}")
for instance in results:
    print(instance)

# show data-ranges for Fama-french industry daily returns

results = (RoutingSession.session.query(FamaFrench.Industry49Daily.KEY_ID,
                                        FamaFrench.Industry49Daily.RET_TYPE, 
                                        func.min(FamaFrench.Industry49Daily.TIME_STAMP).label("start_dt"), 
                                        func.max(FamaFrench.Industry49Daily.TIME_STAMP).label("end_dt"))
            .group_by(FamaFrench.Industry49Daily.KEY_ID, FamaFrench.Industry49Daily.RET_TYPE)
            .order_by(text("start_dt"))
            .all())

print(f"fetched: {len(results)}")
for instance in results:
    print(instance)
    
# show data-ranges for Fama-french momentum daily returns

results = (RoutingSession.session.query(FamaFrench.MomentumDaily.KEY_ID, 
                                        FamaFrench.MomentumDaily.RET_TYPE,
                                        func.min(FamaFrench.MomentumDaily.TIME_STAMP).label("start_dt"), 
                                        func.max(FamaFrench.MomentumDaily.TIME_STAMP).label("end_dt"))
            .group_by(FamaFrench.MomentumDaily.KEY_ID, FamaFrench.MomentumDaily.RET_TYPE)
            .order_by(text("start_dt"))
            .all())

print(f"fetched: {len(results)}")
for instance in results:
    print(instance)  
    
    
# show data-ranges for Fama-french momentum daily returns

results = (RoutingSession.session.query(FamaFrench.MomentumMonthly.KEY_ID, 
                                        FamaFrench.MomentumMonthly.RET_TYPE,
                                        func.min(FamaFrench.MomentumMonthly.TIME_STAMP).label("start_dt"), 
                                        func.max(FamaFrench.MomentumMonthly.TIME_STAMP).label("end_dt"))
            .group_by(FamaFrench.MomentumMonthly.KEY_ID, FamaFrench.MomentumMonthly.RET_TYPE)
            .order_by(text("start_dt"))
            .all())

print(f"fetched: {len(results)}")
for instance in results:
    print(instance)   

Using Yale/Shiller

Notebooks for this code: python; R.

"""This example illustrates how to use the Yale/Shiller dataset."""

import sys
sys.path.append("..")
    
from sqlalchemy import func, text, extract, and_
from plutoPy.model import RoutingSession, Yale
from datetime import date

# start and end dates of confidence indices

results = (RoutingSession.session.query(Yale.Confidence.NAME,
                                        func.min(Yale.Confidence.TIME_STAMP).label("start_dt"),
                                        func.max(Yale.Confidence.TIME_STAMP).label("end_dt"))
            .group_by(Yale.Confidence.NAME)
            .all())

print(f"fetched: {len(results)}")
for instance in results:
    print(instance)
    
# SP500 close and CAPE at the end of each year since 1995

startDate = date(1995, 12, 1)    
results = (RoutingSession.session.query(extract('year', Yale.SP500.TIME_STAMP).label('Y'), Yale.SP500.CLOSE, Yale.SP500.CAPE)
           .filter(and_(extract('month', Yale.SP500.TIME_STAMP) == 12, Yale.SP500.TIME_STAMP >= startDate))
           .order_by(Yale.SP500.TIME_STAMP)
           .all())

print(f"fetched: {len(results)}")
for instance in results:
    print(instance)

Indices and tables