Excelgoodies logo +1 650 491 3131

LEARN THIS HANDS ON

Power BI Reporting

ET . Live Online FILLING FAST
View all upcoming batches
Excel to Power BI for Finance Teams: Building Robust Risk, P&L and Trading Dashboards in Chicago

Excel to Power BI for Finance Teams: Building Robust Risk, P&L and Trading Dashboards in Chicago

Finance teams in Chicago often sit on a stack of linked Excel workbooks: daily P&L, risk limits, VaR exports, trade tickets, and a few VBA macros holding it all together. It works until someone breaks a formula chain or the file size hits the point where recalculation becomes an afternoon activity. This article walks through how to move that stack into Power BI in a way that keeps risk, P&L, and trading dashboards accurate, performant, and auditable.

We’ll follow one realistic scenario: a mid-size trading and treasury team with

  • A daily P&L workbook (by desk, strategy, trader)
  • A risk workbook (limits, exposures, VaR from an external system)
  • A trades workbook (tickets exported from an OMS, enriched in Excel)

All three are maintained by finance in Excel and emailed around Chicago every morning.


1. The Starting Point: What’s Broken in the Excel Setup

The existing Excel-based process has typical issues:

  • Multiple versions of the truth: Different copies of the P&L workbook with slightly different formulas.
  • Manual joins: Risk and P&L are matched with VLOOKUP/XLOOKUP on trade IDs and desk codes.
  • Fragile macros: VBA pulls data from CSV exports and external databases but breaks when column layouts change.
  • Limited history: Only a few weeks of data are kept before the file becomes unwieldy.

The business asks for:

  • A consolidated Risk + P&L + Trading dashboard in Power BI
  • Hourly refresh during Chicago trading hours
  • Ability to drill from desk-level P&L into individual trades
  • Clear reconciliation back to source data when numbers are challenged

We’ll keep Excel as the front door for some inputs, but move the model and reporting to Power BI.


2. Data Architecture: Don’t Just Import the Workbook

The first trap is pointing Power BI Desktop at the existing Excel report workbook and importing the formatted sheets. That usually brings in:

  • Aggregated tables instead of raw trades
  • Hidden rows, subtotals, and formulas baked into the data
  • Layout changes breaking Power Query steps

For a finance-grade model, you want raw, tabular data:

  • Trades: One row per trade, with IDs, desk, trader, instrument, quantities, prices, cash flows, and dates.
  • Market data / curves (if needed): Standardized reference tables.
  • Risk metrics: Exposure, VaR, greeks, limits by desk / trader / instrument.
  • P&L results: Daily results by desk, strategy, trader, and instrument.
  1. Separate operational Excel from reporting Excel

    • Keep Excel for operational processes where needed.
    • Create separate, clean data-export workbooks or CSVs with tabular data only.
  2. Use Power Query (Get Data) to ingest raw tables

    • Connect to:
      • CSV exports from OMS/Risk systems
      • SQL databases if available
      • Tabular ranges or tables in Excel (not pivot tables, not formatted reports)
  3. Move recurring transformations into Power Query

    • What used to be VBA and formula logic becomes M transformations.

Example: cleaning a trades CSV exported daily in Chicago time.

let
    Source = Csv.Document(
        File.Contents("C:\FinanceData\Trades\TradesExport.csv"),
        [Delimiter = ",", Columns = 15, Encoding = 65001, QuoteStyle = QuoteStyle.Csv]
    ),
    PromoteHeaders = Table.PromoteHeaders(Source, [PromoteAllScalars = true]),
    ChangeTypes = Table.TransformColumnTypes(
        PromoteHeaders,
        {
            {"TradeID", type text},
            {"Desk", type text},
            {"Trader", type text},
            {"Instrument", type text},
            {"TradeDate", type date},
            {"SettleDate", type date},
            {"Quantity", type number},
            {"Price", type number},
            {"Notional", type number},
            {"Currency", type text}
        }
    ),
    FilterValidDates = Table.SelectRows(ChangeTypes, each [TradeDate] <> null)
in
    FilterValidDates

This is deterministic: if the CSV layout stays stable, Power Query will reliably produce the same schema, which is critical for a finance model.


3. Choosing Storage Mode: Import vs DirectQuery for Finance

Finance teams often want near-real-time data, but risk and P&L models are typically complex and aggregation-heavy. Storage mode choice matters.

Import mode

  • Data is loaded into the VertiPaq engine in the dataset.
  • Fast aggregations and complex DAX are well supported.
  • Refresh is scheduled (e.g., every 30 or 60 minutes) or triggered via the REST API.

For most Chicago finance teams with hourly or a few-times-per-day risk/P&L updates, Import mode is usually the best default.

DirectQuery

  • Queries are translated and sent to the source at report interaction time.
  • Good when you need data that updates continuously and can’t be cached.
  • Comes with limitations:
    • Certain DAX functions and relationships patterns can cause more source queries.
    • Performance depends heavily on source system and network.

For trading and risk dashboards:

  • Use Import for core fact tables (trades, risk, P&L) unless you genuinely need sub-minute freshness.
  • Consider Hybrid tables (Import + DirectQuery partitions) in Power BI Premium or Fabric capacity if:
    • You need both historical data and near-real-time for today’s trades.

Be explicit with stakeholders: “We’ll refresh P&L and risk every 30 minutes during Chicago trading hours; drill-downs will be fast because data is in-memory.”


4. Data Model Design: Facts, Dimensions and Reconciliation

The central design decision is how to model trades, risk, and P&L together.

Core tables

At minimum:

  • FactTrades: one row per trade
  • FactRisk: risk metrics by desk/trader/instrument/date
  • FactPnL: P&L by desk/trader/instrument/date
  • DimDesk: desk attributes (region, book, business unit)
  • DimTrader: trader attributes (desk, hire date, status)
  • DimDate: calendar and business-day flags
  • DimInstrument: instrument classification (asset class, product type, tenor)

Relationships:

  • Fact tables link to DimDesk, DimTrader, DimDate, DimInstrument.
  • Avoid many-to-many relationships for core finance logic unless there is a clear, controlled use case.

Example: DimDate table with working-day flags for Chicago.

DimDate =
ADDCOLUMNS(
    CALENDAR(DATE(YEAR(TODAY()) - 2, 1, 1), DATE(YEAR(TODAY()) + 1, 12, 31)),
    "Year", YEAR([Date]),
    "Month", MONTH([Date]),
    "Day", DAY([Date]),
    "Weekday", WEEKDAY([Date], 2), // 1 = Monday, 7 = Sunday
    "IsWeekend", IF(WEEKDAY([Date], 2) > 5, TRUE(), FALSE())
)

You can later extend this with a Chicago-specific business calendar (holidays, trading days) via a lookup table or additional columns.

Reconciliation strategy

Finance teams need to reconcile Power BI outputs with Excel and source systems.

Patterns that help:

  • Store raw imports as separate queries/tables (e.g., RawTrades, RawRisk, RawPnL).
  • Build clean fact tables from raw tables via Power Query (e.g., FactTrades from RawTrades).
  • Maintain row-level identifiers (TradeID, RiskRunID, PnLRunID) and expose them in detail tables.

This lets you:

  • Show aggregated dashboards (desk-level P&L, risk limits usage).
  • Drill to rows that match exactly what came from the upstream system or Excel export.

5. DAX for Risk and P&L: Measures that Finance Can Trust

With the model in place, you move logic from Excel formulas into DAX measures. The goal is transparent, auditable calculations.

Example: Daily P&L by desk

Assume FactPnL has columns: [DeskKey], [Date], [RealizedPnL], [UnrealizedPnL].

Total PnL =
VAR Realized = SUM(FactPnL[RealizedPnL])
VAR Unrealized = SUM(FactPnL[UnrealizedPnL])
RETURN Realized + Unrealized

This is straightforward and predictable: it respects the filter context (desk, trader, date).

Example: Risk limit utilization

Assume FactRisk has [ExposureUSD] and DimDesk has [RiskLimitUSD].

Risk Limit Utilization % =
DIVIDE(
    SUM(FactRisk[ExposureUSD]),
    SUM(DimDesk[RiskLimitUSD])
)

This measure will behave correctly if DimDesk and FactRisk have a standard one-to-many relationship on DeskKey and you filter on a single desk or a set of desks. For cross-desk views, you’re aggregating exposure and limits over the same set of desks.

Example: VaR aggregation caution

If you’re dealing with Value at Risk (VaR), be explicit: VaR is not generally additive across desks or time. In many setups, you should:

  • Expose VaR as a non-additive measure where aggregation is limited to certain views.
  • Use DAX measures that return blank or a warning when filters violate the intended aggregation level.

Example: only show VaR when a single date is selected.

Portfolio VaR =
VAR SelectedDates = VALUES(DimDate[Date])
VAR DateCount = COUNTROWS(SelectedDates)
RETURN
IF(
    DateCount = 1,
    SUM(FactRisk[VaR]),
    BLANK()
)

This avoids misleading aggregations over multiple dates; the measure will show blank unless the report is filtered to a single date.


6. Building the Dashboards: Risk, P&L and Trading Views

With the data model and measures ready, you can design three core dashboards.

6.1 P&L dashboard

Key visuals:

  • Matrix: Desk → Trader → Instrument, with Total PnL, Realized, Unrealized.
  • Line chart: P&L over time by desk or strategy.
  • Bar chart: Top/bottom traders by P&L for the selected period.

Design considerations:

  • Use DimDate slicers with business-day filters (e.g., last 5 trading days).
  • Add bookmark-driven views for daily vs MTD vs YTD P&L.

6.2 Risk dashboard

Key visuals:

  • Card: Total exposure vs total risk limits for selected desks.
  • Bar chart: Risk limit utilization % by desk.
  • Table: Detailed view with desk, trader, instrument, exposure, VaR, limit, utilization.

Design considerations:

  • Use conditional formatting on utilization % (e.g., color scale) to highlight desks near or above limits.
  • Provide filters for asset class, product type, and tenor.

6.3 Trading activity dashboard

Key visuals:

  • Histogram or bar chart: Trade count by size bucket.
  • Line chart: Notional traded over time.
  • Table: Trade-level detail with TradeID, desk, trader, instrument, quantity, price, notional.

Design considerations:

  • Enable drill-through from desk-level P&L or risk visuals to the trade detail page.
  • Use filters for instrument type, currency, and side (buy/sell).

7. Refresh Strategy for a Chicago Trading Day

The team wants data updated multiple times per day, aligned with Chicago trading hours.

Scheduled refresh

In Power BI Service:

  • For Import mode datasets, configure scheduled refresh.
  • On shared capacity, you can set multiple refresh times per day (subject to service limits).
  • On Premium or Fabric capacity, you can schedule more frequent refreshes and use incremental refresh.

Incremental refresh for finance data

Incremental refresh is valuable when:

  • You have several years of historical trades, risk, and P&L.
  • Only recent partitions (e.g., last few days/weeks) change during the trading day.

Set up incremental refresh on large fact tables (FactTrades, FactRisk, FactPnL):

  • Define a RangeStart and RangeEnd parameter.
  • Configure the policy in Power BI Desktop (e.g., store 5 years, refresh last 7 days).
  • Publish to a workspace backed by Premium or Fabric capacity for full incremental refresh capabilities.

This keeps refresh times manageable while maintaining history.

Triggered refresh

If your upstream processes (e.g., risk system batch jobs) run on a known schedule, you can:

  • Use the Power BI REST API to trigger dataset refresh after upstream loads complete.
  • Align this with Chicago intraday batch cycles (e.g., mid-morning risk run, afternoon P&L run).

This reduces the window where the dashboard shows stale numbers.


8. Governance, Security and Auditability

Finance teams care about who sees what and how changes are tracked.

Row-level security (RLS)

Common patterns:

  • Restrict access by desk or business unit.
  • Limit visibility of trader-level detail to specific managers.

Example: RLS with a bridge table mapping users to desks.

  • Create a table UserDeskAccess with columns: [UserPrincipalName], [DeskKey].
  • Relate UserDeskAccess to DimDesk.

RLS role DAX filter on DimDesk:

[DeskKey] IN VALUES(UserDeskAccess[DeskKey])

In Power BI Service, assign users to the role. When they access the report, they only see desks listed in UserDeskAccess for their user principal name.

Versioning and change control

Patterns that help:

  • Store DAX measures and model changes in source control via Tabular Editor connected to the dataset.
  • Maintain a change log of business logic adjustments (e.g., how P&L is split between realized and unrealized).

This matters when numbers are challenged by risk, trading, or external audit.


9. Practical Takeaway for Chicago Finance Teams

For finance teams moving from Excel to Power BI for risk, P&L and trading dashboards, the key is to treat Power BI as a data model and calculation engine first, and a visualization tool second. Start by stabilizing your data exports, build a clean fact/dimension model with auditable DAX, choose Import mode with an incremental refresh strategy that fits Chicago trading hours, and then layer dashboards and RLS on top.

If you get the model and refresh plan right, the dashboards become a thin layer that can evolve quickly without re-breaking the underlying numbers every time someone wants a new view.

Editor's Note

This article reflects the shift finance teams are making from fragile Excel-based risk and P&L workbooks to structured Power BI models with scheduled refresh and governance, particularly in trading environments that need intraday visibility without sacrificing auditability.

Professionals who want to apply these patterns to their own data can explore Excelgoodies' Power BI Training in Chicago, Illinois programme - taught live by instructors, with certification awarded once a real project is running at work.

Insights compiled through ongoing industry research and discussions within the Excelgoodies Analytics Community.

Power BI

New

Next Batches Now Live

Power BIPower BI
SQLSQL
Power AppsPower Apps
Power AutomatePower Automate
Microsoft FabricMicrosoft Fabrics
AzureAzure Data Engineering
Explore Dates & Reserve Your Spot → Reserve Your Spot →