Usage#

Warning

Refrain from using this library if you are trying to query the stock exchange very very frequently. It increases load on BSE’s servers and might even lead to your IP address being blacklisted by them. Apart from the technical issues, it’s higly unethical.

For frequent queries, consider buying data from BSE or a vendor. More details are available at https://www.bseindia.com/market_data_products.html

Installing with pip#

pip install bsedata

Instantiation#

from bsedata.bse import BSE
b = BSE()
print(b)
# Output:
# Driver Class for Bombay Stock Exchange (BSE)

# to execute "updateScripCodes" on instantiation
b = BSE(update_codes = True)

Getting a stock quote#

This method returns all the publicly available data, you can pick the fields you require from the dictionary

q = b.getQuote('534976')
pprint(q)
# Output:
# {'2WeekAvgQuantity': '0.14 Lakh',
#  '52weekHigh': '3298.00',
#  '52weekLow': '1874.00',
#  'buy': {'1': {'price': '0.00', 'quantity': '-'},
#          '2': {'price': '0.00', 'quantity': '-'},
#          '3': {'price': '0.00', 'quantity': '-'},
#          '4': {'price': '0.00', 'quantity': '-'},
#          '5': {'price': '0.00', 'quantity': '-'}},
#  'change': '76.75',
#  'companyName': 'V-MART RETAIL LTD.',
#  'currentValue': '2255.80',
#  'dayHigh': '2270.00',
#  'dayLow': '2185.10',
#  'faceValue': '10.00',
#  'group': 'A  / S&P BSE 500',
#  'industry': 'Department Stores',
#  'lowerPriceBand': '1804.65',
#  'marketCapFreeFloat': '1,883.72 Cr.',
#  'marketCapFull': '4,095.05 Cr.',
#  'pChange': '3.52',
#  'previousClose': '2179.05',
#  'previousOpen': '2199.65',
#  'priceBand': '20%',
#  'scripCode': '534976',
#  'securityID': 'VMART',
#  'sell': {'1': {'price': '0.00', 'quantity': '-'},
#           '2': {'price': '0.00', 'quantity': '-'},
#           '3': {'price': '0.00', 'quantity': '-'},
#           '4': {'price': '0.00', 'quantity': '-'},
#           '5': {'price': '0.00', 'quantity': '-'}},
#  'totalTradedQuantity': '0.01 Lakh',
#  'totalTradedValue': '0.13 Cr.',
#  'updatedOn': '14 Jun 19 | 04:00 PM',
#  'upperPriceBand': '2706.95',
#  'weightedAvgPrice': '2239.58'}

Note

You can use the following code to get quotes in bulk

b = BSE()
codelist = ["500116", "512573"]
for code in codelist:
    quote = b.getQuote(code)
    pprint(quote["companyName"])
    pprint(quote["currentValue"])
    pprint(quote["updatedOn"])

Getting top gainers#

tg = b.topGainers()
pprint(tg)
# Output:
# [{'LTP': '2,255.80',
#   'change': '76.75',
#   'pChange': '3.52',
#   'scripCode': '534976',
#   'securityID': 'VMART'},
#  {'LTP': '274.30',
#   'change': '9.25',
#   'pChange': '3.49',
#   'scripCode': '538835',
#   'securityID': 'INTELLECT'},
#  {'LTP': '273.65',
#   'change': '9.20',
#   'pChange': '3.48',
#   'scripCode': '500620',
#   'securityID': 'GESHIP*'},
#  {'LTP': '3,092.55',
#   'change': '103.50',
#   'pChange': '3.46',
#   'scripCode': '539658',
#   'securityID': 'TEAMLEASE'},
#  {'LTP': '164.75',
#   'change': '5.45',
#   'pChange': '3.42',
#   'scripCode': '532636',
#   'securityID': 'IIFL'}]

Getting top losers#

tg = b.topLosers()
pprint(tg)
# Output:
# [{'LTP': '82.05',
#   'change': '-9.90',
#   'pChange': '-10.77',
#   'scripCode': '532617',
#   'securityID': 'JETAIRWAYS'},
#  {'LTP': '76.55',
#   'change': '-7.85',
#   'pChange': '-9.30',
#   'scripCode': '500111',
#   'securityID': 'RELCAPITAL'},
#  {'LTP': '326.55',
#   'change': '-26.40',
#   'pChange': '-7.48',
#   'scripCode': '539268',
#   'securityID': 'SYNGENE'},
#  {'LTP': '3.69',
#   'change': '-0.29',
#   'pChange': '-7.29',
#   'scripCode': '532532',
#   'securityID': 'JPASSOCIAT'},
#  {'LTP': '57.40',
#   'change': '-4.25',
#   'pChange': '-6.89',
#   'scripCode': '534809',
#   'securityID': 'PCJEWELLER'}]

Getting indices#

Note

Indices are currently available only as a part of a category

category parameter can be one of the following:

  1. market_cap/broad

  2. sector_and_industry

  3. thematics

  4. strategy

  5. sustainability

  6. volatility

  7. composite

  8. government

  9. corporate

  10. money_market

indices = b.getIndices(category='corporate')
pprint(indices)
# Output:
# {'indices': [{'change': '-0.31',
#               'currentValue': '162.58',
#               'name': 'S&P BSE India Corporate Bond Index',
#               'pChange': '-0.19',
#               'scripFlag': 'SPBINCPT'},
#              {'change': '-0.40',
#               'currentValue': '162.63',
#               'name': 'S&P BSE India Financials Bond Index',
#               'pChange': '-0.25',
#               'scripFlag': 'SPBINCFT'},
#              {'change': '+0.05',
#               'currentValue': '169.10',
#               'name': 'S&P BSE India Services Bond Index',
#               'pChange': '0.03',
#               'scripFlag': 'SPBINCST'},
#              {'change': '+0.40',
#               'currentValue': '165.34',
#               'name': 'S&P BSE India Utilities Bond Index',
#               'pChange': '0.24',
#               'scripFlag': 'SPBINCUT'},
#              {'change': '+0.09',
#               'currentValue': '162.87',
#               'name': 'S&P BSE India Industrials Bond Index',
#               'pChange': '0.05',
#               'scripFlag': 'SPBINCIT'}],
#  'updatedOn': '13 Jun 2019'}

Updating list of scrip codes#

Downloads a fresh list of scrip codes from publicly available Quandl data and resfreshes the library cache.

b.updateScripCodes()
# returns nothing

Verifying a scrip code#

Verify if a scrip code is valid or not

b.updateScripCodes()

# Valid scrip code

pprint(b.verifyScripCode('534976'))
# Output:
# V-mart Retail Ltd.

# invalid scrip code

pprint(b.verifyScripCode('534980'))
# Output:
# None

Getting all listed companies and their scrip codes#

pprint(b.getScripCodes())
# Output too large to display in docs
# returns a dictionary with scrip codes as keys and respective company names as values