This case provides a dramatic illustration of how Case Data Management and the Forensic Data Engine can cut costs, increase profitability and produce superior results in a situation that would normally call for extensive awkward effort with manual or electronic spreadsheets...
Case Scenario
An unexpectedly high number of non-performing loans at a financial
institution prompted an investigation which revealed that many of the loans
had been advanced with improper security or, in some other way, had contravened
institutional or regulatory policy. The loans emanated from different loan
officers over a period of years and although there was a question of fraud,
the institution took the view that its auditors should have detected the
contravening loans, however caused. Litigation ensued and our task was
to quantify the damages i.e. calculate the principal and interest forgone
on the non-performing loans. To do this we needed to create a financial
model of the loan portfolio: define the requirements; develop alternative
solutions; perform a cost/benefit analysis; and implement the selected
solution.
Loan Portfolio Financial Model
The model would need to accommodate several key requirements:
The manual solution was quickly ruled out because of the amount of labour required for initial data entry and calculations, the potential for human error, the difficulty of verifying the calculations without duplication of effort, and the inability to recalculate quickly based on changing liability dates. There was also no way to integrate the document management system.
Electronic spreadsheets were also ruled out for three main reasons: the use of different interest rate tables for different loans would require a complex macro (program) and/or slow inter-spreadsheet linkages for the interest calculation; the solutions involved duplicating the transaction data among several linked spreadsheets; and changing the liability dates could involve duplicating the entire set of spreadsheets. Though awkward, integration with the document management system was possible.
A relatively simple and reasonably accurate way of estimating the forgone interest was developed for spreadsheets but was rejected because 1) it lacked the flexibility to be quickly redone if the liability dates were different than those assumed in the spreadsheets, 2) the interest rate calculation could be done accurately (without estimation) using a relational database with less effort than the spreadsheet estimation method, and 3) the use of an approximation would necessitate conservative assumptions that would reduce the claimed damages.
The relational database approach seemed to be the best: all of the calculations seemed to depend on relationships between liability dates, loan parameters, interest rate tables and transactions. These relationships could easily be modelled using a standard relational database and the calculations could be implemented with single queries (vs. a repetitive program) in the international ANSII standard Structured Query Language (SQL). In addition, integration with a relational database was a standard feature of the document management system.
The object-oriented database development environment offered many of the advantages of the relational database/SQL approach, but required much more programming for 1) the calculations, 2) integration with the document management system and 3) an interactive interface for editing the data and the model parameters.
Quantification of Damages
Accordingly, we used the Forensic
Data Engine relational database to implement the loan portfolio financial
model. (The Forensic
Data Engine is a full featured, multi-user ANSI standard SQL relational
database developed by ForenSys The Forensic Systems Group specifically
for forensic and investigative case data management applications.) The
design incorporated data structures to optimise the quantification calculations.
This empty database structure was then created. The data were imported
from the institution’s computer system and converted into this “normalised”
data structure. (For example, in the plaintiff’s computer, the interest
rate tables were stored as separate files with annual rates expressed as
a percentage and an effective date. In order to simplify the calculations
in the query, the annual interest rates needed to be converted to daily
interest factors, the factors needed to be associated with an “effective
until date” as well as an “effective date” and all of the rate tables needed
to be combined into one table).
Next, the report quantifying the damages was designed simply as the standard output of two SQL queries: one for the Principal and one for the Interest. The reports list each loan, its approval date and the amount of principal or interest, sorted by approval date, with a total of the amounts at the end. Prototypes of the two listings are provided in Appendices I and II. For the technically curious, the details of the database structure are provided in Appendix III, and the full text of the queries with an explanation is found in Appendix IV.
Lower Costs Using Case Data Management and the Forensic
Data Engine
The principles of Case Data Management and the Forensic
Data Engine cut costs at every stage of the case:
APPENDIX I: Principal Report
L.LoanID L.ApprovalDate
SUM(T.TransactionAmount)
--------------- ---------------- ------------------------
ABC Co. 1992/01/01
14,000.00
Smith,Joan 1992/01/05
7,250.00
Some Corp. 1992/01/15
107,135.73
Person,A. 1992/02/20
11,000.00
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
TOTALS 5,467,234.99
APPENDIX II: Interest Report
L.LoanID L.ApprovalDate
SUM(T.TransactionAmo....
--------------- ---------------- ------------------------
ABC Co. 1992/01/01
4,987.62
Smith,JA 1992/01/05
2,325.22
Some Corp. 1992/01/15
37,135.37
Person,A 1992/02/20
6,128.42
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
TOTALS 1,027,234.15
APPENDIX III: Database Details
The institution provided transaction histories of each loan account,
a loan information file and a series of interest rate tables. This information
was extracted, edited and converted into a relational database with the
following structure (only relevant data items are listed):
Loan table - LoanID, LoanType, RateType, ApprovalDate, GoodOrBad
Transaction table - LoanID,TransactionType,TransactionDate,
TransactionAmount
Rate table - RateType,InterestRate,RateStartDate,RateEndDate
LoanType table - LoanType, LiabilityDate
Each loan is associated with a particular loan type and interest rate table. The interest rate tables provide interest rates and their effective dates. The loan type is used to refer to the “liability date” for that type of loan. GoodOrBad in the Loan table is either 'Good' indicating it is not contravening and should not be considered in the calculations, or 'Bad' indicating it is contravening and should be included in the calculation of damages. TransactionType in the Transaction table is 'Advance', 'Payment' or 'InterestCharge'. InterestRate in the Rate table is a daily interest factor. vSettlementDate is a variable, the date of settlement and the final day of the interest calculation. Compound interest is calculated i.e. interest is charged on outstanding principal and accrued interest. The “liability” dates and settlement date can be changed during the trial or settlement negotiation as needs be.
The following two Structured Query Language (SQL) commands will produced
listings of the loans, sorted by approval date (ascending), with their
principal balance owing at the settlement date (first command)
and the amount of unpaid interest accrued up to the settlement date
(second command).
APPENDIX IV: SQL Query Details
Principal Query
SELECT L.LoanID, L.ApprovalDate, SUM(T.TransactionAmount)
= S FROM Transaction T, Loan L, LoanType LT GROUP BY
L.LoanID, L.ApprovalDate WHERE T.LoanID = L.LoanID AND
L.LoanType = LT.LoanType AND L.GoodOrBad = 'Bad' AND T.TransactionDate
> LT.LiabilityDate AND T.TransactionType IN ('Advance', 'Payment')
ORDER BY L.ApprovalDate
Interest Query
SELECT L.LoanID, L.ApprovalDate, SUM(T.TransactionAmount
* R.InterestRate * (LMIN(R.RateEndDate, .vSettlementDate) - LMAX(R.RateStartDate,
T.TransactionDate)+1)) = S FROM Transaction T, Loan
L, LoanType LT, Rate R GROUP BY L.LoanID, L.ApprovalDate WHERE
T.LoanID = L.LoanID AND L.LoanType = LT.LoanType AND L.GoodOrBad
= 'Bad' AND T.TransactionDate > LT.LiabilityDate AND R.RateType
= L.RateType AND T.TransactionDate <= R.RateEndDate AND
R.RateStartDate < .vSettlementDate ORDER BY L.ApprovalDate
Explanation of Principal SQL Query
SELECT L.LoanID, L.ApprovalDate, SUM(T.TransactionAmount)
Displays the loan ID, approval date and the sum of advances less payments
for a particular loan.
= S
Produces a sum of all the principal amounts at the bottom of the listing
- a grand total.
FROM Transaction T, Loan L, LoanType LT
Draws data from three of the four tables which are given short names
(T, L, LT) for easy reference.
GROUP BY L.LoanID, L.ApprovalDate
Groups all the transactions for each loan. The SUM above adds up all
of the advance and repayment transactions for each member of this GROUP.
WHERE T.LoanID = L.LoanID AND L.LoanType = LT.LoanType
The WHERE clause specifies how to relate the three tables and which
records to select for calculation. This part links the Transaction and
Loan tables by the LoanID and links the Loan and the LoanType tables by
the LoanType.
AND L.GoodOrBad = 'Bad'
This part of the WHERE clause restricts the calculation to the contravening
loans.
AND T.TransactionDate > LT.LiabilityDate AND T.TransactionType IN
('Advance','Payment')
This part of the WHERE clause further restricts the command to those
transactions subsequent to the “liability” date and to ‘Advance’
and ‘Payment’ transactions only (‘Interest Charges’ are not part of forgone
principal).
ORDER BY L.ApprovalDate
This sorts the loans by ascending approval date.
Explanation of Interest SQL Query
SELECT L.LoanID, L.ApprovalDate,SUM(T.TransactionAmount * R.InterestRate
* (LMIN(R.RateEndDate, .vSettlementDate) - LMAX(R.RateStartDate, T.TransactionDate)+1))
Displays the loan ID, approval date and the sum of interest credited
or debited on all transactions for a particular loan for all interest rates
from the later of the time of the transaction or the effective date of
the interest rate to the earlier of the settlement date or the last effective
date of the interest rate.
= S
Produces a sum of all the interest amounts at the bottom of the listing
- a grand total.
FROM Transaction T, Loan L, LoanType LT, Rate R
Draws the data from all four tables which are given short names (T,
L, LT, R) for easy reference.
GROUP BY L.LoanID, L.ApprovalDate
Groups all the transactions and interest rates for each loan. The SUM
above adds up the interest amount for each member of this GROUP.
WHERE T.LoanID = L.LoanID AND L.LoanType = LT.LoanType AND L.GoodOrBad
= 'Bad' AND T.TransactionDate > LT.LiabilityDate AND R.RateType = L.RateType
The WHERE clause specifies how to relate the four tables and which
records to select for calculation. This part of the WHERE clause links
the Transaction and Loan tables by the LoanID, links the Loan and the LoanType
tables by the LoanType, restricts the command to operate on only those
loans which were contravening and on transactions that occurred subsequent
to the “liability” date and links the Loan and the interest Rate tables
by the RateType.
AND T.TransactionDate <= R.RateEndDate AND R.RateStartDate<.vSettlementDate
Transactions for the selected loans are then linked with the effective
interest rate for all of the different interest rate periods between the
transaction date and the settlement date. ‘Interest Charges’ are included
in order to compound the interest.
ORDER BY L.ApprovalDate
This sorts the loans by ascending approval date.