Causal Modeling
Yes. In fact, causal modelling is one of the most advanced topics in quantitative finance and is becoming increasingly important because traditional ML models (LSTM, XGBoost, Transformers) often learn correlations, whereas causal models aim to discover why prices move.
Since I am pursuing an MSc in Financial Engineering at WQU, I’ll teach it at that level, covering theory, mathematics, and Python implementations.
Learning Roadmap
We’ll build from scratch.
- Correlation vs Causation
- Structural Causal Models (SCM)
- Directed Acyclic Graphs (DAGs)
- Causal Discovery Algorithms
- Do-Calculus (Pearl)
- Counterfactual Prediction
- Causal Forecasting
- Applying causal models to stock prediction
- Building an end-to-end project
Step 1 — Correlation vs Causation
Suppose we have
Oil PriceAirline Stock↑↓↓↑
They are negatively correlated.
But does oil directly affect airlines?
Yes.
Higher fuel cost
→ higher operating expenses
→ lower profit
→ lower stock price
This is a causal relationship.
Now another example.
Ice Cream SalesShark Attacks↑↑
Highly correlated.
Does ice cream cause sharks?
No.
Common cause:
Summer
→ more people swim
→ more shark attacks
Summer
→ more ice cream sales
This is a confounder.
Traditional ML usually cannot distinguish these.
Step 2 — Financial Example
Imagine predicting Apple stock.
Variables
Interest RateInflationUSD IndexNasdaq IndexApple EarningsApple Stock
The causal graph looks like
Interest Rate
\
\
\
Inflation ---> USD
\
\
\
Nasdaq ----\
\
\
Apple Earnings
\
\
Apple StockNotice
Interest rate does NOT directly cause Apple stock.
It changes
Interest Rate
↓
Bond Yield
↓
Investor Preference
↓
Nasdaq
↓
Apple
That matters.
Step 3 — Structural Causal Model (SCM)
Every node has an equation.
Example
Inflation = NoiseInterestRate = 0.8 × Inflation + NoiseUSD = 0.5 × InterestRate + NoiseNasdaq = -0.7 × InterestRate + NoiseApple =0.6 × Nasdaq+0.4 × Earnings+Noise
Unlike regression,
each equation represents a mechanism.
Python Example
Generate synthetic causal data.
import numpy as np
import pandas as pdnp.random.seed(42)N = 1000inflation = np.random.normal(2,0.5,N)interest = 0.8*inflation + np.random.normal(0,0.2,N)usd = 0.5*interest + np.random.normal(0,0.3,N)nasdaq = -0.7*interest + np.random.normal(0,0.5,N)earnings = np.random.normal(5,1,N)apple = (
0.6*nasdaq
+0.4*earnings
+np.random.normal(0,0.5,N)
)df = pd.DataFrame({
"Inflation":inflation,
"Interest":interest,
"USD":usd,
"Nasdaq":nasdaq,
"Earnings":earnings,
"Apple":apple
})print(df.head())
Notice that we explicitly generated the causal relationships.
Step 4 — Draw the DAG
Using NetworkX
import networkx as nx
import matplotlib.pyplot as pltG = nx.DiGraph()G.add_edges_from([
("Inflation","Interest"),
("Interest","USD"),
("Interest","Nasdaq"),
("Nasdaq","Apple"),
("Earnings","Apple")
])nx.draw(G,
with_labels=True,
node_size=3000,
arrows=True)plt.show()
Produces
Inflation↓Interest↙ ↘USD Nasdaq ↓ Apple
↑Earnings
Step 5 — Why This Is Better Than Regression
Suppose Fed raises rates.
Get Dhiraj Patra’s stories in your inbox
Join Medium for free to get updates from this writer.
Regression says
Past data:Rate ↑Apple ↓Therefore predict Apple ↓
But suppose
Apple reports record earnings.
Causal model says
Interest ↑↓Nasdaq ↓↓Apple ↓BUTEarnings ↑↑↓Apple ↑
The model understands competing causes.
This is much closer to how human analysts reason.
Step 6 — Counterfactual Prediction
Question:
“What would Apple have done if the Fed had NOT increased rates?”
Regression cannot answer.
Causal model can.
interest = 5.5# Interventioninterest = 2.0# Recompute downstream variablesusd = 0.5*interestnasdaq = -0.7*interestapple = 0.6*nasdaq + 0.4*earnings
This is called an intervention:
do(Interest=2%)instead of merely observing Interest = 2%.
Step 7 — Real Stock Prediction
For NIFTY prediction, a richer causal graph might be:
Fed Rate
↓
US Dollar
↓
Crude Oil
↓
Indian Inflation
↓
RBI Rate
↓
Bank Nifty
↓
NIFTYGDP↓Corporate Earnings↓NIFTYVIX↓NIFTYFII Flow↓NIFTY
A causal model uses these relationships rather than feeding all variables into a black-box predictor.
Step 8 — Libraries
Popular Python libraries include:
DoWhy— causal inference and effect estimationCausalNex— Bayesian networks and causal graphspgmpy— Bayesian networks (already familiar from your coursework)econml— heterogeneous treatment effectslingam— causal discovery for linear non-Gaussian modelscausal-learn— PC, GES, FCI, NOTEARS and other discovery algorithmsnetworkx— graph visualization
Example with DoWhy:
from dowhy import CausalModelmodel = CausalModel(
data=df,
treatment="Interest",
outcome="Apple",
common_causes=["Inflation"]
)identified_estimand = model.identify_effect()estimate = model.estimate_effect(
identified_estimand,
method_name="backdoor.linear_regression"
)print(estimate.value)
Final Project (MSc-Level)
A strong capstone could combine:
- Data collection
- Yahoo Finance
- FRED (interest rates)
- RBI
- FII/DII flows
- VIX
- Crude oil
- USD/INR
- CPI
- Causal discovery
- PC Algorithm
- NOTEARS
- LiNGAM
- Bayesian Network
- Build the DAG
- Learn conditional probability tables or continuous conditional distributions
- Causal forecasting
- Estimate intervention effects
- Perform counterfactual analysis
- Forecast index or stock prices under different macroeconomic scenarios
- Explainability
- Show which causal paths contributed most to the prediction
- Compare against LSTM, XGBoost, and Transformer models
This kind of project aligns well with your financial engineering background because it integrates probabilistic graphical models, macroeconomic reasoning, and interpretable AI rather than relying solely on black-box prediction.







