UNPKG

@neural-trader/syndicate

Version:

Investment syndicate management with Kelly Criterion allocation, voting, and performance tracking

699 lines (645 loc) 17.9 kB
/** * @neural-trader/syndicate * * Investment syndicate management with Kelly Criterion, profit distribution, and governance * * High-performance Rust NAPI bindings for collaborative betting and investment syndicates */ /** Allocation strategy for distributing syndicate capital */ export enum AllocationStrategy { /** Full Kelly Criterion - maximize log utility */ KellyCriterion = 'kelly_criterion', /** Fixed percentage of bankroll per bet */ FixedPercentage = 'fixed_percentage', /** Dynamic allocation based on confidence level */ DynamicConfidence = 'dynamic_confidence', /** Risk parity across uncorrelated opportunities */ RiskParity = 'risk_parity', /** Martingale - double bet after loss */ Martingale = 'martingale', /** Anti-Martingale - double bet after win */ AntiMartingale = 'anti_martingale' } /** Profit distribution models for syndicate members */ export enum DistributionModel { /** Distribute proportional to capital contribution */ Proportional = 'proportional', /** Weight by member performance score */ PerformanceWeighted = 'performance_weighted', /** Tiered distribution based on member tier */ Tiered = 'tiered', /** Hybrid: base proportional + performance bonus */ Hybrid = 'hybrid' } /** Member roles with different permissions */ export enum MemberRole { /** Full control over syndicate */ LeadInvestor = 'lead_investor', /** Can approve large bets and manage strategy */ SeniorAnalyst = 'senior_analyst', /** Can propose bets and analyze opportunities */ JuniorAnalyst = 'junior_analyst', /** Capital contributor with voting rights */ ContributingMember = 'contributing_member', /** View-only access to analytics */ Observer = 'observer' } /** Member tier affecting profit distribution */ export enum MemberTier { Bronze = 'bronze', Silver = 'silver', Gold = 'gold', Platinum = 'platinum' } /** Vote types for syndicate governance */ export enum VoteType { /** Change allocation strategy */ StrategyChange = 'strategy_change', /** Approve large bet (>threshold) */ LargeBet = 'large_bet', /** Add new member */ MemberAddition = 'member_addition', /** Remove existing member */ MemberRemoval = 'member_removal', /** Emergency withdrawal */ EmergencyWithdrawal = 'emergency_withdrawal', /** Modify bankroll rules */ RuleChange = 'rule_change', /** Distribute profits */ ProfitDistribution = 'profit_distribution' } /** Vote status */ export enum VoteStatus { Active = 'active', Passed = 'passed', Failed = 'failed', Expired = 'expired' } /** Withdrawal request status */ export enum WithdrawalStatus { Pending = 'pending', Approved = 'approved', Rejected = 'rejected', Completed = 'completed' } /** Bankroll management rules */ export interface BankrollRules { /** Maximum bet size as percentage of bankroll (0.0-1.0) */ maxSingleBet: number; /** Maximum daily exposure as percentage (0.0-1.0) */ maxDailyExposure: number; /** Maximum exposure to single sport as percentage (0.0-1.0) */ maxSportConcentration: number; /** Minimum reserve to maintain (absolute value) */ minimumReserve: number; /** Daily stop-loss threshold as percentage (0.0-1.0) */ stopLossDaily: number; /** Weekly stop-loss threshold as percentage (0.0-1.0) */ stopLossWeekly: number; /** Lock profits at threshold percentage (0.0-1.0) */ profitLock: number; /** Maximum parlay allocation as percentage (0.0-1.0) */ maxParlayPercentage: number; /** Maximum live betting allocation as percentage (0.0-1.0) */ maxLiveBetting: number; } /** Member permissions matrix */ export interface MemberPermissions { createSyndicate: boolean; modifyStrategy: boolean; approveLargeBets: boolean; manageMembers: boolean; distributeProfits: boolean; accessAllAnalytics: boolean; vetoPower: boolean; proposeBets: boolean; viewOtherMembers: boolean; modifyBankrollRules: boolean; initiateVote: boolean; castVote: boolean; emergencyWithdraw: boolean; exportData: boolean; modifyOwnProfile: boolean; viewFinancials: boolean; accessHistoricalData: boolean; manageIntegrations: boolean; } /** Member statistics */ export interface MemberStatistics { totalBetsProposed: number; betsAccepted: number; winRate: number; averageOdds: number; totalProfitGenerated: number; totalLoss: number; sharpeRatio: number; roi: number; longestWinStreak: number; longestLoseStreak: number; averageBetSize: number; totalVotesCast: number; votesWithMajority: number; contributionScore: number; activityScore: number; } /** Syndicate member */ export interface Member { id: string; name: string; email: string; role: MemberRole; tier: MemberTier; permissions: MemberPermissions; capitalContribution: string; currentBalance: string; performanceScore: number; joinedAt: Date; lastActive: Date; statistics: MemberStatistics; isActive: boolean; } /** Betting opportunity details */ export interface BettingOpportunity { id: string; sport: string; event: string; betType: string; odds: number; probability: number; edge: number; confidence: number; stake?: number; proposedBy?: string; analysisNotes?: string; expiresAt?: Date; correlatedBets?: string[]; } /** Allocation result from fund distribution */ export interface AllocationResult { opportunity: BettingOpportunity; allocatedAmount: string; strategy: AllocationStrategy; kellyPercentage: number; adjustedPercentage: number; expectedValue: number; riskScore: number; approved: boolean; approvalRequired: boolean; votingRequired: boolean; reasoning: string; warnings: string[]; } /** Vote record */ export interface Vote { id: string; voteType: VoteType; proposer: string; proposal: string; details: Record<string, any>; votesFor: Map<string, boolean>; votesAgainst: Map<string, boolean>; abstentions: string[]; status: VoteStatus; requiredMajority: number; createdAt: Date; expiresAt: Date; resolvedAt?: Date; result?: string; } /** Withdrawal request */ export interface WithdrawalRequest { id: string; memberId: string; amount: string; reason: string; status: WithdrawalStatus; requestedAt: Date; processedAt?: Date; approvedBy?: string[]; rejectionReason?: string; isEmergency: boolean; penaltyApplied: number; } /** Risk metrics for portfolio */ export interface RiskMetrics { totalExposure: string; dailyExposure: string; weeklyExposure: string; sportConcentration: Map<string, number>; largestSingleBet: string; averageBetSize: string; kellyDeviation: number; portfolioVolatility: number; sharpeRatio: number; sortinoRatio: number; maxDrawdown: number; valueAtRisk95: number; valueAtRisk99: number; expectedShortfall: number; correlationRisk: number; liquidityRisk: number; } /** Performance report */ export interface PerformanceReport { syndicateId: string; period: { start: Date; end: Date; }; bankroll: { starting: string; ending: string; peak: string; trough: string; }; performance: { totalReturn: number; annualizedReturn: number; volatility: number; sharpeRatio: number; sortinoRatio: number; maxDrawdown: number; winRate: number; averageWin: number; averageLoss: number; profitFactor: number; expectancy: number; }; betting: { totalBets: number; totalStake: string; totalProfitLoss: string; bySport: Map<string, { bets: number; stake: string; profitLoss: string; winRate: number; }>; byStrategy: Map<AllocationStrategy, { bets: number; stake: string; profitLoss: string; roi: number; }>; }; members: { totalMembers: number; activeMembers: number; contributionsByMember: Map<string, { betsProposed: number; betsAccepted: number; profitGenerated: string; performanceScore: number; }>; topPerformers: Array<{ memberId: string; metric: string; value: number; }>; }; riskMetrics: RiskMetrics; } /** Syndicate state export */ export interface SyndicateState { syndicate: { id: string; totalBankroll: string; availableBankroll: string; rules: BankrollRules; createdAt: Date; version: string; }; members: Member[]; activeVotes: Vote[]; pendingWithdrawals: WithdrawalRequest[]; allocationHistory: AllocationResult[]; performanceMetrics: PerformanceReport; } /** * Main syndicate manager class */ export class SyndicateManager { /** * Create a new syndicate manager instance * @param syndicateId Unique syndicate identifier * @param totalBankroll Initial bankroll amount */ constructor(syndicateId: string, totalBankroll: string); /** * Allocate funds to betting opportunity using specified strategy * @param opportunity Betting opportunity details * @param strategy Allocation strategy to use * @returns Allocation result with approved amount and reasoning */ allocateFunds( opportunity: BettingOpportunity, strategy: AllocationStrategy ): Promise<AllocationResult>; /** * Distribute profits among syndicate members * @param profit Total profit amount to distribute * @param model Distribution model to use * @returns Map of member ID to distributed amount */ distributeProfits( profit: string, model: DistributionModel ): Promise<Map<string, string>>; /** * Add new member to syndicate * @param name Member name * @param email Member email * @param role Member role * @param capitalContribution Initial capital contribution * @returns New member ID */ addMember( name: string, email: string, role: MemberRole, capitalContribution: string ): Promise<string>; /** * Remove member from syndicate * @param memberId Member ID to remove * @param requireVote Whether to require governance vote * @returns Success status */ removeMember(memberId: string, requireVote: boolean): Promise<boolean>; /** * Update member role and permissions * @param memberId Member ID * @param newRole New role to assign * @returns Updated member */ updateMemberRole(memberId: string, newRole: MemberRole): Promise<Member>; /** * Update member tier * @param memberId Member ID * @param newTier New tier to assign * @returns Updated member */ updateMemberTier(memberId: string, newTier: MemberTier): Promise<Member>; /** * Request withdrawal of capital * @param memberId Member ID requesting withdrawal * @param amount Amount to withdraw * @param isEmergency Emergency withdrawal flag * @param reason Withdrawal reason * @returns Withdrawal request */ requestWithdrawal( memberId: string, amount: string, isEmergency?: boolean, reason?: string ): Promise<WithdrawalRequest>; /** * Process pending withdrawal request * @param requestId Withdrawal request ID * @param approve Approval decision * @param approverId Member ID approving/rejecting * @returns Updated withdrawal request */ processWithdrawal( requestId: string, approve: boolean, approverId: string ): Promise<WithdrawalRequest>; /** * Create governance vote * @param voteType Type of vote * @param proposer Member ID proposing * @param proposal Proposal description * @param details Additional vote details * @param durationHours Vote duration in hours * @returns Created vote */ createVote( voteType: VoteType, proposer: string, proposal: string, details: Record<string, any>, durationHours?: number ): Promise<Vote>; /** * Cast vote on proposal * @param voteId Vote ID * @param memberId Member ID casting vote * @param inFavor Vote in favor (true) or against (false) * @returns Updated vote */ castVote(voteId: string, memberId: string, inFavor: boolean): Promise<Vote>; /** * Get member by ID * @param memberId Member ID * @returns Member details */ getMember(memberId: string): Promise<Member>; /** * Get all syndicate members * @param activeOnly Return only active members * @returns List of members */ getMembers(activeOnly?: boolean): Promise<Member[]>; /** * Get current bankroll status * @returns Bankroll details */ getBankrollStatus(): Promise<{ total: string; available: string; allocated: string; reserve: string; }>; /** * Calculate current risk metrics * @returns Risk metrics */ getRiskMetrics(): Promise<RiskMetrics>; /** * Get member performance statistics * @param memberId Member ID * @returns Member statistics */ getMemberPerformance(memberId: string): Promise<MemberStatistics>; /** * Generate comprehensive performance report * @param startDate Report start date * @param endDate Report end date * @returns Performance report */ generatePerformanceReport( startDate?: Date, endDate?: Date ): Promise<PerformanceReport>; /** * Update bankroll rules * @param newRules New bankroll rules * @param requireVote Whether to require governance vote * @returns Updated rules */ updateBankrollRules( newRules: Partial<BankrollRules>, requireVote?: boolean ): Promise<BankrollRules>; /** * Get active votes * @returns List of active votes */ getActiveVotes(): Promise<Vote[]>; /** * Get pending withdrawal requests * @param memberId Optional member ID filter * @returns List of pending withdrawals */ getPendingWithdrawals(memberId?: string): Promise<WithdrawalRequest[]>; /** * Export complete syndicate state * @returns Syndicate state export */ exportState(): Promise<SyndicateState>; /** * Import syndicate state * @param state Syndicate state to import * @returns Success status */ importState(state: SyndicateState): Promise<boolean>; } /** * Create a new syndicate manager instance * @param id Unique syndicate identifier * @param totalBankroll Initial bankroll amount * @param rules Optional bankroll rules (uses defaults if not provided) * @returns New syndicate manager */ export function createSyndicate( id: string, totalBankroll: string, rules?: Partial<BankrollRules> ): Promise<SyndicateManager>; /** * Calculate Kelly Criterion percentage * @param probability Win probability (0.0-1.0) * @param odds Decimal odds * @param edgePercentage Optional edge adjustment * @returns Kelly percentage (0.0-1.0) */ export function calculateKelly( probability: number, odds: number, edgePercentage?: number ): number; /** * Calculate fractional Kelly (reduced risk) * @param probability Win probability * @param odds Decimal odds * @param fraction Kelly fraction (e.g., 0.25 for quarter Kelly) * @returns Fractional Kelly percentage */ export function calculateKellyFractional( probability: number, odds: number, fraction: number ): number; /** * Calculate optimal bet size with constraints * @param bankroll Current bankroll * @param opportunity Betting opportunity * @param strategy Allocation strategy * @param rules Bankroll rules * @returns Optimal bet size */ export function calculateOptimalBetSize( bankroll: string, opportunity: BettingOpportunity, strategy: AllocationStrategy, rules: BankrollRules ): string; /** * Validate bankroll rules for consistency * @param rules Bankroll rules to validate * @returns Validation result with errors if any */ export function validateBankrollRules(rules: BankrollRules): { valid: boolean; errors: string[]; }; /** * Calculate portfolio risk metrics * @param bankroll Current bankroll * @param allocations Active allocations * @param historicalReturns Historical return data * @returns Risk metrics */ export function calculateRiskMetrics( bankroll: string, allocations: AllocationResult[], historicalReturns: number[] ): Promise<RiskMetrics>; /** * Simulate different allocation strategies * @param opportunities List of opportunities * @param bankroll Starting bankroll * @param strategies Strategies to simulate * @param iterations Number of simulation runs * @returns Simulation results by strategy */ export function simulateAllocationStrategies( opportunities: BettingOpportunity[], bankroll: string, strategies: AllocationStrategy[], iterations: number ): Promise<Map<AllocationStrategy, { finalBankroll: string; totalReturn: number; sharpeRatio: number; maxDrawdown: number; winRate: number; }>>; /** * Calculate tax liability for member earnings * @param memberId Member ID * @param earnings Total earnings amount * @param jurisdiction Tax jurisdiction * @returns Estimated tax liability */ export function calculateMemberTaxLiability( memberId: string, earnings: string, jurisdiction: string ): Promise<{ grossEarnings: string; taxableAmount: string; estimatedTax: string; netEarnings: string; breakdown: Record<string, string>; }>; /** * Generate performance report for syndicate * @param syndicateId Syndicate ID * @param startDate Report start date * @param endDate Report end date * @returns Performance report */ export function generatePerformanceReport( syndicateId: string, startDate?: Date, endDate?: Date ): Promise<PerformanceReport>; /** * Export syndicate state to JSON * @param syndicateId Syndicate ID * @returns Serialized state */ export function exportSyndicateState(syndicateId: string): Promise<string>; /** * Import syndicate state from JSON * @param stateJson Serialized state * @returns Restored syndicate manager */ export function importSyndicateState(stateJson: string): Promise<SyndicateManager>; /** Package version */ export const version: string; /** Native binding filename */ export const nativeBinding: string;