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