Finance scenario
Capital markets workflow showing portfolio risk desk — limits, pivots, risk-pack export, and scheduled reports
Your Role
You are monitoring an equity book for a global asset manager.
import {AdaptableOptions} from '@adaptabletools/adaptable'; import {PortfolioPosition} from './rowData'; export const adaptableOptions: AdaptableOptions<PortfolioPosition> = { primaryKey: 'id', adaptableId: 'Showcase: Portfolio Risk Desk', exportOptions: { appendFileTimestamp: true, exportDateFormat: 'yyyy-MM-dd', exportDataFormat: 'formattedValue', }, initialState: { Dashboard: { Tabs: [ { Name: 'Desk', Toolbars: ['Layout', 'Export', 'GridFilter'], }, ], ModuleButtons: [ 'Layout', 'Export', 'CalculatedColumn', 'StyledColumn', 'SettingsPanel', ], }, StatusBar: { StatusBars: [ { Key: 'Center Panel', StatusBarPanels: ['Layout', 'Export'], }, ], }, Theme: {CurrentTheme: 'dark'}, NamedQuery: { NamedQueries: [ { Name: 'Stressed Positions', BooleanExpression: '[limit_util_pct] > 100 OR [pnl] < 0 OR [weightPct] > 8', }, ], }, Layout: { CurrentLayout: 'PM Overview', Layouts: [ { Name: 'PM Overview', AutoSizeColumns: true, TableColumns: [ 'symbol', 'securityName', 'sector', 'region', 'quantity', 'lastPrice', 'marketValue', 'pnl', 'pnlPct', 'weightPct', 'rating', ], }, { Name: 'Risk View', AutoSizeColumns: true, TableColumns: [ 'symbol', 'securityName', 'sector', 'marketValue', 'limitUsd', 'limit_util_pct', 'pnl', 'pnlPct', 'weightPct', 'rating', ], ColumnSizing: {limit_util_pct: {Width: 160}}, GridFilter: { Expression: 'QUERY("Stressed Positions")', }, }, { Name: 'Sector Exposure', PivotColumns: ['region'], PivotGroupedColumns: ['sector'], PivotAggregationColumns: [ {ColumnId: 'marketValue', AggFunc: 'sum'}, {ColumnId: 'pnl', AggFunc: 'sum'}, ], SuppressAggFuncInHeader: true, }, ], }, StyledColumn: { StyledColumns: [ { Name: 'Sector badge', ColumnId: 'sector', BadgeStyle: { Badges: [ { Predicate: {PredicateId: 'Is', Inputs: ['Technology']}, PillStyle: { BackColor: 'var(--ab-color-palette-7)', ForeColor: 'var(--ab-color-palette-8)', }, }, { Predicate: {PredicateId: 'Is', Inputs: ['Financials']}, PillStyle: { BackColor: 'var(--ab-color-palette-11)', ForeColor: 'var(--ab-color-palette-12)', }, }, { Predicate: {PredicateId: 'Is', Inputs: ['Healthcare']}, PillStyle: { BackColor: 'var(--ab-color-palette-5)', ForeColor: 'var(--ab-color-palette-6)', }, }, { Predicate: {PredicateId: 'Is', Inputs: ['Energy']}, PillStyle: { BackColor: 'var(--ab-color-palette-1)', ForeColor: 'var(--ab-color-palette-2)', }, }, { Predicate: {PredicateId: 'Is', Inputs: ['Consumer']}, PillStyle: { BackColor: 'var(--ab-color-palette-3)', ForeColor: 'var(--ab-color-palette-4)', }, }, { Predicate: {PredicateId: 'Is', Inputs: ['Industrials']}, PillStyle: { BackColor: 'var(--ab-color-palette-9)', ForeColor: 'var(--ab-color-palette-10)', }, }, ], }, }, { ColumnId: 'lastPrice', Name: 'Last vs 52-week range', RangeBarStyle: { Min: 'weekLow', Max: 'weekHigh', Reference: { Value: 'previousClose', Marker: { Shape: 'Line', Color: '#aaa', Size: 2, }, }, Marker: { Shape: 'Diamond', Color: '#22d3ee', Size: 8, }, Track: {Height: 4}, CellTextProperties: { CellTextLayout: { PercentValue: {Horizontal: 'Left', Vertical: 'Below'}, }, }, ToolTipText: ['CellValue', 'PercentageValue'], OutOfRange: {Mode: 'Overflow'}, }, }, { ColumnId: 'limit_util_pct', Name: 'Limit utilisation bullet', BulletChartStyle: { RangeValueType: 'Number', CellRanges: [ {Min: 0, Max: 80, Color: 'rgba(40, 167, 69, 0.35)'}, {Min: 80, Max: 100, Color: 'rgba(255, 193, 7, 0.35)'}, {Min: 100, Max: 160, Color: 'rgba(220, 53, 69, 0.35)'}, ], TargetProperties: { Target: 100, Marker: { Shape: 'Line', Color: '#e2e2e2', Size: 2, }, }, Bar: {Color: '#5b9bd5', Height: 8}, CellTextProperties: { CellTextLayout: { CellValue: {Horizontal: 'Left', Vertical: 'Below'}, }, }, }, }, ], }, CalculatedColumn: { CalculatedColumns: [ { FriendlyName: 'Limit Util %', ColumnId: 'limit_util_pct', Query: { ScalarExpression: '([marketValue] / [limitUsd]) * 100', }, CalculatedColumnSettings: { DataType: 'number', Filterable: true, }, }, ], }, FormatColumn: { FormatColumns: [ { Name: 'format-limit-breach', Scope: {ColumnIds: ['limit_util_pct', 'marketValue', 'limitUsd']}, Rule: { BooleanExpression: '[limit_util_pct] > 100', }, Style: { BackColor: 'var(--ab-color-palette-1)', ForeColor: 'var(--ab-color-palette-2)', FontWeight: 'Bold', }, }, { Name: 'format-negative-pnl', Scope: {ColumnIds: ['pnl', 'pnlPct']}, Rule: { BooleanExpression: '[pnl] < 0', }, Style: { ForeColor: '#ff6b6b', }, }, { Name: 'format-positive-pnl', Scope: {ColumnIds: ['pnl', 'pnlPct']}, Rule: { BooleanExpression: '[pnl] > 0', }, Style: { ForeColor: '#4ade80', }, }, { Name: 'format-concentration', Scope: {ColumnIds: ['weightPct']}, Rule: { BooleanExpression: '[weightPct] > 8', }, Style: { BackColor: 'var(--ab-color-palette-3)', ForeColor: 'var(--ab-color-palette-4)', }, }, { Name: 'format-notional-size', Scope: {ColumnIds: ['marketValue', 'limitUsd']}, DisplayFormat: 'Million', }, { Name: 'format-last-price', Scope: {ColumnIds: ['lastPrice']}, DisplayFormat: 'Dollar', }, { Name: 'format-pnl', Scope: {ColumnIds: ['pnl']}, DisplayFormat: 'Accounting', }, { Name: 'format-quantity', Scope: {ColumnIds: ['quantity']}, DisplayFormat: 'Integer', }, { Name: 'format-pnl-pct', Scope: {ColumnIds: ['pnlPct', 'limit_util_pct', 'weightPct']}, DisplayFormat: { Formatter: 'NumberFormatter', Options: { Suffix: '%', FractionDigits: 2, }, }, }, ], }, Export: { CurrentReport: 'Risk Pack', CurrentFormat: 'Excel', Reports: [ { Name: 'Risk Pack', ReportColumnScope: 'ScopeColumns', ReportRowScope: 'ExpressionRows', Scope: { ColumnIds: [ 'symbol', 'securityName', 'sector', 'region', 'marketValue', 'limitUsd', 'limit_util_pct', 'pnl', 'pnlPct', 'weightPct', 'rating', ], }, Query: { BooleanExpression: 'QUERY("Stressed Positions")', }, }, { Name: 'Full Portfolio', ReportColumnScope: 'AllColumns', ReportRowScope: 'AllRows', }, ], ReportSchedules: [ { Name: 'Weekday risk pack (EOD)', ReportName: 'Risk Pack', ReportFormat: 'Excel', ExportDestination: 'Download', Schedule: { IsOneOff: false, CronExpression: '0 17 * * 1-5', }, }, ], }, }, };