initialising
Appearance
Choose your theme

Pick how you'd like to experience this portfolio. You can always change it later.

Dark
Light
System
Dark Mode
Text Size
Available for opportunities · Mumbai, India

Siddharth Shah Finance & Code.

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.

View Work Get in Touch
9+
NBFC Credits Built
6+
Python Projects
3yrs
Finance Study
SCROLL
01.

About Me

/ Bio
Finance mind with a coder's instinct.

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.

/ Location
Mumbai, India
Borivali (W) · 400092
IST (UTC+5:30)
Open to remote & hybrid roles
/ Status
Open to Work
Finance · Banking
Business Development
Graduate roles · 2026
/ Tech Skills
Python MS Excel (Adv.) HTML/CSS/JS Jamovi Orange ML Notion Adobe Suite PowerPoint
/ Finance Skills
DCF Valuation Credit Profiling Debt Syndication Ratio Analysis Scenario Analysis Comps / Benchmarking NBFC / MFI Lending
/ Currently
→ BBA Finance — NMIMS '26
→ Building CLI finance tools
→ Seeking analyst roles
github.com/siddharthshah30
02.

Work Experience

May — Jul 2025
FORTWISE CAPITAL
Finance Intern
Fortwise Capital Advisors LLP · Mumbai
  • Built credit teasers for 9 NBFCs and MFIs using MS Excel, directly supporting the firm's debt syndication pipeline and building investor-ready documentation.
  • Analysed financial statements to surface key credit strengths, risk flags, and structural weaknesses for prospective debt investors.
  • Reviewed legal deal documentation and gained hands-on exposure to deal structuring in the Indian debt market.
  • Developed deep knowledge of the Indian microfinance sector, its regulatory framework, and NBFC lending dynamics.
03.

Finance Projects

Finance · Equity Research
Equity Stock Pitch — Affle & Happiest Minds

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.

DCF WACC Comps Scenario Analysis
Finance · Credit Analysis
Ratio Analysis — Olectra Greentech (FY2021–24)

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.

Ratio Analysis Credit Risk Trend Analysis
Finance · Macro Research
2007–08 Crisis Impact on Crude Oil

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.

EMD Analysis Macro Commodities
04.

Coding Projects

Python · CLI Tool
Personal Financial Planner CLI

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.

Python Finance CLI
Python · TUI Application
Terminal StandBy

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.

Python TUI Spotify API 20fps
SiddharthShah30/deskzen
Python · Games & Tools
MorsePy · Battleship · Bakugan Sim

Three 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.

Python OOP GUI AI Logic
SiddharthShah30/MorsePy SiddharthShah30/battleshipPy
Python · Terminal Game
Tricket — Terminal Cricket Game

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.

Python OOP CLI Simulation Sports
SiddharthShah30/Tricket.py
05.

Python Lab

Live, interactive web versions of my Python projects — running real logic in your browser. Browse the code, play the games, use the tools.

financial_planner.py
# 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
↗ View full source on GitHub
$ financial_planner.py
LIVE
Invested Amount
Maturity Value
Total Gains
Wealth Multiple
Monthly EMI
Total Payment
Total Interest
Interest Ratio
Years to Retire
Future Monthly Expense
Corpus Required
Monthly SIP Needed
battlefield.py
# 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
↗ View full source on GitHub
$ battlefield.py
SETUP
— BATTLESHIP — GAME SETUP
X = Hit  ·  O = Miss  ·  ~ = Unknown
+ Each HIT gives +1 bonus attempt
Score = hits×15 + saved×5 + difficulty
morsepy.py
# 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
    )
↗ View full source on GitHub
$ morsepy.py
LIVE
Uses Web Audio API
Quick ref: A=.-   B=-...   C=-.-.   S=...   O=---
Words separated by /

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.

terminal_standby.py — 20fps · Python 3.11
// CLOCK
00:00:00
Wed, 11 Mar 2026
// POMODORO
25:00
FOCUS SESSION
clock
pomodoro
calendar
music
todo
weather
quotes
stats
zen
// TODO
Review Fortwise deal memo
Push battleship.py to GitHub
Complete DCF model — Affle
Update portfolio website
Prepare for NMIMS exam
Read RBI circular on MFIs
3 done · 3 remaining · 0 overdue
// NOW PLAYING
Midnight City
M83 · Hurry Up, We're Dreaming
1:484:15
// INTEGRATIONS
✓ Spotify API · live track sync
✓ YouTube Music · fallback
✓ ICS Calendar · event feed
✓ OpenWeather · conditions
+ 20fps render loop · rich
main.py — Tricket
# 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)
↗ View full source on GitHub
$ Tricket — Terminal Cricket
SETUP
SELECT TEAMS & FORMAT
06.

Education & Languages

University
BBA Finance
NMIMS University, Mumbai
2023 – 2026 · CGPA 2.40 / 4.0
HSC · Class XII
Higher Secondary Certificate
BSGD College, Malad
Maharashtra State Board · 64.50%
ICSE · Class X
Indian Certificate of Secondary Education
R.B.K. School, Mira Road
CISCE · 70.83%

Languages

spoken & written

English
Intermediate
Hindi
Country Language
Gujarati
Mother Tongue

Let's build something
together.

I'm actively seeking finance, banking, and business development roles for 2026. Open to internships, analyst roles, and collaborations.

Explorer
Python · UTF-8
Preview LIVE
TERMINAL
siddharth@portfolio:~
siddharth@portfolio:~$