To long the stocks with target. We need to find –
First Let’s create an instrument token fetching function –
instrumentList = pd.DataFrame(kite.instruments())
def get_insToken(tradesymbol,exchange="NFO"):
if(exchange=="NSE"):
if(tradesymbol=="NIFTY"):tradesymbol="NIFTY 50"
if(tradesymbol=="BANKNIFTY"):tradesymbol="NIFTY BANK"
#print(tradesymbol)
#print(exchange)
dataToken = instrumentList[(instrumentList['tradingsymbol'] == tradesymbol)&(instrumentList['exchange']==exchange)]
return dataToken.instrument_token.iloc[0]
Let’s get the entries –
#Price At The Particular Time
import datetime
# Create a function to get the price and high of a stock at a specific time
def get_stock_data(symbol, time):
# Define the start and end date
start_date = pd.Timestamp(time)
end_date = start_date + datetime.timedelta(minutes=5)
# Convert start and end date to string format
from_date = start_date.strftime('%Y-%m-%d %H:%M:%S')
# Fetch historical data for the stock
data = kite.historical_data(instrument_token=get_insToken(symbol+"23APRFUT"),
from_date=from_date,
to_date=from_date,
interval='minute')
# Return the price and high of the stock at that time
return data[0]['open']
# Add new columns to the DataFrame
df['price'] = ''
# Iterate over each row of the DataFrame
for index, row in df.iterrows():
# Get the stock symbol and triggered time
symbol = row['Stocks (new stocks are highlighted)']
time = row['Triggered at']
# Get the price and high of the stock at the triggered time
price= get_stock_data(symbol, time)
# Update the price and high columns
df.at[index, 'price'] = price
df
Note there is a high chance that you will get this following error –
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
Cell In[14], line 34
31 time = row['Triggered at']
33 # Get the price and high of the stock at the triggered time
---> 34 price= get_stock_data(symbol, time)
36 # Update the price and high columns
37 df.at[index, 'price'] = price
Cell In[14], line 22, in get_stock_data(symbol, time)
16 data = kite.historical_data(instrument_token=get_insToken(symbol+"23ARFUT"),
17 from_date=from_date,
18 to_date=from_date,
19 interval='minute')
21 # Return the price and high of the stock at that time
---> 22 return data[0]['open']
IndexError: list index out of range
It means that you may have overlooked the data fine-tuning process.
Specifically, you are currently backtesting intraday futures data for the current month. This is because the Zerodha KiteConnect API does not permit the retrieval of intraday data for derivative instruments from previous months. To rectify this, you should modify the portion of the code where “23APRFUT” is specified to match the current month you are conducting the backtest for.
Additionally, it is advisable to remove data corresponding to other months from the “entropy.csv” file to ensure accurate and relevant results. We did that programitcally in the line –
df_filtered = df.loc[df['Triggered at'].dt.strftime('%Y-%m') == '2023-04']
So make sure to change the date there to the current month You’re testing on.
Let’s get the targets –
def get_high_of_day(kite, df):
high_list = []
for i, row in df.iterrows():
# Get historical data for the trigger date of the stock
symbol = row['Stocks (new stocks are highlighted)']
data = kite.historical_data(instrument_token=get_insToken(symbol+"23APRFUT"),
from_date=row['Trigger Date'],
to_date=row['Trigger Date'],
interval='day')
# Get the high of the day
high = data[0]['high']
high_list.append(high)
df['high'] = high_list
return df
df=get_high_of_day(kite, df)
df
Now, few cosmetic surgeries.
Count.
"Stocks (new stocks are highlighted)"
to just "Stocks"
?
Triggered at stocks Trigger Date Trigger Time price high
59 2023-04-03 10:01:00 MARUTI 2023-04-03 10:01:00 8558.15 8634.85
57 2023-04-03 10:04:00 M&M 2023-04-03 10:04:00 1178.5 1187.15
54 2023-04-03 10:10:00 ASHOKLEY 2023-04-03 10:10:00 142.6 143.30
53 2023-04-03 10:16:00 CHAMBLFERT 2023-04-03 10:16:00 270.65 273.90
51 2023-04-03 10:17:00 GMRINFRA 2023-04-03 10:17:00 42.8 43.95
50 2023-04-03 14:48:00 CROMPTON 2023-04-03 14:48:00 300.3 301.80
49 2023-04-05 10:48:00 TATACOMM 2023-04-05 10:48:00 1261.45 1284.40
... ... ... ... ... ...
5 2023-04-20 10:02:00 ICICIBANK 2023-04-20 10:02:00 897.05 901.00
4 2023-04-20 12:49:00 CUB 2023-04-20 12:49:00 132.7 134.35
3 2023-04-20 14:16:00 BAJAJ-AUTO 2023-04-20 14:16:00 4321 4336.60
2 2023-04-20 15:21:00 TATACONSUM 2023-04-20 15:21:00 705.7 706.50
1 2023-04-21 09:58:00 ASIANPAINT 2023-04-21 09:58:00 2854.75 2888.00
0 2023-04-21 10:07:00 APOLLOTYRE 2023-04-21 10:07:00 335.5 337.85
60 rows × 6 columns
That concludes part 1 of this chapter. In the next chapter,