rustkernel_clearing/types.rs
1//! Clearing and settlement types.
2
3use std::collections::HashMap;
4
5// ============================================================================
6// Trade Types
7// ============================================================================
8
9/// A trade for clearing.
10#[derive(Debug, Clone)]
11pub struct Trade {
12 /// Trade ID.
13 pub id: u64,
14 /// Security/instrument ID.
15 pub security_id: String,
16 /// Buyer party ID.
17 pub buyer_id: String,
18 /// Seller party ID.
19 pub seller_id: String,
20 /// Trade quantity.
21 pub quantity: i64,
22 /// Trade price (in cents/smallest unit).
23 pub price: i64,
24 /// Trade date (Unix timestamp).
25 pub trade_date: u64,
26 /// Settlement date (Unix timestamp).
27 pub settlement_date: u64,
28 /// Trade status.
29 pub status: TradeStatus,
30 /// Trade type.
31 pub trade_type: TradeType,
32 /// Additional attributes.
33 pub attributes: HashMap<String, String>,
34}
35
36/// Trade status.
37#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
38pub enum TradeStatus {
39 /// Pending validation.
40 Pending,
41 /// Validated and ready for settlement.
42 Validated,
43 /// Matched for DVP.
44 Matched,
45 /// Netted into position.
46 Netted,
47 /// Settled successfully.
48 Settled,
49 /// Failed validation.
50 Failed,
51 /// Cancelled.
52 Cancelled,
53}
54
55/// Trade type.
56#[derive(Debug, Clone, Copy, PartialEq, Eq)]
57pub enum TradeType {
58 /// Regular trade.
59 Regular,
60 /// Repo/reverse repo.
61 Repo,
62 /// Securities lending.
63 SecLending,
64 /// Corporate action.
65 CorpAction,
66 /// Transfer.
67 Transfer,
68}
69
70impl Trade {
71 /// Create a new trade.
72 #[allow(clippy::too_many_arguments)]
73 pub fn new(
74 id: u64,
75 security_id: String,
76 buyer_id: String,
77 seller_id: String,
78 quantity: i64,
79 price: i64,
80 trade_date: u64,
81 settlement_date: u64,
82 ) -> Self {
83 Self {
84 id,
85 security_id,
86 buyer_id,
87 seller_id,
88 quantity,
89 price,
90 trade_date,
91 settlement_date,
92 status: TradeStatus::Pending,
93 trade_type: TradeType::Regular,
94 attributes: HashMap::new(),
95 }
96 }
97
98 /// Get total value (quantity * price).
99 pub fn value(&self) -> i64 {
100 self.quantity.saturating_mul(self.price)
101 }
102}
103
104// ============================================================================
105// Validation Types
106// ============================================================================
107
108/// Trade validation result.
109#[derive(Debug, Clone)]
110pub struct ValidationResult {
111 /// Trade ID.
112 pub trade_id: u64,
113 /// Is trade valid?
114 pub is_valid: bool,
115 /// Validation errors.
116 pub errors: Vec<ValidationError>,
117 /// Validation warnings.
118 pub warnings: Vec<String>,
119}
120
121/// Validation error.
122#[derive(Debug, Clone)]
123pub struct ValidationError {
124 /// Error code.
125 pub code: String,
126 /// Error message.
127 pub message: String,
128 /// Error severity.
129 pub severity: ErrorSeverity,
130}
131
132/// Error severity.
133#[derive(Debug, Clone, Copy, PartialEq, Eq)]
134pub enum ErrorSeverity {
135 /// Blocks settlement.
136 Critical,
137 /// May block settlement.
138 Warning,
139 /// Informational only.
140 Info,
141}
142
143/// Validation configuration.
144#[derive(Debug, Clone)]
145pub struct ValidationConfig {
146 /// Check counterparty eligibility.
147 pub check_counterparty: bool,
148 /// Check security eligibility.
149 pub check_security: bool,
150 /// Check position limits.
151 pub check_limits: bool,
152 /// Check settlement date validity.
153 pub check_settlement_date: bool,
154 /// Minimum settlement days from trade.
155 pub min_settlement_days: u32,
156 /// Maximum settlement days from trade.
157 pub max_settlement_days: u32,
158}
159
160impl Default for ValidationConfig {
161 fn default() -> Self {
162 Self {
163 check_counterparty: true,
164 check_security: true,
165 check_limits: true,
166 check_settlement_date: true,
167 min_settlement_days: 0,
168 max_settlement_days: 30,
169 }
170 }
171}
172
173// ============================================================================
174// DVP Types
175// ============================================================================
176
177/// DVP (Delivery vs Payment) instruction.
178#[derive(Debug, Clone)]
179pub struct DVPInstruction {
180 /// Instruction ID.
181 pub id: u64,
182 /// Trade ID.
183 pub trade_id: u64,
184 /// Security ID.
185 pub security_id: String,
186 /// Delivering party.
187 pub deliverer: String,
188 /// Receiving party.
189 pub receiver: String,
190 /// Quantity to deliver.
191 pub quantity: i64,
192 /// Payment amount.
193 pub payment_amount: i64,
194 /// Payment currency.
195 pub currency: String,
196 /// Settlement date.
197 pub settlement_date: u64,
198 /// Instruction status.
199 pub status: DVPStatus,
200}
201
202/// DVP status.
203#[derive(Debug, Clone, Copy, PartialEq, Eq)]
204pub enum DVPStatus {
205 /// Awaiting match.
206 Pending,
207 /// Matched with counterparty instruction.
208 Matched,
209 /// Securities delivered.
210 SecuritiesDelivered,
211 /// Payment made.
212 PaymentMade,
213 /// Fully settled.
214 Settled,
215 /// Failed.
216 Failed,
217}
218
219/// DVP matching result.
220#[derive(Debug, Clone)]
221pub struct DVPMatchResult {
222 /// Matched instruction pairs.
223 pub matched_pairs: Vec<(u64, u64)>,
224 /// Unmatched instructions.
225 pub unmatched: Vec<u64>,
226 /// Match rate.
227 pub match_rate: f64,
228 /// Matching details.
229 pub details: Vec<DVPMatchDetail>,
230}
231
232/// DVP match detail.
233#[derive(Debug, Clone)]
234pub struct DVPMatchDetail {
235 /// Delivery instruction ID.
236 pub delivery_id: u64,
237 /// Payment instruction ID.
238 pub payment_id: u64,
239 /// Match confidence.
240 pub confidence: f64,
241 /// Matching differences (if any).
242 pub differences: Vec<String>,
243}
244
245// ============================================================================
246// Netting Types
247// ============================================================================
248
249/// Netting position.
250#[derive(Debug, Clone)]
251pub struct NetPosition {
252 /// Party ID.
253 pub party_id: String,
254 /// Security ID.
255 pub security_id: String,
256 /// Net quantity (positive = receive, negative = deliver).
257 pub net_quantity: i64,
258 /// Net payment (positive = receive, negative = pay).
259 pub net_payment: i64,
260 /// Currency.
261 pub currency: String,
262 /// Contributing trades.
263 pub trade_ids: Vec<u64>,
264}
265
266/// Netting result.
267#[derive(Debug, Clone)]
268pub struct NettingResult {
269 /// Net positions per party/security.
270 pub positions: Vec<NetPosition>,
271 /// Gross trade count.
272 pub gross_trade_count: u64,
273 /// Net instruction count.
274 pub net_instruction_count: u64,
275 /// Netting efficiency (reduction ratio).
276 pub efficiency: f64,
277 /// Netting by party.
278 pub party_summary: HashMap<String, PartySummary>,
279}
280
281/// Party netting summary.
282#[derive(Debug, Clone, Default)]
283pub struct PartySummary {
284 /// Gross deliveries.
285 pub gross_deliveries: i64,
286 /// Gross receipts.
287 pub gross_receipts: i64,
288 /// Net position.
289 pub net_position: i64,
290 /// Gross payments.
291 pub gross_payments: i64,
292 /// Net payment.
293 pub net_payment: i64,
294 /// Trade count.
295 pub trade_count: u64,
296}
297
298/// Netting configuration.
299#[derive(Debug, Clone)]
300pub struct NettingConfig {
301 /// Net by security.
302 pub net_by_security: bool,
303 /// Net by settlement date.
304 pub net_by_settlement_date: bool,
305 /// Net by currency.
306 pub net_by_currency: bool,
307 /// Include failed trades.
308 pub include_failed: bool,
309}
310
311impl Default for NettingConfig {
312 fn default() -> Self {
313 Self {
314 net_by_security: true,
315 net_by_settlement_date: true,
316 net_by_currency: true,
317 include_failed: false,
318 }
319 }
320}
321
322// ============================================================================
323// Settlement Types
324// ============================================================================
325
326/// Settlement instruction.
327#[derive(Debug, Clone)]
328pub struct SettlementInstruction {
329 /// Instruction ID.
330 pub id: u64,
331 /// Party ID.
332 pub party_id: String,
333 /// Security ID.
334 pub security_id: String,
335 /// Instruction type.
336 pub instruction_type: InstructionType,
337 /// Quantity.
338 pub quantity: i64,
339 /// Payment amount.
340 pub payment_amount: i64,
341 /// Currency.
342 pub currency: String,
343 /// Settlement date.
344 pub settlement_date: u64,
345 /// Status.
346 pub status: SettlementStatus,
347 /// Source trade IDs.
348 pub source_trades: Vec<u64>,
349}
350
351/// Instruction type.
352#[derive(Debug, Clone, Copy, PartialEq, Eq)]
353pub enum InstructionType {
354 /// Deliver securities.
355 Deliver,
356 /// Receive securities.
357 Receive,
358 /// Make payment.
359 Pay,
360 /// Receive payment.
361 Collect,
362}
363
364/// Settlement status.
365#[derive(Debug, Clone, Copy, PartialEq, Eq)]
366pub enum SettlementStatus {
367 /// Pending execution.
368 Pending,
369 /// In progress.
370 InProgress,
371 /// Partially settled.
372 Partial,
373 /// Fully settled.
374 Settled,
375 /// Failed.
376 Failed,
377 /// On hold.
378 OnHold,
379}
380
381/// Settlement execution result.
382#[derive(Debug, Clone)]
383pub struct SettlementExecutionResult {
384 /// Successfully settled instructions.
385 pub settled: Vec<u64>,
386 /// Failed instructions.
387 pub failed: Vec<(u64, String)>,
388 /// Pending instructions.
389 pub pending: Vec<u64>,
390 /// Settlement rate.
391 pub settlement_rate: f64,
392 /// Total value settled.
393 pub value_settled: i64,
394 /// Total value failed.
395 pub value_failed: i64,
396}
397
398// ============================================================================
399// Efficiency Metrics
400// ============================================================================
401
402/// Zero balance frequency metrics.
403#[derive(Debug, Clone)]
404pub struct ZeroBalanceMetrics {
405 /// Party ID.
406 pub party_id: String,
407 /// Total settlement days analyzed.
408 pub total_days: u32,
409 /// Days with zero end-of-day balance.
410 pub zero_balance_days: u32,
411 /// Zero balance frequency (0-1).
412 pub frequency: f64,
413 /// Average end-of-day position.
414 pub avg_eod_position: f64,
415 /// Peak position.
416 pub peak_position: i64,
417 /// Intraday turnover.
418 pub avg_intraday_turnover: f64,
419}
420
421/// Settlement efficiency result.
422#[derive(Debug, Clone)]
423pub struct SettlementEfficiency {
424 /// Period analyzed (days).
425 pub period_days: u32,
426 /// Total instructions.
427 pub total_instructions: u64,
428 /// Settled on time.
429 pub on_time_settlements: u64,
430 /// Late settlements.
431 pub late_settlements: u64,
432 /// Failed settlements.
433 pub failed_settlements: u64,
434 /// On-time rate.
435 pub on_time_rate: f64,
436 /// Average settlement delay (seconds).
437 pub avg_delay_seconds: f64,
438 /// Zero balance metrics per party.
439 pub party_metrics: Vec<ZeroBalanceMetrics>,
440}