Pick your preferred format: the interactive portfolio experience or the static one-page CV.
Pick how you'd like to experience this portfolio. You can always change it later.
BBA Finance candidate at NMIMS '26 with hands-on expertise in debt syndication, credit profiling & equity analysis — and a Python coder who automates what he analyzes.
I'm a final-year BBA Finance student at NMIMS Mumbai with a track record in debt syndication and credit analysis at Fortwise Capital Advisors. When I'm not building credit teasers or running DCF models, I'm writing Python tools that turn financial concepts into interactive programs. I bridge the gap between the analyst's spreadsheet and the developer's terminal.
Full buy-side investment cases using DCF (WACC: 11.9% / 10.88%), scenario analysis, and comps. Identified 81% and 65% implied downsides backed by ROE deterioration and EBITDA margin compression. Delivered as a structured pitch deck.
Multi-year deep dive across 15+ ratios covering liquidity, profitability, leverage, and efficiency. Flagged deteriorating current ratio and rising D/E as key credit risk signals with trend commentary and peer context.
Applied Empirical Mode Decomposition (EMD) in MS Excel to isolate cyclical and trend components from crude oil price data. Quantified the lag between credit market shock and commodity price transmission.
Income/expense analysis, multi-goal SIP calculator, 12-profile asset allocation engine, HLV insurance gap analysis, retirement corpus planner, and EMI analyser — applying BBA Finance concepts in pure Python code.
Apple-style Zen TUI with live clock, Pomodoro timer, todo manager, music library, Spotify/YouTube/ICS integrations, and 9 live views at 20 fps. A full productivity dashboard in the terminal.
SiddharthShah30/deskzenThree fun projects: a Morse code GUI encoder/decoder, a CLI Battleship game with an AI opponent, and an OOP turn-based battle simulator with type-advantage combat mechanics inspired by Bakugan.
A full-featured terminal cricket simulator with 10 real international teams, authentic player stats, toss, pitch & weather conditions, live scorecards, bowling economy, player-of-the-match awards, and match history.
SiddharthShah30/Tricket.pyLive, interactive web versions of my Python projects — running real logic in your browser. Browse the code, play the games, use the tools.
# Personal Financial Planner CLI # by Siddharth Shah — github.com/siddharthshah30 import math def calc_sip(monthly: float, rate: float, years: int) -> dict: """Calculate SIP maturity corpus.""" n = years * 12 r = rate / 100 / 12 maturity = monthly * ( (((1 + r) ** n - 1) / r) * (1 + r) ) invested = monthly * n return { "maturity": maturity, "invested": invested, "gains": maturity - invested, } def calc_emi(principal: float, rate: float, months: int) -> dict: """Calculate loan EMI & total interest.""" r = rate / 100 / 12 emi = principal * r * ( (1 + r) ** months ) / ((1 + r) ** months - 1) total = emi * months return { "emi": emi, "total": total, "interest": total - principal, } def retirement_corpus( current_age: int, retire_age: int, monthly_expense: float, inflation: float = 6.0, returns: float = 10.0 ) -> float: """Estimate corpus needed at retirement.""" years = retire_age - current_age future_expense = monthly_expense * ( (1 + inflation/100) ** years ) # 25x annual expense rule (4% withdrawal) annual = future_expense * 12 corpus = annual * 25 return corpus
# battlefield.py — Battleship Game # by Siddharth Shah import os, time, random def place_ship(size, length=3): orientation = random.choice(["H", "V"]) if orientation == "H": row = random.randint(0, size - 1) col = random.randint(0, size - length) return [(row, col + i) for i in range(length)] else: row = random.randint(0, size - length) col = random.randint(0, size - 1) return [(row + i, col) for i in range(length)] def place_multiple_ships(size, num_ships, length=3): ships = [] while len(ships) < num_ships: new_ship = place_ship(size, length) if not any(cell in ship for ship in ships for cell in new_ship): ships.append(new_ship) return ships def calculate_score(num_ships, attempts_used, attempts_available, board_size, hits): ship_points = hits * 15 efficiency_bonus = max(0, (attempts_available - attempts_used) * 5) difficulty_mult = board_size * 2 if hits == 0: return 0 return ship_points + efficiency_bonus + difficulty_mult # Board sizes by ship count: # 1 ship → 5×5, 3 attempts # 2 ships → 7×7, 6 attempts # 3 ships → 9×9, 9 attempts # Each HIT grants +1 bonus attempt # Ships are 3 cells long (H or V) # Symbols: X = Hit, O = Miss, ~ = Unknown
# MorsePy — Morse Code Encoder/Decoder # by Siddharth Shah MORSE_CODE = { 'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.', 'F': '..-.', 'G': '--.', 'H': '....', 'I': '..', 'J': '.---', 'K': '-.-', 'L': '.-..', 'M': '--', 'N': '-.', 'O': '---', 'P': '.--.', 'Q': '--.-', 'R': '.-.', 'S': '...', 'T': '-', 'U': '..-', 'V': '...-', 'W': '.--', 'X': '-..-', 'Y': '-.--', 'Z': '--..', '0': '-----','1': '.----', '2': '..---','3': '...--', '4': '....-','5': '.....', '6': '-....','7': '--...', '8': '---..','9': '----.', } REVERSE = {v: k for k, v in MORSE_CODE.items()} def encode(text: str) -> str: words = text.upper().split() return ' / '.join( ' '.join( MORSE_CODE.get(c, '?') for c in word ) for word in words ) def decode(morse: str) -> str: words = morse.split(' / ') return ' '.join( ''.join( REVERSE.get(code, '?') for code in word.split() ) for word in words )
Terminal StandBy is a full Apple-style Zen productivity dashboard — it runs at 20fps in your terminal with live clock, Pomodoro, todos, music sync, and 9 views. Because it uses rich, curses, and live Spotify/YouTube API calls, it can't run in a browser — but here's a live mock of what it looks like.
# Tricket — Terminal Cricket Game # by Siddharth Shah — github.com/siddharthshah30 import random TEAMS = { "India": ["Rohit Sharma", "Virat Kohli", "Jasprit Bumrah", ...], "Australia": ["David Warner", "Steve Smith", "Pat Cummins", ...], # 10 teams total with full 11-player squads } PLAYER_STATS = { "Virat Kohli": { "bat_skill": 95, "aggression": 80, "bowl_skill": 10, "stamina": 90 }, "Jasprit Bumrah": { "bat_skill": 10, "aggression": 50, "bowl_skill": 96, "bowl_type": "pace" }, # 110 players across all teams } def simulate_ball(batter, bowler, pitch, weather): base = batter["bat_skill"] - bowler["bowl_skill"] * 0.6 swing = pitch["seam"] if bowler["bowl_type"] == "pace" else 0 spin = pitch["turn"] if bowler["bowl_type"] == "spin" else 0 prob = base - swing - spin + weather["factor"] roll = random.randint(1, 100) if roll > prob + 30: return "WICKET" if roll > prob + 15: return 0 runs_table = [1,1,2,2,3,4,4,6] return random.choice(runs_table)
spoken & written
I'm actively seeking finance, banking, and business development roles for 2026. Open to internships, analyst roles, and collaborations.