-
Notifications
You must be signed in to change notification settings - Fork 337
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Interest Rate Swap Optimization added
- Loading branch information
Showing
3 changed files
with
1,771 additions
and
0 deletions.
There are no files selected for viewing
285 changes: 285 additions & 0 deletions
285
Interest Rate Swap Optimization/Interest_Rate_Swap_Optimization.ipynb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,285 @@ | ||
{ | ||
"nbformat": 4, | ||
"nbformat_minor": 0, | ||
"metadata": { | ||
"colab": { | ||
"provenance": [] | ||
}, | ||
"kernelspec": { | ||
"name": "python3", | ||
"display_name": "Python 3" | ||
}, | ||
"language_info": { | ||
"name": "python" | ||
} | ||
}, | ||
"cells": [ | ||
{ | ||
"cell_type": "markdown", | ||
"source": [ | ||
"Interest Rate Swap Optimization" | ||
], | ||
"metadata": { | ||
"id": "lzMpV_sSg11t" | ||
} | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"source": [ | ||
"Dataset loading" | ||
], | ||
"metadata": { | ||
"id": "KEcehVsEhkM8" | ||
} | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"source": [ | ||
"import pandas as pd\n", | ||
"import numpy as np\n", | ||
"\n", | ||
"# Load data\n", | ||
"data_ir_swap = pd.read_csv('interest_rate_swap_data.csv')\n", | ||
"print(data_ir_swap.head())\n", | ||
"\n", | ||
"# Convert to NumPy array (excluding the 'Date' column)\n", | ||
"data_ir_swap = data_ir_swap.drop(columns=['Date']).to_numpy()\n" | ||
], | ||
"metadata": { | ||
"colab": { | ||
"base_uri": "https://localhost:8080/" | ||
}, | ||
"id": "xZ-zMi5Cff_u", | ||
"outputId": "3d867598-0b62-44ca-91bf-04d9b7b9ab54" | ||
}, | ||
"execution_count": 3, | ||
"outputs": [ | ||
{ | ||
"output_type": "stream", | ||
"name": "stdout", | ||
"text": [ | ||
" Date Fixed_Rate Floating_Rate\n", | ||
"0 2020-01-01 2.498160 2.779315\n", | ||
"1 2020-01-02 4.802857 0.873076\n", | ||
"2 2020-01-03 3.927976 2.802459\n", | ||
"3 2020-01-04 3.394634 3.997948\n", | ||
"4 2020-01-05 1.624075 0.668742\n" | ||
] | ||
} | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"source": [ | ||
"perform fitness function" | ||
], | ||
"metadata": { | ||
"id": "5ndezum0hoyc" | ||
} | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"source": [], | ||
"metadata": { | ||
"id": "LmBcL_8EhnrD" | ||
} | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"source": [ | ||
"def fitness_function(individual, data):\n", | ||
" fixed_rates = data[:, 0]\n", | ||
" floating_rates = data[:, 1]\n", | ||
"\n", | ||
" portfolio_value = 100000 # Starting capital\n", | ||
"\n", | ||
" for i in range(len(data)):\n", | ||
" # Strategy: Receive fixed, pay floating\n", | ||
" fixed_income = fixed_rates[i] * individual[0] # Fixed rate income\n", | ||
" floating_payment = floating_rates[i] * individual[1] # Floating rate payment\n", | ||
"\n", | ||
" # Net income\n", | ||
" net_income = fixed_income - floating_payment\n", | ||
" portfolio_value *= (1 + net_income)\n", | ||
"\n", | ||
" return portfolio_value\n" | ||
], | ||
"metadata": { | ||
"id": "xOc-ArYyfh5R" | ||
}, | ||
"execution_count": 4, | ||
"outputs": [] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"source": [ | ||
"def initialize_population(pop_size):\n", | ||
" population = []\n", | ||
" for _ in range(pop_size):\n", | ||
" fixed_rate_allocation = np.random.uniform(0, 1) # Random allocation for fixed rate\n", | ||
" floating_rate_allocation = np.random.uniform(0, 1) # Random allocation for floating rate\n", | ||
" individual = [fixed_rate_allocation, floating_rate_allocation]\n", | ||
" population.append(individual)\n", | ||
" return population\n" | ||
], | ||
"metadata": { | ||
"id": "nWBHVN-2fjkA" | ||
}, | ||
"execution_count": 5, | ||
"outputs": [] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"source": [ | ||
"def selection(population, fitness_scores, num_parents):\n", | ||
" parents = [population[idx] for idx in np.argsort(fitness_scores)[-num_parents:]]\n", | ||
" return parents\n" | ||
], | ||
"metadata": { | ||
"id": "hKKCUCO9flFS" | ||
}, | ||
"execution_count": 6, | ||
"outputs": [] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"source": [ | ||
"def crossover(parents, offspring_size):\n", | ||
" offspring = []\n", | ||
" for _ in range(offspring_size):\n", | ||
" parent1 = parents[np.random.randint(len(parents))]\n", | ||
" parent2 = parents[np.random.randint(len(parents))]\n", | ||
" crossover_point = np.random.randint(1, len(parent1))\n", | ||
" child = parent1[:crossover_point] + parent2[crossover_point:]\n", | ||
" offspring.append(child)\n", | ||
" return offspring\n" | ||
], | ||
"metadata": { | ||
"id": "xyK-mDk-fmyZ" | ||
}, | ||
"execution_count": 7, | ||
"outputs": [] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"source": [ | ||
"def mutation(offspring, mutation_rate):\n", | ||
" for individual in offspring:\n", | ||
" if np.random.rand() < mutation_rate:\n", | ||
" mutation_point = np.random.randint(len(individual))\n", | ||
" individual[mutation_point] = np.random.uniform(0, 1) # Mutate with new random allocation\n", | ||
" return offspring\n" | ||
], | ||
"metadata": { | ||
"id": "vXkVecAZfoP5" | ||
}, | ||
"execution_count": 8, | ||
"outputs": [] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"source": [ | ||
"def genetic_algorithm(data, num_generations, pop_size, num_parents, mutation_rate):\n", | ||
" population = initialize_population(pop_size)\n", | ||
"\n", | ||
" for generation in range(num_generations):\n", | ||
" fitness_scores = [fitness_function(individual, data) for individual in population]\n", | ||
" parents = selection(population, fitness_scores, num_parents)\n", | ||
" offspring_size = pop_size - len(parents)\n", | ||
" offspring = crossover(parents, offspring_size)\n", | ||
" offspring = mutation(offspring, mutation_rate)\n", | ||
" population = parents + offspring\n", | ||
"\n", | ||
" best_fitness = np.max(fitness_scores)\n", | ||
" print(f\"Generation {generation}: Best Fitness = {best_fitness}\")\n", | ||
"\n", | ||
" best_individual = population[np.argmax(fitness_scores)]\n", | ||
" return best_individual\n", | ||
"\n", | ||
"# Run the genetic algorithm\n", | ||
"num_generations = 50\n", | ||
"pop_size = 100\n", | ||
"num_parents = 20\n", | ||
"mutation_rate = 0.01\n", | ||
"\n", | ||
"best_params = genetic_algorithm(data_ir_swap, num_generations, pop_size, num_parents, mutation_rate)\n", | ||
"print(f\"Best Strategy: Fixed Rate Allocation = {best_params[0]}, Floating Rate Allocation = {best_params[1]}\")\n" | ||
], | ||
"metadata": { | ||
"colab": { | ||
"base_uri": "https://localhost:8080/" | ||
}, | ||
"id": "4TXuhoYafq-K", | ||
"outputId": "ee84f105-ca64-44d4-c12a-f522317f5640" | ||
}, | ||
"execution_count": 9, | ||
"outputs": [ | ||
{ | ||
"output_type": "stream", | ||
"name": "stderr", | ||
"text": [ | ||
"<ipython-input-4-140d612c1ab4>:14: RuntimeWarning: overflow encountered in scalar multiply\n", | ||
" portfolio_value *= (1 + net_income)\n" | ||
] | ||
}, | ||
{ | ||
"output_type": "stream", | ||
"name": "stdout", | ||
"text": [ | ||
"Generation 0: Best Fitness = inf\n", | ||
"Generation 1: Best Fitness = inf\n", | ||
"Generation 2: Best Fitness = inf\n", | ||
"Generation 3: Best Fitness = inf\n", | ||
"Generation 4: Best Fitness = inf\n", | ||
"Generation 5: Best Fitness = inf\n", | ||
"Generation 6: Best Fitness = inf\n", | ||
"Generation 7: Best Fitness = inf\n", | ||
"Generation 8: Best Fitness = inf\n", | ||
"Generation 9: Best Fitness = inf\n", | ||
"Generation 10: Best Fitness = inf\n", | ||
"Generation 11: Best Fitness = inf\n", | ||
"Generation 12: Best Fitness = inf\n", | ||
"Generation 13: Best Fitness = inf\n", | ||
"Generation 14: Best Fitness = inf\n", | ||
"Generation 15: Best Fitness = inf\n", | ||
"Generation 16: Best Fitness = inf\n", | ||
"Generation 17: Best Fitness = inf\n", | ||
"Generation 18: Best Fitness = inf\n", | ||
"Generation 19: Best Fitness = inf\n", | ||
"Generation 20: Best Fitness = inf\n", | ||
"Generation 21: Best Fitness = inf\n", | ||
"Generation 22: Best Fitness = inf\n", | ||
"Generation 23: Best Fitness = inf\n", | ||
"Generation 24: Best Fitness = inf\n", | ||
"Generation 25: Best Fitness = inf\n", | ||
"Generation 26: Best Fitness = inf\n", | ||
"Generation 27: Best Fitness = inf\n", | ||
"Generation 28: Best Fitness = inf\n", | ||
"Generation 29: Best Fitness = inf\n", | ||
"Generation 30: Best Fitness = inf\n", | ||
"Generation 31: Best Fitness = inf\n", | ||
"Generation 32: Best Fitness = inf\n", | ||
"Generation 33: Best Fitness = inf\n", | ||
"Generation 34: Best Fitness = inf\n", | ||
"Generation 35: Best Fitness = inf\n", | ||
"Generation 36: Best Fitness = inf\n", | ||
"Generation 37: Best Fitness = inf\n", | ||
"Generation 38: Best Fitness = inf\n", | ||
"Generation 39: Best Fitness = inf\n", | ||
"Generation 40: Best Fitness = inf\n", | ||
"Generation 41: Best Fitness = inf\n", | ||
"Generation 42: Best Fitness = inf\n", | ||
"Generation 43: Best Fitness = inf\n", | ||
"Generation 44: Best Fitness = inf\n", | ||
"Generation 45: Best Fitness = inf\n", | ||
"Generation 46: Best Fitness = inf\n", | ||
"Generation 47: Best Fitness = inf\n", | ||
"Generation 48: Best Fitness = inf\n", | ||
"Generation 49: Best Fitness = inf\n", | ||
"Best Strategy: Fixed Rate Allocation = 0.6854438832219015, Floating Rate Allocation = 0.02519341395922936\n" | ||
] | ||
} | ||
] | ||
} | ||
] | ||
} |
Oops, something went wrong.