48 lines
1.2 KiB
TypeScript
48 lines
1.2 KiB
TypeScript
import { CREDIT_RATING_SCALE } from '../../config/ScoringConfig.js';
|
|
import { Asset } from './Asset.js';
|
|
|
|
interface BondData {
|
|
ticker?: string;
|
|
currentPrice?: number;
|
|
creditRating?: string;
|
|
yieldToMaturity?: string | number;
|
|
duration?: string | number;
|
|
[key: string]: unknown;
|
|
}
|
|
|
|
export interface BondMetrics {
|
|
ytm: number;
|
|
duration: number;
|
|
creditRating: string;
|
|
creditRatingNumeric: number;
|
|
}
|
|
|
|
export class Bond extends Asset {
|
|
metrics: BondMetrics;
|
|
|
|
constructor(data: BondData) {
|
|
super(data);
|
|
|
|
const creditRating = data.creditRating || 'BBB';
|
|
const creditRatingNumeric = CREDIT_RATING_SCALE[creditRating] ?? 7;
|
|
|
|
this.metrics = {
|
|
ytm: parseFloat(String(data.yieldToMaturity)) || 0,
|
|
duration: parseFloat(String(data.duration)) || 0,
|
|
creditRating,
|
|
creditRatingNumeric,
|
|
};
|
|
}
|
|
|
|
getDisplayMetrics(): Record<string, string> {
|
|
return {
|
|
Ticker: this.ticker,
|
|
Type: 'BOND',
|
|
Price: this.formatCurrency(this.currentPrice),
|
|
'YTM%': `${this.metrics.ytm.toFixed(2)}%`,
|
|
Duration: this.metrics.duration.toFixed(1),
|
|
Rating: `${this.metrics.creditRating} (${this.metrics.creditRatingNumeric})`,
|
|
};
|
|
}
|
|
}
|