Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Interest Rate Swap Optimization added #981

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
285 changes: 285 additions & 0 deletions Interest Rate Swap Optimization/Interest_Rate_Swap_Optimization.ipynb
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"
]
}
]
}
]
}
Loading
Loading