API REST para cálculo de valuación de bonos utilizando el método alemán de amortización.
- Python 3.8+
- MySQL Server
- Git
git clone <repository-url>
cd Fijanzas-APIpython -m venv venv
# Windows
venv\Scripts\activate
# Linux/Mac
source venv/bin/activatepip install -r requirements.txtAsegúrate de tener MySQL ejecutándose y actualiza la configuración en database.py con tus credenciales:
SQLALCHEMY_DATABASE_URL = "mysql+pymysql://usuario:contraseña@localhost/nombre_bd"uvicorn main:app --reloadLa API estará disponible en: http://localhost:8000
- Swagger UI:
http://localhost:8000/docs - ReDoc:
http://localhost:8000/redoc
POST /users
{
"username": "testuser",
"email": "test@example.com",
"password": "mypassword123"
}Respuesta:
{
"message": "User created successfully",
"username": "testuser"
}POST /login
{
"username": "testuser",
"password": "mypassword123"
}Respuesta:
{
"success": true,
"message": "Login successful",
"username": "testuser"
}POST /bonds
{
"user_id": 1,
"nominal_value": 1200,
"commercial_value": 1200,
"coupon_rate": 0.05809140331,
"market_rate": 0.05809140331,
"payment_frequency": 2,
"duration": 3,
"bonus": 0.009,
"flotation": 0,
"cavali": 0,
"structuration": 0,
"colocation": 0,
"total_grace_period": 1,
"partial_grace_period": 1
}Respuesta:
{
"id": 1,
"user_id": 1,
"nominal_value": 1200,
"commercial_value": 1200,
"coupon_rate": 0.0286357,
"market_rate": 0.002004008,
"payment_frequency": 3,
"duration": 6,
"bonus": 0.009,
"flotation": 0.0045,
"cavali": 0.005,
"structuration": 0.008,
"colocation": 0.009,
"total_grace_period": 1,
"partial_grace_period": 1
}GET /bonds/{bond_id}
Respuesta:
{
"id": 1,
"user_id": 1,
"nominal_value": 1200,
"commercial_value": 1200,
"coupon_rate": 0.0286357,
"market_rate": 0.002004008,
"payment_frequency": 3,
"duration": 6,
"bonus": 0.009,
"flotation": 0.0045,
"cavali": 0.005,
"structuration": 0.008,
"colocation": 0.009,
"total_grace_period": 1,
"partial_grace_period": 1
}GET /bonds/{bond_id}/flows
Respuesta:
[
{
"bond_id": 1,
"period": 1,
"initial_balance": 1200.00,
"amortization": 200.00,
"coupon": 34.36,
"bonus": 10.80,
"net_flow": 245.16,
"final_balance": 1000.00
},
{
"bond_id": 1,
"period": 2,
"initial_balance": 1000.00,
"amortization": 200.00,
"coupon": 28.64,
"bonus": 9.00,
"net_flow": 237.64,
"final_balance": 800.00
}
]GET /bonds/{bond_id}/results
Respuesta:
{
"bond_id": 1,
"TCEA": 0.1234,
"TREA": 0.1156,
"Precio_Maximo": 1180.50
}Fijanzas-API/
├── main.py # Aplicación FastAPI principal
├── models.py # Modelos de base de datos (SQLAlchemy)
├── database.py # Configuración de base de datos
├── germanAmortizationMethod.py # Lógica de cálculo de bonos
├── requirements.txt # Dependencias del proyecto
├── README.md # Documentación del proyecto
├── classes/ # Clases auxiliares
│ ├── bond.py # Clase Bond
│ ├── flow.py # Clase Flow
│ └── results.py # Clase Results
└── __pycache__/ # Cache de Python
python -m pytest test_api.py -vpython test_connection.py- Crear usuario:
curl -X POST "http://localhost:8000/users" \
-H "Content-Type: application/json" \
-d '{
"username": "testuser",
"email": "test@example.com",
"password": "password123"
}'- Hacer login:
curl -X POST "http://localhost:8000/login" \
-H "Content-Type: application/json" \
-d '{
"username": "testuser",
"password": "password123"
}'- Crear bono:
curl -X POST "http://localhost:8000/bonds" \
-H "Content-Type: application/json" \
-d '{
"user_id": 1,
"nominal_value": 1200,
"commercial_value": 1200,
"coupon_rate": 0.028635700,
"market_rate": 0.002004008,
"payment_frequency": 3,
"duration": 6,
"bonus": 0.009,
"flotation": 0.0045,
"cavali": 0.005,
"structuration": 0.008,
"colocation": 0.009,
"total_grace_period": 1,
"partial_grace_period": 1
}'# Instalar en modo desarrollo
pip install -e .
# Ejecutar con auto-reload
uvicorn main:app --reload --host 0.0.0.0 --port 8000
# Ver logs detallados
uvicorn main:app --reload --log-level debug# Reinicializar base de datos
python setup_database.py
# Verificar conexión
python test_connection.pyPuedes configurar las siguientes variables de entorno:
# .env file
DATABASE_URL=mysql+pymysql://user:password@localhost/dbname
SECRET_KEY=your-secret-key-here
ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=30- Método de Amortización: Se utiliza el método alemán para el cálculo de flujos de caja
- Precisión: Los valores monetarios se redondean a 2 decimales, los indicadores financieros a 4 decimales
- Base de Datos: MySQL con SQLAlchemy ORM
- Autenticación: Sistema básico con bcrypt para hashing de contraseñas
- Validación: Pydantic para validación de datos de entrada y salida
Para producción, considera:
- Usar un servidor ASGI como Gunicorn:
pip install gunicorn
gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker- Configurar variables de entorno para producción
- Usar una base de datos externa (no local)
- Implementar logging apropiado
- Configurar CORS si es necesario
- Verificar que MySQL esté ejecutándose
- Comprobar credenciales en
database.py - Asegurar que la base de datos existe
pip install --upgrade pip
pip install -r requirements.txt --force-reinstall# Usar otro puerto
uvicorn main:app --reload --port 8001Este proyecto es para fines educativos y de demostración.