Skip to content

Commit

Permalink
adding futures
Browse files Browse the repository at this point in the history
  • Loading branch information
pratik141 committed Sep 17, 2023
1 parent 2b3e9b5 commit 9bb2d86
Show file tree
Hide file tree
Showing 5 changed files with 193 additions and 38 deletions.
9 changes: 8 additions & 1 deletion nsedt/derivatives/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from nsedt.resources import constants as cns
from nsedt.utils import data_format
from nsedt.derivatives.options import get_option_chain, get_option_chain_expdate
from nsedt.derivatives.futures import get_future_price, get_future_expdate

log = logging.getLogger("root")

Expand All @@ -20,13 +21,15 @@ def get_vix(
start_date: str,
end_date: str,
response_type: str = "panda_df",
columns_drop_list: list = None,
):
"""Get Vix data
Args:
start_date (str): start date in "%d-%m-%Y" format
end_date (str): end_date in "%d-%m-%Y" format
response_type (str, optional): response_type. Defaults to "panda_df".
columns_drop_list (list, optional): _description_. Defaults to None.
Raises:
exc: genral Exception
Expand Down Expand Up @@ -78,7 +81,11 @@ def get_vix(
for future in concurrent.futures.as_completed(future_to_url):
url = future_to_url[future]
try:
dataframe = data_format.get_vix(future.result())
dataframe = data_format.get_vix(
future.result(),
response_type=response_type,
columns_drop_list=columns_drop_list,
)
result = pd.concat([result, dataframe])
except Exception as exc:
log.error("%s got exception: %s. Please try again later.", url, exc)
Expand Down
95 changes: 95 additions & 0 deletions nsedt/derivatives/futures.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
"""
get data for Options
"""
import urllib
from datetime import datetime, timedelta

from nsedt import utils
from nsedt.resources import constants as cns
from nsedt.utils import data_format


def get_future_price(
symbol: str,
start_date: str,
end_date: str,
expiry_date: str = None,
response_type: str = "panda_df",
columns_drop_list: list = None,
):
"""
get future price of stock / indices
Args:
symbol (str): _description_
start_date (str): _description_
end_date (str): _description_
expiry_date (str, optional): _description_. Defaults to None.
response_type (str, optional): _description_. Defaults to "panda_df".
columns_drop_list (list, optional): _description_. Defaults to None.
Returns:
_type_: _description_
"""
cookies = utils.get_cookies()
base_url = cns.BASE_URL
event_api = cns.FUTURES_PRICE
params = {
"symbol": symbol,
"from": start_date,
"to": end_date,
}
if symbol in cns.INDICES:
params["instrumentType"] = "FUTIDX"
else:
params["instrumentType"] = "FUTSTK"

url = base_url + event_api + urllib.parse.urlencode(params)
data = utils.fetch_url(url, cookies, response_type="json")

if expiry_date:
filtered_data = [
record
for record in data["data"]
if record["FH_EXPIRY_DT"]
== datetime.strptime(expiry_date, "%d-%m-%Y").strftime("%d-%b-%Y")
]
else:
filtered_data = data["data"]

return data_format.derivatives_futures(
filtered_data,
response_type=response_type,
columns_drop_list=columns_drop_list,
)


def get_future_expdate(symbol: str) -> list:
"""get expiry dates of futures
Args:
symbol (str): symbol name
Returns:
list: expiry dates
"""
cookies = utils.get_cookies()
base_url = cns.BASE_URL
event_api = cns.FUTURES_PRICE
params = {
"symbol": symbol,
"from": (datetime.now() - timedelta(days=3)).strftime("%d-%m-%Y"),
"to": datetime.now().strftime("%d-%m-%Y"),
}
if symbol in cns.INDICES:
params["instrumentType"] = "FUTIDX"
else:
params["instrumentType"] = "FUTSTK"

url = base_url + event_api + urllib.parse.urlencode(params)
data = utils.fetch_url(url, cookies, response_type="json")
ret = []
for rec in data["data"]:
ret.append(
datetime.strptime(rec["FH_EXPIRY_DT"], "%d-%b-%Y").strftime("%d-%m-%Y")
)
return list(set(ret))
8 changes: 4 additions & 4 deletions nsedt/derivatives/options.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ def get_option_chain(
base_url = cns.BASE_URL

if symbol in cns.INDICES:
event_api = cns.DERIVATIVES_PRICE_INDICES
event_api = cns.OPTIONS_PRICE_EQUITIES
else:
event_api = cns.DERIVATIVES_PRICE_EQUITIES
event_api = cns.OPTIONS_PRICE_EQUITIES

params["symbol"] = symbol

Expand Down Expand Up @@ -92,9 +92,9 @@ def get_option_chain_expdate(symbol: str) -> list:
base_url = cns.BASE_URL

if symbol in cns.INDICES:
event_api = cns.DERIVATIVES_PRICE_INDICES
event_api = cns.OPTIONS_PRICE_EQUITIES
else:
event_api = cns.DERIVATIVES_PRICE_EQUITIES
event_api = cns.OPTIONS_PRICE_EQUITIES

params["symbol"] = symbol

Expand Down
5 changes: 3 additions & 2 deletions nsedt/resources/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@
INDEX_PRICE_HISTORY = "api/historical/indicesHistory?"

### DERIVATIVES
DERIVATIVES_PRICE_EQUITIES = "api/option-chain-equities?"
DERIVATIVES_PRICE_INDICES = "api/option-chain-indices?"
OPTIONS_PRICE_EQUITIES = "api/option-chain-equities?"
OPTIONS_PRICE_INDICES = "api/option-chain-indices?"
INDICES = ["NIFTY", "FINNIFTY", "BANKNIFTY"]
VIX_HISTORY = "api/historical/vixhistory?"
FUTURES_PRICE = "api/historical/foCPV?"
114 changes: 83 additions & 31 deletions nsedt/utils/data_format.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,52 +142,47 @@ def option_chain(


def get_vix(
data_json: str,
data_json: object,
response_type: str = "panda_df",
columns_drop_list: list = None,
):
"""_summary_
"""
Format Vix data
Args:
data_json (str): _description_
response_type (str, optional): _description_. Defaults to "panda_df".
data_json (object): data in json format.
response_type (str, optional): response_type. Defaults to "panda_df".
columns_drop_list (list, optional): custom columns drop list. Defaults to None.
Returns:
_type_: _description_
"""
data_json = data_json["data"]
if columns_drop_list:
columns_list = columns_drop_list
else:
columns_list = [
"_id",
"TIMESTAMP",
"createdAt",
"updatedAt",
"__v",
"ALTERNATE_INDEX_NAME",
"EOD_INDEX_NAME",
"EOD_PREV_CLOSE",
"VIX_PTS_CHG",
"VIX_PERC_CHG",
]
if response_type == "json":
data_json_ret = []
for record in data_json:
if "PE" in record:
record.pop("_id", None)
record.pop("TIMESTAMP", None)
record.pop("createdAt", None)
record.pop("updatedAt", None)
record.pop("__v", None)
record.pop("ALTERNATE_INDEX_NAME", None)
record.pop("EOD_INDEX_NAME", None)
record.pop("EOD_PREV_CLOSE", None)
record.pop("VIX_PTS_CHG", None)
record.pop("VIX_PERC_CHG", None)
for column in columns_list:
record.pop(column, None)

data_json_ret.append(record)
return data_json_ret

return (
pd.json_normalize(data_json)
.drop(
columns=[
"_id",
"TIMESTAMP",
"createdAt",
"updatedAt",
"__v",
"ALTERNATE_INDEX_NAME",
"EOD_INDEX_NAME",
"EOD_PREV_CLOSE",
"VIX_PTS_CHG",
"VIX_PERC_CHG",
]
)
.drop(columns=columns_list)
.rename(
columns={
"EOD_OPEN_INDEX_VAL": "Open Price",
Expand All @@ -198,3 +193,60 @@ def get_vix(
}
)
)


def derivatives_futures(
data_json: str,
response_type: str = "panda_df",
columns_drop_list=None,
):
"""
Format futures data
Args:
data_json (object): data in json format.
response_type (str, optional): response_type. Defaults to "panda_df".
columns_drop_list (list, optional): custom columns drop list. Defaults to None.
Returns:
json: formate data in json
or
dataframe: formate data in panda df
"""
if columns_drop_list:
columns_list = columns_drop_list
else:
columns_list = [
"_id",
"FH_MARKET_LOT",
"FH_MARKET_TYPE",
"FH_OPTION_TYPE",
"FH_SYMBOL",
"FH_INSTRUMENT",
"FH_STRIKE_PRICE",
"FH_LAST_TRADED_PRICE",
"TIMESTAMP",
]
if response_type == "json":
data_json_ret = []
for record in data_json:
for column in columns_list:
record.pop(column, None)
data_json_ret.append(record)
return data_json_ret

return (
pd.json_normalize(data_json)
.drop(columns=columns_list)
.rename(
columns={
"FH_OPENING_PRICE": "Open Price",
"FH_TRADE_HIGH_PRICE": "High Price",
"FH_CLOSING_PRICE": "Close Price",
"FH_TRADE_LOW_PRICE": "Low Price",
"FH_CHANGE_IN_OI": "Change in OI",
"FH_EXPIRY_DT": "Expiry Date",
"FH_TIMESTAMP": "Date",
}
)
)

0 comments on commit 9bb2d86

Please sign in to comment.