金融量化交易:使用Python实现遗传算法

news2024/11/27 16:40:55

大家好,遗传算法是一种受自然选择过程启发的进化算法,用于寻找优化和搜索问题的近似解决方案。本文将使用Python来实现一个用于优化简单交易策略的遗传算法。

1.遗传算法简介

遗传算法是一类基于自然选择和遗传学原理的优化算法,其特别适用于解决传统方法可能不切实际的复杂优化问题。遗传算法的基本思想是模拟自然选择的过程,通过选择、交叉和变异的过程,逐代改进解决方案的质量,从而进化出一组潜在的优化问题解决方案。

在交易系统优化的背景下,遗传算法可以用于搜索最佳交易参数的组合(例如移动平均长度、止损水平等),以最大化某个目标函数(例如利润、风险调整后的回报等)。

2.Python中实现遗传算法

本文将实现一个遗传算法,用于优化简单的移动平均线交叉交易策略。遗传算法的目标是找到最佳组合的快速和慢速移动平均线长度,以最大化交易策略的累积收益。

2.1 设置环境

首先,通过导入必要的库并下载用于分析的历史证券价格数据来设置Python环境,以便进行分析。本文使用yfinance库来下载所选资产的历史证券价格数据:

import yfinance as yf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 下载JPM (JPMorgan Chase & Co.)的历史证券价格数据
ticker = 'JPM'
data = yf.download(ticker, start='2020-01-01', end='2023-11-30')

# 显示数据的前几行
print(data.head())
[*********************100%***********************]  1 of 1 completed
                  Open        High         Low       Close   Adj Close  \
Date                                                                     
2020-01-02  139.789993  141.100006  139.259995  141.089996  125.020393   
2020-01-03  137.500000  139.229996  137.080002  138.339996  123.370583   
2020-01-06  136.559998  138.270004  136.500000  138.229996  123.272469   
2020-01-07  137.279999  137.860001  135.820007  135.880005  121.176781   
2020-01-08  135.699997  137.580002  135.600006  136.940002  122.122070   

              Volume  
Date                  
2020-01-02  10803700  
2020-01-03  10386800  
2020-01-06  10259000  
2020-01-07  10531300  
2020-01-08   9695300

2.2 数据预处理

通过计算快速和慢速移动平均线来预处理下载的证券价格数据,然后将根据移动平均线交叉来定义交易策略。

# 计算快速和慢速移动平均线
data['Fast_MA'] = data['Close'].rolling(window=50).mean()
data['Slow_MA'] = data['Close'].rolling(window=200).mean()

# 根据移动平均线交叉定义交易信号
data['Signal'] = np.where(data['Fast_MA'] > data['Slow_MA'], 1, -1)

# 计算交易策略的每日收益
data['Return'] = data['Signal'] * data['Close'].pct_change()

# 删除数据集中的缺失值
data.dropna(inplace=True)

# 显示更新后的数据
print(data.head())
Open        High         Low       Close  Adj Close  \
Date                                                                    
2020-10-15   99.099998  101.779999   99.040001  101.720001  93.407715   
2020-10-16  101.410004  102.330002  100.720001  101.510002  93.214859   
2020-10-19  101.599998  101.870003   99.559998   99.800003  91.644615   
2020-10-20  100.309998  101.769997  100.120003  100.370003  92.168022   
2020-10-21  100.360001  100.989998   99.330002   99.370003  91.249748   

              Volume  Fast_MA    Slow_MA  Signal    Return  
Date                                                        
2020-10-15  17171200  99.3548  104.47320      -1 -0.014967  
2020-10-16  13275000  99.4402  104.27530      -1  0.002064  
2020-10-19  11725700  99.4486  104.08260      -1  0.016846  
2020-10-20  11257100  99.4432  103.89330      -1 -0.005711  
2020-10-21  10730500  99.3542  103.71075      -1  0.009963

2.3 可视化交易策略

本文将交易信号和交易策略的累计收益可视化,以便更好地理解数据和交易系统。

# 绘制股票价格和快速/慢速移动平均线图
plt.figure(figsize=(12, 6))
plt.plot(data['Close'], label='Close Price')
plt.plot(data['Fast_MA'], label='Fast MA (50 days)')
plt.plot(data['Slow_MA'], label='Slow MA (200 days)')
plt.title('Moving Average Crossover Trading Strategy')
plt.legend()

plt.show()

# 绘制交易信号图
plt.figure(figsize=(12, 6))
plt.plot(data['Signal'], label='Trading Signal', marker='o', linestyle='')
plt.title('Trading Signals')
plt.legend()

plt.show()

# 绘制交易策略的累计收益图
data['Cumulative_Return'] = (1 + data['Return']).cumprod()
plt.figure(figsize=(12, 6))
plt.plot(data['Cumulative_Return'], label='Cumulative Return')
plt.title('Cumulative Returns of the Trading Strategy')
plt.legend()

plt.show()

图片

移动平均线交叉交易策略

图片

交易信号

2.4 定义遗传算法

在Python中定义遗传算法类,本文将创建一个遗传算法类(GeneticAlgorithm),其中封装了遗传算法的功能,包括种群的初始化、选择、交叉、变异和适应度评估。

class GeneticAlgorithm:
    def __init__(self, population_size, chromosome_length, mutation_rate, crossover_rate, generations):
        self.population_size = population_size
        self.chromosome_length = chromosome_length
        self.mutation_rate = mutation_rate
        self.crossover_rate = crossover_rate
        self.generations = generations
        self.population = self.initialize_population()

    def initialize_population(self):
        # 使用随机二进制染色体初始化种群
        population = np.random.randint(2, size=(self.population_size, self.chromosome_length))
        return population

    def fitness_evaluation(self, chromosome):
        # 将二进制染色体解码为交易参数
        fast_ma_length = int(''.join(map(str, chromosome[:5])), 2) + 5
        slow_ma_length = int(''.join(map(str, chromosome[5:])), 2) + 5

        # 计算快速移动平均线和慢速移动平均线
        data['Fast_MA'] = data['Close'].rolling(window=fast_ma_length).mean()
        data['Slow_MA'] = data['Close'].rolling(window=slow_ma_length).mean()

        # 根据移动平均线交叉定义交易信号
        data['Signal'] = np.where(data['Fast_MA'] > data['Slow_MA'], 1, -1)

        # 计算交易策略的每日收益
        data['Return'] = data['Signal'] * data['Close'].pct_change()

        # 计算交易策略的累计收益
        data['Cumulative_Return'] = (1 + data['Return']).cumprod()

        # 基于累计收益率评估适应度
        fitness = data['Cumulative_Return'].iloc[-1]

        return fitness

    def selection(self):
        # 根据适应度进行父染色体选择
        # 在这里插入选择逻辑
        pass

    def crossover(self, parent1, parent2):
        # 执行交叉以创建子代染色体
        # 在这里插入交叉逻辑
        pass

    def mutation(self, chromosome):
        # 根据变异率对染色体进行变异
        # 在这里插入变异逻辑
        pass

    def evolve(self):
        # 在多个世代中演化种群
        for generation in range(self.generations):
            # 执行选择、交叉和变异
            # 在这里插入演化逻辑
            pass

2.5 将遗传算法与交易策略集成

将遗传算法与移动平均线交叉交易策略进行集成,根据交易策略的累计收益率定义适应度评估逻辑。

class GeneticAlgorithm:
    # ... (之前的代码)

    def fitness_evaluation(self, chromosome):
        # 将二进制染色体解码为交易参数
        fast_ma_length = int(''.join(map(str, chromosome[:5])), 2) + 5
        slow_ma_length = int(''.join(map(str, chromosome[5:])), 2) + 5

        # 计算快速和慢速移动平均线
        data['Fast_MA'] = data['Close'].rolling(window=fast_ma_length).mean()
        data['Slow_MA'] = data['Close'].rolling(window=slow_ma_length).mean()

        # 基于移动平均线交叉定义交易信号
        data['Signal'] = np.where(data['Fast_MA'] > data['Slow_MA'], 1, -1)

        # 计算交易策略的每日收益
        data['Return'] = data['Signal'] * data['Close'].pct_change()

        # 计算交易策略的累计收益
        data['Cumulative_Return'] = (1 + data['Return']).cumprod()

        # 基于累计收益率评估适应度
        fitness = data['Cumulative_Return'].iloc[-1]

        return fitness

2.6 运行遗传算法

创建一个GeneticAlgorithm类的实例,并运行遗传算法来优化移动平均交叉交易策略。

# 创建一个GeneticAlgorithm类的实例
ga = GeneticAlgorithm(population_size=100, chromosome_length=10, mutation_rate=0.01, crossover_rate=0.8, generations=100)

# 运行遗传算法来优化交易策略
ga.evolve()

3.总结

本文探讨了遗传算法的概念及其在交易系统优化中的应用,并使用Python实现了一个遗传算法来优化简单的移动平均线交叉交易策略。通过将遗传算法与交易策略集成,能够搜索出最优的移动平均线长度组合,从而最大化交易策略的累计收益率。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1296021.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【方法】Excel表格的“限制保护”不想要了,如何取消?

我们知道,Excel表格可以设置“限制保护”,保护文件不被随意更改,那如果后续不需要保护了,如何取消呢? 下面小编来说说Excel表格常用的三种“保护”,是如何取消的。 第一种,Excel表格的工作表或…

第15章:随堂复习与企业真题(File类与IO流)

第15章:随堂复习与企业真题(File类与IO流) 一、随堂复习 1. File类的使用 File类的一个实例对应着磁盘上的一个文件或文件目录。 ----> “万事万物皆对象”(熟悉)File的实例化、常用的方法File类中只有新建、删除…

Unity 自定义窗口

放在Editor文件夹下&#xff1b; #if UNITY_EDITORusing System; using UnityEditor; using UnityEngine;namespace EditorCustumTool {/// <summary>/// 自定义窗口/// </summary>public class CustomWindow : EditorWindow{public enum FlagType{Flag1 101,Fl…

Qt内存管理、UI编辑器、客制化组件、弹出对话框、常用部件类

头文件的小技巧 #include <QtWidgets> // 在自动生成的 .h 里面加上此句 适用条件&#xff1a; QT 的内存管理 当父窗体被关闭时&#xff0c;子部件的内存会自动释放。 对象树是一种管理对象生命周期的机制。当一个对象被添加到另一个对象的子对象列表中时&#xff0…

Springboot+AOP+注解实现字段AES+Base64加解密

AOP实现AESBASE64加解密 场景如下&#xff1a; 需要对数据库存储的字段&#xff0c;进行加解密的处理。如果都直接写代码的话&#xff0c;那么代码回冗余很多&#xff0c;所以使用AOP注解去实现。让代码简洁&#xff0c;方便 具体实现如下&#xff1a; 1、依赖 <depende…

C语言搭建项目-学生管理系统(非链表)

、 目录 搭建offer.h文件 搭建offer.c中的main函数 密码登入系统 搭建my_oferr.c中的接口函数 使用帮助菜单接口函数 增加学生信息接口函数 查询学生信息接口函数 删除学生信息接口函数 保存学生信息接口 打开文件fopen 关闭文件fclose 判断是否保存文件fwrite 退出执行文件…

TCP传输层详解(计算机网络复习)

介绍&#xff1a;TCP/IP包含了一系列的协议&#xff0c;也叫TCP/IP协议族&#xff0c;简称TCP/IP。该协议族提供了点对点的连接机制&#xff0c;并将传输数据帧的封装、寻址、传输、路由以及接收方式都予以标准化 TCP/IP的分层模型 在讲TCP/IP协议之前&#xff0c;首先介绍一…

【MATLAB】tvfEMD信号分解+FFT+HHT组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 TVFEMDFFTHHT组合算法是一种结合了总体变分模态分解&#xff08;TVFEMD&#xff09;、傅里叶变换&#xff08;FFT&#xff09;和希尔伯特-黄变换&#xff08;HHT&#xff09;的信号分解方…

配置Smart Link负载分担示例

Smart Link和Monitor Link简介 定义 Smart Link&#xff0c;又叫做备份链路。一个Smart Link由两个接口组成&#xff0c;其中一个接口作为另一个的备份。Smart Link常用于双上行组网&#xff0c;提供可靠高效的备份和快速的切换机制。 Monitor Link是一种接口联动方案&#…

<习题集><LeetCode><链表><2/19/21/23/24>

目录 2. 两数相加 19. 删除链表的倒数第 N 个结点 21. 合并两个有序链表 23. 合并 K 个升序链表 24. 两两交换链表中的节点 2. 两数相加 https://leetcode.cn/problems/add-two-numbers/ public ListNode addTwoNumbers(ListNode l1, ListNode l2) {//head是cur链表头节点…

拼多多选品大作战:通过热词选利润赛道

相信很多人都听过一句话&#xff1a;找对了风口&#xff0c;猪都能飞起来。 我们电商人也应如此&#xff0c;从行业分析到选品都应快速跟上市场节奏。 今天就给大家分享一下如何通过热词来进行一个行业类目的分析与选择。 01 热词是什么 热词通常指的是热搜词和飙升词&#…

大华DSS S2-045 OGNL表达式注入漏洞复现

0x01 产品简介 大华DSS安防监控系统平台是一款集视频、报警、存储、管理于一体的综合安防解决方案。该平台支持多种接入方式,包括网络视频、模拟视频、数字视频、IP电话、对讲机等。此外,该平台还支持多种报警方式,包括移动侦测、区域入侵、越线报警、人员聚集等。 0x02 漏…

天津大数据培训机构品牌 数据分析师的发展方向

大数据专业还是有一定难度的&#xff0c;毕竟大数据开发技术所包含的编程技术知识是比较杂且多的如果是计算机专业的学生或者自身有一定基础的人学&#xff0c;相对来说会比较容易&#xff0c;但对于零基础小伙伴学习来说&#xff0c;想要学习大数据&#xff0c;难度还是很高的…

C# 编程新手必看,一站式学习网站,让你轻松掌握 C# 技能!

介绍&#xff1a;实际上&#xff0c;您可能弄错了&#xff0c;C#并不是一种独立的编程语言&#xff0c;而是一种由微软公司开发的面向对象的、运行于.NET Framework之上的高级程序设计语言。C#看起来与Java十分相似&#xff0c;但两者并不兼容。 C#的设计目标是简单、强大、类型…

时间序列预测 — VMD-LSTM实现单变量多步光伏预测(Tensorflow):单变量转为多变量

目录 1 数据处理 1.1 导入库文件 1.2 导入数据集 1.3 缺失值分析 2 VMD经验模态分解 3 构造训练数据 4 LSTM模型训练 5 预测 1 数据处理 1.1 导入库文件 import time import datetime import pandas as pd import numpy as np import matplotlib.pyplot as plt f…

系列八、SpringBoot中自定义SpringMVC配置

一、概述 作为Spring家族的明星产品&#xff0c;SpringBoot极大地简化了程序员的日常开发&#xff0c;提高了开发效率。我们很容易得借助于SpringBoot就可以快速开发业务代码。一般情况下&#xff0c;公司的日常开发都是基于web服务的&#xff0c;我们在使用idea等工具初始化一…

SecureCRT9汉化版安装详解

CRT中文版安装说明 一、安装步骤1. 安装注意&#xff1a;2. 右键压缩包&#xff0c;解压到本地文件夹内3. 解压后进入目录&#xff0c;双击CRT_SFX_91_Run_Script激活脚本 3 如果运行结果是下图&#xff0c;就激活成功了&#xff1a;4. 双击桌面的CRT和FX图标5. 如果提示下图&a…

Qt简介、工程文件分离、创建Qt工程、Qt的帮助文档

QT 简介 core&#xff1a;核心模块&#xff0c;非图形的接口类&#xff0c;为其它模块提供支持 gui&#xff1a;图形用户接口&#xff0c;qt5之前 widgets&#xff1a;图形界面相关的类模块 qt5之后的 database&#xff1a;数据库模块 network&#xff1a;网络模块 QT 特性 开…

VisualStudio反汇编功能使用

VisualStudio反汇编功能使用 使用方法 到达断点时&#xff1a;CtrlK&#xff08;松开&#xff09;G&#xff08;后按&#xff09;唤出反汇编界面&#xff0c;就可以看到当前代码对应的汇编语言了 注意&#xff1a;进入反汇编窗口后可以F10单次调试一条汇编指令 其他&#…

3.添加与删除字段

添加字段与删除字段 1.添加字段 因为甲方的业务需求是不停变化的&#xff0c;所以在数据库操作中&#xff0c;添加字段可是常有的事。一个完整的字段包括&#xff1a;字段名、数据类型和完整性约束。 语法规则为&#xff1a; ALTER TABLE 表名 ADD 新字段名 数据类型 [约束条…