Ngày 6: Quantum Probability và Finance
Ngày 6: Quantum Probability và Finance
🎯 Mục tiêu học tập
- Hiểu sâu về quantum probability và cách nó khác biệt với classical probability
- Nắm vững cách quantum probability áp dụng cho financial modeling
- Implement quantum probability models cho credit risk assessment
- So sánh quantum và classical probability approaches
📚 Lý thuyết
Quantum Probability Fundamentals
1. Classical vs Quantum Probability
Classical Probability:
- Based on Kolmogorov axioms
- Additive: P(A ∪ B) = P(A) + P(B) - P(A ∩ B)
- Commutative: P(A ∩ B) = P(B ∩ A)
- Real-valued probabilities
Quantum Probability:
- Based on quantum mechanics principles
- Non-additive trong certain contexts
- Non-commutative observables
- Complex-valued amplitudes
2. Quantum Probability Axioms
Born Rule:
P(ψ → φ) = |⟨φ|ψ⟩|²
Quantum State:
|ψ⟩ = Σᵢ cᵢ|i⟩
Probability Amplitude:
cᵢ = ⟨i|ψ⟩
3. Quantum Interference
Superposition Principle:
|ψ⟩ = α|0⟩ + β|1⟩
P(0) = |α|², P(1) = |β|²
Interference Effects:
P(ψ → φ) = |Σᵢ cᵢ⟨φ|i⟩|² ≠ Σᵢ |cᵢ⟨φ|i⟩|²
Quantum Probability cho Finance
1. Financial Applications:
Credit Risk Assessment:
- Quantum superposition của default states
- Interference effects trong risk correlations
- Non-commutative risk measures
Portfolio Optimization:
- Quantum states cho asset allocations
- Entanglement cho correlation modeling
- Quantum uncertainty principles
Market Modeling:
- Quantum random walks
- Superposition của market scenarios
- Quantum measurement effects
2. Quantum Financial States:
Credit State Representation:
|credit⟩ = α|good⟩ + β|default⟩
Portfolio State:
|portfolio⟩ = Σᵢ wᵢ|asset_i⟩
Market State:
|market⟩ = Σₛ pₛ|scenario_s⟩
3. Quantum Risk Measures:
Quantum VaR:
QVaR = min{V : P(portfolio_loss > V) ≤ α}
Quantum CVaR:
QCVaR = E[loss | loss > QVaR]
Quantum Entropy:
S(ρ) = -Tr(ρ log ρ)
Quantum Probability Advantages
1. Non-linearity:
- Captures complex market dynamics
- Models non-linear correlations
- Handles regime changes
2. Interference Effects:
- Market sentiment interactions
- Cross-asset correlations
- Systemic risk modeling
3. Uncertainty Principles:
- Risk-return trade-offs
- Measurement effects
- Information limits
💻 Thực hành
Project 6: Quantum Probability Framework cho Finance
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from qiskit import QuantumCircuit, Aer, execute
from qiskit.quantum_info import Statevector, Operator
from qiskit.circuit.library import ZZFeatureMap
from qiskit.algorithms import VQE, QAOA
from qiskit.algorithms.optimizers import SPSA
import pennylane as qml
class QuantumProbabilityFramework:
"""Quantum probability framework for financial applications"""
def __init__(self, num_qubits=4):
self.num_qubits = num_qubits
self.backend = Aer.get_backend('statevector_simulator')
def create_quantum_state(self, probabilities):
"""
Create quantum state from classical probabilities
"""
# Normalize probabilities
probs = np.array(probabilities)
probs = probs / np.sum(probs)
# Create quantum circuit
circuit = QuantumCircuit(self.num_qubits)
# Encode probabilities into quantum state
for i, prob in enumerate(probs[:2**self.num_qubits]):
if prob > 0:
# Convert probability to amplitude
amplitude = np.sqrt(prob)
# Apply rotation to encode amplitude
circuit.rx(2 * np.arccos(amplitude), i % self.num_qubits)
return circuit
def measure_quantum_probability(self, circuit, shots=1000):
"""
Measure quantum probability distribution
"""
# Add measurement
circuit.measure_all()
# Execute circuit
backend = Aer.get_backend('qasm_simulator')
job = execute(circuit, backend, shots=shots)
result = job.result()
counts = result.get_counts()
# Convert counts to probabilities
total_shots = sum(counts.values())
probabilities = {}
for state, count in counts.items():
probabilities[state] = count / total_shots
return probabilities
def quantum_interference_demo(self):
"""
Demonstrate quantum interference effects
"""
# Create two quantum states
circuit1 = QuantumCircuit(2, 2)
circuit1.h(0) # Hadamard gate creates superposition
circuit1.cx(0, 1) # Entanglement
circuit2 = QuantumCircuit(2, 2)
circuit2.x(0) # Flip first qubit
circuit2.h(0) # Hadamard gate
circuit2.cx(0, 1) # Entanglement
# Measure both circuits
prob1 = self.measure_quantum_probability(circuit1)
prob2 = self.measure_quantum_probability(circuit2)
print("Quantum State 1 Probabilities:")
for state, prob in prob1.items():
print(f" |{state}⟩: {prob:.4f}")
print("\nQuantum State 2 Probabilities:")
for state, prob in prob2.items():
print(f" |{state}⟩: {prob:.4f}")
return prob1, prob2
class QuantumCreditProbability:
"""Quantum probability model for credit risk"""
def __init__(self):
self.backend = Aer.get_backend('qasm_simulator')
def create_credit_state(self, credit_score, risk_factors):
"""
Create quantum state for credit assessment
"""
num_qubits = len(risk_factors) + 1 # +1 for credit score
circuit = QuantumCircuit(num_qubits, num_qubits)
# Encode credit score
normalized_score = min(credit_score / 850, 1.0)
circuit.rx(normalized_score * np.pi, 0)
# Encode risk factors
for i, factor in enumerate(risk_factors):
normalized_factor = min(factor, 1.0)
circuit.rx(normalized_factor * np.pi, i + 1)
# Add entanglement between credit score and risk factors
for i in range(1, num_qubits):
circuit.cx(0, i)
return circuit
def calculate_default_probability(self, credit_score, risk_factors, shots=1000):
"""
Calculate quantum default probability
"""
circuit = self.create_credit_state(credit_score, risk_factors)
# Add measurement
circuit.measure_all()
# Execute circuit
job = execute(circuit, self.backend, shots=shots)
result = job.result()
counts = result.get_counts()
# Calculate default probability
default_prob = self._extract_default_probability(counts)
return default_prob
def _extract_default_probability(self, counts):
"""
Extract default probability from measurement counts
"""
total_shots = sum(counts.values())
default_count = 0
for state, count in counts.items():
# Consider states with more 1s as higher default risk
ones_count = state.count('1')
if ones_count > len(state) / 2:
default_count += count
return default_count / total_shots
class QuantumPortfolioProbability:
"""Quantum probability model for portfolio optimization"""
def __init__(self, num_assets=4):
self.num_assets = num_assets
self.backend = Aer.get_backend('qasm_simulator')
def create_portfolio_state(self, weights, returns, volatilities):
"""
Create quantum state for portfolio
"""
num_qubits = self.num_assets * 2 # 2 qubits per asset for return and volatility
circuit = QuantumCircuit(num_qubits, num_qubits)
# Encode portfolio parameters
for i in range(self.num_assets):
# Encode weight
weight_qubit = i * 2
normalized_weight = min(weights[i], 1.0)
circuit.rx(normalized_weight * np.pi, weight_qubit)
# Encode return
return_qubit = i * 2 + 1
normalized_return = (returns[i] - min(returns)) / (max(returns) - min(returns))
circuit.ry(normalized_return * np.pi, return_qubit)
# Add entanglement between weight and return
circuit.cx(weight_qubit, return_qubit)
# Add entanglement between assets
for i in range(self.num_assets - 1):
circuit.cx(i * 2, (i + 1) * 2)
return circuit
def calculate_portfolio_risk(self, weights, returns, volatilities, shots=1000):
"""
Calculate quantum portfolio risk
"""
circuit = self.create_portfolio_state(weights, returns, volatilities)
# Add measurement
circuit.measure_all()
# Execute circuit
job = execute(circuit, self.backend, shots=shots)
result = job.result()
counts = result.get_counts()
# Calculate portfolio risk
risk_measure = self._extract_portfolio_risk(counts, weights, returns, volatilities)
return risk_measure
def _extract_portfolio_risk(self, counts, weights, returns, volatilities):
"""
Extract portfolio risk from measurement counts
"""
total_shots = sum(counts.values())
risk_sum = 0
for state, count in counts.items():
# Calculate risk contribution from this state
state_risk = self._calculate_state_risk(state, weights, returns, volatilities)
risk_sum += state_risk * count
return risk_sum / total_shots
def _calculate_state_risk(self, state, weights, returns, volatilities):
"""
Calculate risk contribution from a quantum state
"""
# Parse state into asset contributions
risk_contributions = []
for i in range(self.num_assets):
weight_bit = int(state[i * 2])
return_bit = int(state[i * 2 + 1])
# Calculate contribution based on bits
weight_factor = weights[i] * (1 + 0.1 * weight_bit)
return_factor = returns[i] * (1 + 0.1 * return_bit)
vol_factor = volatilities[i]
contribution = weight_factor * return_factor * vol_factor
risk_contributions.append(contribution)
# Total portfolio risk
total_risk = np.sqrt(np.sum(np.array(risk_contributions) ** 2))
return total_risk
def quantum_probability_demo():
"""
Demo quantum probability concepts
"""
print("=== Quantum Probability Demo ===\n")
# Initialize framework
qpf = QuantumProbabilityFramework(num_qubits=2)
# Demo 1: Quantum interference
print("1. Quantum Interference Effects:")
prob1, prob2 = qpf.quantum_interference_demo()
# Demo 2: Credit probability
print("\n2. Quantum Credit Probability:")
qcp = QuantumCreditProbability()
credit_score = 750
risk_factors = [0.3, 0.7, 0.5, 0.2]
default_prob = qcp.calculate_default_probability(credit_score, risk_factors)
print(f"Credit Score: {credit_score}")
print(f"Risk Factors: {risk_factors}")
print(f"Quantum Default Probability: {default_prob:.4f}")
# Demo 3: Portfolio probability
print("\n3. Quantum Portfolio Probability:")
qpp = QuantumPortfolioProbability(num_assets=4)
weights = [0.25, 0.25, 0.25, 0.25]
returns = [0.08, 0.12, 0.06, 0.10]
volatilities = [0.15, 0.20, 0.12, 0.18]
portfolio_risk = qpp.calculate_portfolio_risk(weights, returns, volatilities)
print(f"Weights: {weights}")
print(f"Returns: {returns}")
print(f"Volatilities: {volatilities}")
print(f"Quantum Portfolio Risk: {portfolio_risk:.4f}")
return prob1, prob2, default_prob, portfolio_risk
# Exercise: Quantum Probability vs Classical Probability
def quantum_vs_classical_probability():
"""
Exercise: Compare quantum and classical probability approaches
"""
# Generate sample data
np.random.seed(42)
n_samples = 1000
# Simulate credit events
credit_scores = np.random.normal(700, 100, n_samples)
default_events = np.random.binomial(1, 0.05, n_samples) # 5% default rate
# Classical probability calculation
classical_probs = []
for score in credit_scores:
# Simple logistic model
prob = 1 / (1 + np.exp(-(score - 700) / 100))
classical_probs.append(prob)
# Quantum probability calculation
quantum_probs = []
qcp = QuantumCreditProbability()
for score in credit_scores[:100]: # Limit for computational efficiency
risk_factors = np.random.uniform(0, 1, 4)
q_prob = qcp.calculate_default_probability(score, risk_factors)
quantum_probs.append(q_prob)
# Compare results
classical_mean = np.mean(classical_probs)
quantum_mean = np.mean(quantum_probs)
print("=== Quantum vs Classical Probability Comparison ===")
print(f"Classical Mean Probability: {classical_mean:.4f}")
print(f"Quantum Mean Probability: {quantum_mean:.4f}")
print(f"Difference: {abs(classical_mean - quantum_mean):.4f}")
# Plot comparison
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.hist(classical_probs, bins=30, alpha=0.7, label='Classical')
plt.xlabel('Default Probability')
plt.ylabel('Frequency')
plt.title('Classical Probability Distribution')
plt.legend()
plt.subplot(1, 2, 2)
plt.hist(quantum_probs, bins=30, alpha=0.7, label='Quantum', color='orange')
plt.xlabel('Default Probability')
plt.ylabel('Frequency')
plt.title('Quantum Probability Distribution')
plt.legend()
plt.tight_layout()
plt.show()
return classical_probs, quantum_probs
# Run demos
if __name__ == "__main__":
print("Running Quantum Probability Demos...")
prob1, prob2, default_prob, portfolio_risk = quantum_probability_demo()
print("\nRunning Quantum vs Classical Comparison...")
classical_probs, quantum_probs = quantum_vs_classical_probability()
Exercise 1: Quantum Entropy và Information
def quantum_entropy_exercise():
"""
Exercise: Calculate quantum entropy for financial states
"""
from qiskit.quantum_info import entropy
# Create different quantum states
states = []
# Pure state
pure_state = Statevector([1, 0, 0, 0])
states.append(("Pure State", pure_state))
# Mixed state
mixed_state = Statevector([0.5, 0.5, 0, 0])
states.append(("Mixed State", mixed_state))
# Maximally mixed state
max_mixed = Statevector([0.5, 0.5, 0.5, 0.5])
states.append(("Maximally Mixed", max_mixed))
# Calculate entropy for each state
print("=== Quantum Entropy Analysis ===")
for name, state in states:
# Convert to density matrix
rho = state.to_operator()
ent = entropy(rho)
print(f"{name}: {ent:.4f}")
return states
def quantum_information_flow():
"""
Exercise: Analyze quantum information flow in financial systems
"""
# Create quantum circuit for information flow
circuit = QuantumCircuit(4, 4)
# Initial state encoding financial information
circuit.h(0) # Market sentiment
circuit.h(1) # Credit conditions
circuit.cx(0, 2) # Market affects credit
circuit.cx(1, 3) # Credit affects risk
# Add measurement
circuit.measure_all()
# Execute circuit
backend = Aer.get_backend('qasm_simulator')
job = execute(circuit, backend, shots=1000)
result = job.result()
counts = result.get_counts()
# Analyze information flow
print("=== Quantum Information Flow Analysis ===")
print("Measurement Results:")
for state, count in counts.items():
print(f" |{state}⟩: {count}")
# Calculate mutual information
mutual_info = calculate_mutual_information(counts)
print(f"\nMutual Information: {mutual_info:.4f}")
return circuit, counts
def calculate_mutual_information(counts):
"""
Calculate mutual information from measurement counts
"""
total_shots = sum(counts.values())
# Calculate marginal probabilities
p_market = {}
p_credit = {}
for state, count in counts.items():
market_bit = state[0]
credit_bit = state[1]
p_market[market_bit] = p_market.get(market_bit, 0) + count
p_credit[credit_bit] = p_credit.get(credit_bit, 0) + count
# Normalize
for bit in p_market:
p_market[bit] /= total_shots
for bit in p_credit:
p_credit[bit] /= total_shots
# Calculate mutual information
mi = 0
for state, count in counts.items():
p_joint = count / total_shots
p_m = p_market[state[0]]
p_c = p_credit[state[1]]
if p_joint > 0 and p_m > 0 and p_c > 0:
mi += p_joint * np.log2(p_joint / (p_m * p_c))
return mi
# Run exercises
if __name__ == "__main__":
print("Running Quantum Entropy Exercise...")
states = quantum_entropy_exercise()
print("\nRunning Quantum Information Flow Exercise...")
circuit, counts = quantum_information_flow()
📊 Kết quả và Phân tích
Quantum Probability Advantages:
1. Non-linearity:
- Interference Effects: Captures complex market interactions
- Superposition: Parallel processing of multiple scenarios
- Entanglement: Models correlated financial events
2. Information Processing:
- Quantum Entropy: Better measure of uncertainty
- Mutual Information: Captures non-linear correlations
- Quantum Channels: Models information flow in markets
3. Financial Applications:
- Credit Risk: Quantum superposition of default states
- Portfolio Risk: Entangled asset correlations
- Market Modeling: Quantum random walks
Comparison với Classical Probability:
Classical Limitations:
- Linear correlations
- Gaussian assumptions
- Additive probability measures
Quantum Advantages:
- Non-linear correlations
- Non-Gaussian distributions
- Interference effects
🎯 Bài tập về nhà
Exercise 1: Quantum Probability Calibration
Implement quantum probability calibration methods cho financial models.
Exercise 2: Quantum Entropy Optimization
Build quantum entropy optimization cho portfolio management.
Exercise 3: Quantum Information Theory cho Finance
Develop quantum information theory applications cho credit risk.
Exercise 4: Quantum Probability Validation
Create validation framework cho quantum probability models.
“Quantum probability provides a more nuanced view of financial uncertainty, capturing the complex, non-linear nature of market dynamics.” - Quantum Finance Research
Ngày tiếp theo: Quantum Random Walks cho Market Modeling