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

2023-12-13 04:12:13

大家好,遗传算法是一种受自然选择过程启发的进化算法,用于寻找优化和搜索问题的近似解决方案。本文将使用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实现了一个遗传算法来优化简单的移动平均线交叉交易策略。通过将遗传算法与交易策略集成,能够搜索出最优的移动平均线长度组合,从而最大化交易策略的累计收益率。?

文章来源:https://blog.csdn.net/csdn1561168266/article/details/134886644
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。