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',
},
},
],
},
},
};Read-onlyLoading demo…