Business Professionals
Power BI | Power Pivot | Power Query | DAX
Cloud Flows | RPA | AI Builder | Copilot
60+ Formulas | Data Stories | Advanced Reporting & Modeling
VB Programming | Report Automation |
MS-Office Automation
Techno-Business Professionals
Power BI | Power Query | Advanced DAX | SQL - Query &
Programming
Microsoft Fabric | Power BI | Power Query | Advanced DAX |
SQL - Query & Programming
Power BI | Power Apps | Power Automate | Copilot Studio | Power Pages | Dataverse
Microsoft Power Apps | Microsoft Power Automate
Power BI | Adv. DAX | SQL (Query & Programming) |
VBA | Python | Web Scrapping | API Integration
Power BI | Power Apps | Power Automate |
SQL (Query & Programming)
Power BI | Adv. DAX | Power Apps | Power Automate |
SQL (Query & Programming) | VBA | Python | Web Scrapping | API Integration
Power Apps | Power Automate | SQL | VBA | Python |
Web Scraping | RPA | API Integration
Technology Professionals
Power BI | DAX | SQL | ETL with SSIS | SSAS | VBA | Python
Power BI | SQL | Azure Data Lake | Synapse Analytics |
Data Factory | Databricks | Power Apps | Power Automate |
Azure Analysis Services
Microsoft Fabric | Power BI | SQL | Lakehouse |
Data Factory (Pipelines) | Dataflows Gen2 | KQL | Delta Tables | Power Apps | Power Automate
Power BI | Power Apps | Power Automate | SQL | VBA | Python | API Integration
Power BI | Advanced DAX | Databricks | SQL | Lakehouse Architecture
Business Professionals
Power BI | Power Pivot | Power Query | DAX
Cloud Flows | RPA | AI Builder | Copilot
60+ Formulas | Data Stories | Advanced Reporting & Modeling
VB Programming | Report Automation |
MS-Office Automation
Techno-Business Professionals
Power BI | Power Query | Advanced DAX | SQL - Query &
Programming
Microsoft Fabric | Power BI | Power Query | Advanced DAX |
SQL - Query & Programming
Power BI | Power Apps | Power Automate | Copilot Studio | Power Pages | Dataverse
Microsoft Power Apps | Microsoft Power Automate
Power BI | Adv. DAX | SQL (Query & Programming) |
VBA | Web Scrapping | API Integration
Power BI | Power Apps | Power Automate |
SQL (Query & Programming)
Power BI | Adv. DAX | Power Apps | Power Automate |
SQL (Query & Programming) | VBA | Web Scrapping | API Integration
Power Apps | Power Automate | SQL | VBA |
Web Scraping | RPA | API Integration
Technology Professionals
Power BI | DAX | SQL | ETL with SSIS | SSAS | VBA
Power BI | SQL | Azure Data Lake | Synapse Analytics |
Data Factory | Azure Analysis Services
Microsoft Fabric | Power BI | SQL | Lakehouse |
Data Factory (Pipelines) | Dataflows Gen2 | KQL | Delta Tables
Power BI | Power Apps | Power Automate | SQL | VBA | API Integration
Power BI | Advanced DAX | Databricks | SQL | Lakehouse Architecture
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
All three are maintained by finance in Excel and emailed around Chicago every morning.
The existing Excel-based process has typical issues:
The business asks for:
We’ll keep Excel as the front door for some inputs, but move the model and reporting to Power BI.
The first trap is pointing Power BI Desktop at the existing Excel report workbook and importing the formatted sheets. That usually brings in:
For a finance-grade model, you want raw, tabular data:
Separate operational Excel from reporting Excel
Use Power Query (Get Data) to ingest raw tables
Move recurring transformations into Power Query
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.
Finance teams often want near-real-time data, but risk and P&L models are typically complex and aggregation-heavy. Storage mode choice matters.
For most Chicago finance teams with hourly or a few-times-per-day risk/P&L updates, Import mode is usually the best default.
For trading and risk dashboards:
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.”
The central design decision is how to model trades, risk, and P&L together.
At minimum:
Relationships:
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.
Finance teams need to reconcile Power BI outputs with Excel and source systems.
Patterns that help:
This lets you:
With the model in place, you move logic from Excel formulas into DAX measures. The goal is transparent, auditable calculations.
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).
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.
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:
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.
With the data model and measures ready, you can design three core dashboards.
Key visuals:
Design considerations:
Key visuals:
Design considerations:
Key visuals:
Design considerations:
The team wants data updated multiple times per day, aligned with Chicago trading hours.
In Power BI Service:
Incremental refresh is valuable when:
Set up incremental refresh on large fact tables (FactTrades, FactRisk, FactPnL):
This keeps refresh times manageable while maintaining history.
If your upstream processes (e.g., risk system batch jobs) run on a known schedule, you can:
This reduces the window where the dashboard shows stale numbers.
Finance teams care about who sees what and how changes are tracked.
Common patterns:
Example: RLS with a bridge table mapping users to desks.
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.
Patterns that help:
This matters when numbers are challenged by risk, trading, or external audit.
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.
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 BI
SQL
Power Apps
Power Automate
Microsoft Fabrics
Azure Data Engineering