Friday, November 27, 2020

सत्यनारायण लाल - किसान (Kisan - Satyanarayan Lal)

नहीं हुआ है अभी सवेरा
पूरब की लाली पहचान
चिड़ियों के जगने से पहले
खाट छोड़ उठ गया किसान ।

खिला-पिलाकर बैलों को ले
करने चला खेत पर काम
नहीं कोई त्योहार न छुट्टी
उसको नहीं काबी आराम।

गरम-गरम लू चलती सन-सन
धरती जलती तवा समान
तब भी करता काम खेत पर
बिना किए आराम किसान।

बादल गरज रहे गड़-गड़-गड़
बिजली चमक रही चम-चम
मुसलाधार बरसता पानी
ज़रा न रुकता लेता दम।

हाथ पांव ठिठुरते जाते हैं
घर से बाहर निकले कौन
फिर भी आग जला, खेतों की
रखवाली करता है वह मौन।

है किसान को चैन कहाँ, वह
करता रहता हरदम काम
सोचा नहीं कभी भी उसने
घर पर रह करना आराम।

- सत्यनारायण लाल

Wednesday, November 25, 2020

Read Option chain data from Nifty using Python

Read Option chain data from Nifty using Python


Option chain data is very crucial for Future and Options(FnO) trader analysis, many use it for positional while many use it to find day trend and it's strength as well as option strike selection for trading.


In this blog post we will try to figure out how to read options data from NSE APIs using Python.

Code:

   
  #!/usr/bin/env python3
 
import requests
import pandas as pd
from datetime import datetime
from dateutil.relativedelta import relativedelta, TH
 
# Find next thursday to figure out weekly expiry.
def next_thu_expiry_date():
    todayte = datetime.today()
 
    next_thursday_expiry = todayte + relativedelta(weekday=TH(1))
 
    str_next_thursday_expiry = str(next_thursday_expiry.strftime("%d")) + "-" + next_thursday_expiry.strftime(
        "%b") + "-" + next_thursday_expiry.strftime("%Y")
    print(str_next_thursday_expiry)
    return str_next_thursday_expiry
 
 
def find_ce_pe(spot_price, ce_values, pe_values):
    spot_price = round(spot_price, -2)
    otm_calls = []
    otm_puts = []
 
    ce_dt = pd.DataFrame(ce_values).sort_values(['strikePrice'])
    pe_dt = pd.DataFrame(pe_values).sort_values(['strikePrice'], ascending=False)
 
    for ce_value in ce_dt['strikePrice']:
        if ce_value >= spot_price:
            otm_calls.append(ce_value)
            if len(otm_calls) > 10:
                break
 
    for ce_value in pe_dt['strikePrice']:
        if ce_value <= spot_price:
            otm_puts.append(ce_value)
            if len(otm_puts) > 10:
                break
 
    return otm_calls, otm_puts
 
 
def read_oi(spot_price, ce_values, pe_values, symbol):
    sheet_name = str(datetime.today().strftime("%d-%m-%Y")) + symbol
 
    strike_oi_ce_pe = find_ce_pe(float(spot_price), ce_values, pe_values)
 
    ce_dt = pd.DataFrame(ce_values).sort_values(['strikePrice'])
    pe_dt = pd.DataFrame(pe_values).sort_values(['strikePrice'], ascending=False)
 
    drop_col = ['pchangeinOpenInterest', 'askQty', 'askPrice', 'underlyingValue', 'totalBuyQuantity',
                'totalSellQuantity', 'bidQty', 'bidprice', 'change', 'pChange', 'impliedVolatility',
                'totalTradedVolume']
    ce_dt.drop(drop_col, inplace=True, axis=1)
    pe_dt.drop(drop_col, inplace=True, axis=1)
 
    ce_dt = ce_dt.loc[ce_dt['strikePrice'].isin(strike_oi_ce_pe[0])]
    pe_dt = pe_dt.loc[pe_dt['strikePrice'].isin(strike_oi_ce_pe[1])]
 
    # print(ce_dt[['strikePrice', 'lastPrice']])
    # print(pe_dt[['strikePrice', 'changeinOpenInterest']])
 
    print(ce_dt.head(1))
    print(pe_dt.head(1))
 
    print(str([spot_price, (ce_dt['changeinOpenInterest'].sum()),
               (pe_dt['changeinOpenInterest'].sum())]))
 
 
def main():
    symbols = ["BANKNIFTY", "NIFTY"]
    base_url = 'https://www.nseindia.com/api/option-chain-indices?symbol='
    url_oc = "https://www.nseindia.com/option-chain"
 
    for symbol in symbols:
        headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, ''like Gecko) '
                                 'Chrome/80.0.3987.149 Safari/537.36',
                   'accept-language': 'en,gu;q=0.9,hi;q=0.8', 'accept-encoding': 'gzip, deflate, br'}
        session = requests.Session()
        request = session.get(url_oc, headers=headers, timeout=5)
        cookies = dict(request.cookies)
        response = session.get(base_url + symbol, headers=headers, timeout=5, cookies=cookies)
        print(response.status_code)
        dajs = response.json()
        expiry = next_thu_expiry_date()
 
        spot_price = dajs['records']['underlyingValue']
        ce_values = [data['CE'] for data in dajs['records']['data'] if "CE" in data and data['expiryDate']
                     == expiry]
        pe_values = [data['PE'] for data in dajs['records']['data'] if "PE" in data and data['expiryDate']
                     == expiry]
 
        read_oi(spot_price, ce_values, pe_values, symbol)
 
        print(len(dajs))
 
 
if __name__ == '__main__':
    main()
  
  


In case of any doubt leave a comment I will try to answer.

Note: This post is for educational purpose only.

Sunday, November 22, 2020

Automatic Login to Zerodha using Python and Selenium

Hello Readers,

 

Today we will try to learn browser automation using Python and Selenium automation tool.

 

We will write a code to automate login process of Zerodha trading platform using selenium and python in Google Chrome browser.

Place a file named zerodha-credentials.json at the same location as the actual python script with zerodha credentials as below:

{
"username": "ab12312",
"password": "changeit",
"pin": "123123"
}


Run the below script to automatically login, code is mostly self-explanatory leave a comment if any doubt, I will try to respond.

 

from selenium import webdriver
# used to ID the different keys on the keyboard define options
from selenium.webdriver.chrome.options import Options
# locate
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
import time
import json
def load_credentials():
with open("zerodha-credentials.json") as creds:
data = json.load(creds)
return data
def get_access_token():
options = Options()
options.add_argument("start-maximized")
options.add_argument("disable-infobars")
options.add_argument("--disable-extensions")
driver = webdriver.Chrome(options=options)
# the website we want to open
driver.get("https://kite.zerodha.com")
data = load_credentials()
# identify login section
WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.XPATH, '//div[@class="login-form"]//form')))
# enter the ID
driver.find_element_by_xpath("//*[@type='text']").send_keys(data['username'])
# enter the password
driver.find_element_by_xpath("//*[@type='password']").send_keys(data['password'])
# submit
driver.find_element_by_xpath("//*[@type='submit']").click()
driver.maximize_window()
# sleep for a second so that the page can submit and proceed to upcoming question (2fa)
time.sleep(1)
# identify login section for 2fa
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//div[@class="login-form"]//form')))
# enter the 2fa code
driver.find_element_by_xpath("//*[@type='password']").send_keys(data['pin'])
# submit
driver.find_element_by_xpath("//*[@type='submit']").click()
print(driver.current_url)
# Click on Postions Page
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Positions']"))).click()
# wait for redirection
WebDriverWait(driver, 10).until(EC.url_contains('status=success'))
if __name__ == "__main__":
get_access_token()

Note: Think before storing your credentials in plain text, potential risk of it being compromised. This post is for education purpose to learn how we can automate web surfing using Python.

Python Basic String opetations

Python is fast emerging as a programming language, so In this post I will try to explain few python String operations required for a novice learner.


if __name__ == '__main__':
name = "Mahendra"
# Check if String is lowercase, similarly we can check for uppercase and title case
print(name.islower())
# Convert string to lowercase
print(name.lower())
# Convert string to uppercase
print(name.upper())
# Count a character in a string
print(name.count('a'))
# Delete a character from String
print(name.replace('a', ''))
# Check if a character is present in String
print('a' in name)
# Check if a substring is present in String
print('Mahen' in name)