金融量化交易:使用Python實現遺傳算法

大家好,遺傳算法是一種受自然選擇過程啟發的進化算法,用于尋找優化和搜索問題的近似解決方案。本文將使用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?completedOpen????????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_sizeself.chromosome_length?=?chromosome_lengthself.mutation_rate?=?mutation_rateself.crossover_rate?=?crossover_rateself.generations?=?generationsself.population?=?self.initialize_population()def?initialize_population(self):#?使用隨機二進制染色體初始化種群population?=?np.random.randint(2,?size=(self.population_size,?self.chromosome_length))return?populationdef?fitness_evaluation(self,?chromosome):#?將二進制染色體解碼為交易參數fast_ma_length?=?int(''.join(map(str,?chromosome[:5])),?2)?+?5slow_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?fitnessdef?selection(self):#?根據適應度進行父染色體選擇#?在這里插入選擇邏輯passdef?crossover(self,?parent1,?parent2):#?執行交叉以創建子代染色體#?在這里插入交叉邏輯passdef?mutation(self,?chromosome):#?根據變異率對染色體進行變異#?在這里插入變異邏輯passdef?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)?+?5slow_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.pswp.cn/news/207661.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/207661.shtml
英文地址,請注明出處:http://en.pswp.cn/news/207661.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL 教程 2.1

MySQL 插入數據 MySQL 表中使用 INSERT INTO 語句來插入數據。 你可以通過 mysql> 命令提示窗口中向數據表中插入數據,或者通過PHP腳本來插入數據。 語法 以下為向MySQL數據表插入數據通用的 INSERT INTO SQL語法: INSERT INTO table_name (colu…

使用Pytorch實現Grad-CAM并繪制熱力圖

這篇是我對嗶哩嗶哩up主 霹靂吧啦Wz 的視頻的文字版學習筆記 感謝他對知識的分享 看一下這個main cnn.py的文件 那這里我為了方便 就直接從官方的torch vision這個庫當中導入一些我們常用的model 比如說我這里的例子是采用的mobile net v3 large這個模型 然后這里我將pretrain設…

微信小程序 純css畫儀表盤

剛看到設計稿的時候第一時間想到的就是用canvas來做這個儀表盤&#xff0c;雖然本人的畫布用的不是很好但還可以寫一寫&#x1f600;。話不多說直接上代碼。最后有純css方法 <!--wxml--> <canvas canvas-id"circle" class"circle" >// js dat…

MySQL 忘記root密碼后重置密碼操作

在忘記 MySQL 密碼的情況下&#xff0c;可以通過 --skip-grant-tables 關閉服務器的認證&#xff0c;然后重置 root 的密碼&#xff0c;具體操作步驟如下。 步驟 1)&#xff1a;關閉正在運行的 MySQL 服務。打開 cmd 進入 MySQL 的 bin 目錄。 步驟 2)&#xff1a;輸入mysqld -…

【Docker】容器數據持久化及容器互聯

容器數據持久化及容器互聯 一、Docker容器的數據管理1.1、什么是數據卷1.2、數據卷特點1.3、數據卷使用 二、Docker的數據卷容器2.1、什么是數據卷容器2.2、掛載數據卷容器方法 三、Docker數據卷的備份和還原3.1、數據備份方法3.2、數據還原方法 四、Docker容器互聯4.1、docker…

數據寶庫:深入探討數據隱私與安全的要義

寫在開頭 隨著數字時代的蓬勃發展&#xff0c;數據已成為當今社會的新型燃料。然而&#xff0c;正如能源需要保護和管理一樣&#xff0c;我們的數據同樣需要被妥善對待。本文將深入討論數據隱私和安全的不可忽視的重要性&#xff0c;并為您提供一些實用的基本措施和方法&#…

xcode ——Instrumets(網絡連接調試)使用

環境&#xff1a; instruments 使用只能在真機調試時使用&#xff0c;且真機系統必須ios15 點擊debug 按鈕——Network——Profile in Instruments 然后就可以看到如下面板 展開運行的項目&#xff0c;點擊session下的域名&#xff0c;下方回出現該域名下的網絡請求。點擊Deve…

管理類聯考——數學——真題篇——按題型分類——充分性判斷題——秒殺

題型結構 問題求解&#xff1a;通過計算求解&#xff0c;從五個選項中選出一個正確答案。條件充分性判斷&#xff1a;問所給的條件&#xff08;1&#xff09;&#xff08;2&#xff09;能否推出題設的結論&#xff0c;共有五個選項&#xff0c;從中選出正確的一個。&#xff0…

車聯網安全學習路標

1. 汽車和物聯網基礎知識 首先&#xff0c;你需要全面了解汽車和物聯網的基礎知識&#xff0c;包括汽車電子體系結構、車載通信技術&#xff08;如CAN、LIN、FlexRay、Ethernet&#xff09;以及物聯網的架構和通信協議&#xff08;如MQTT、CoAP&#xff09;。 2. 汽車網絡安全…

LCR 090. 打家劫舍 II(leetcode)動態規劃

文章目錄 前言一、題目分析二、算法原理1.狀態表示2.狀態轉移方程3.初始化4.填表順序5.返回值是什么 三、代碼實現總結 前言 在本文章中&#xff0c;我們將要詳細介紹一下LeetcodeLCR 090. 打家劫舍 II。采用動態規劃解決&#xff0c;這是一道經典的多狀態dp問題 一、題目分析…

人工智能從 DeepMind 到 ChatGPT ,從 2012 - 2024

本心、輸入輸出、結果 文章目錄 人工智能從 DeepMind 到 ChatGPT &#xff0c;從 2012 - 2024前言2010年&#xff1a;DeepMind誕生2012&#xff5e;2013年&#xff1a;谷歌重視AI發展&#xff0c;“拿下”Hinton2013&#xff5e;2014年&#xff1a;谷歌收購DeepMind2013年&…

stm32一種步進電機查表法驅動

文章目錄 一、定時器基礎頻率二、驅動原理三、關鍵代碼 對于stm32芯片來說&#xff0c;步進電機的驅動由于要在中斷中不斷計算下一次脈沖的時間而極其消耗算力&#xff0c;使用計算的方法對于芯片的算法消耗更高&#xff0c;特別是在f1這種算力比較低的芯片上&#xff0c;這時候…

Pipenv環境配置+Pytest運行

環境配置 使用Pipenv進行虛擬環境管理&#xff0c;Pipfile為依賴模塊管理文件。 安裝pipenv&#xff1a;brew install pipenv根項目根目錄下執行命令創建虛擬環境&#xff1a; pipenv install在Pycharm中指定項目運行的虛擬環境 &#xff1a;File->Settings->Project:-…

一文2500字使用Python進行GRPC和Dubbo協議的高級測試

01、GRPC測試 GRPC&#xff08;Google Remote Procedure Call&#xff09;是一種高性能、開源的遠程過程調用&#xff08;RPC&#xff09;框架&#xff0c;由 Google開發并基于Protocol Buffers&#xff08;protobuf&#xff09;進行通信。它使用了HTTP/2協議作為傳輸層&#…

C++11條件變量condition_variable

文章目錄 前言正文等待通知注意事項 結尾 前言 條件變量用于多線程中&#xff0c;其作用是在多線程間實現線程的等待、喚醒和通知機制&#xff0c;常配合互斥鎖&#xff08;std::mutex&#xff09;一起使用。它主要用于解決數據競爭問題>。 正文 條件變量只有五個函數&am…

PyQt6 QCalendarWidget日歷控件

?鋒哥原創的PyQt6視頻教程&#xff1a; 2024版 PyQt6 Python桌面開發 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili2024版 PyQt6 Python桌面開發 視頻教程(無廢話版) 玩命更新中~共計39條視頻&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面開發 視頻教程(無廢話…

快速實現入門HarmonyOS開發

本文檔適用于HarmonyOS應用開發的初學者。編寫兩個簡單的頁面&#xff0c;實現在第一個頁面點擊按鈕跳轉到第二個頁面。開始前&#xff0c;請參考下載與安裝軟件、配置開發環境和運行HelloWorld&#xff0c;完成開發工具的安裝和開發環境的配置。 開發Ability 概述&#xff1…

Python 日期時間模塊詳解(datetime)

文章目錄 1 概述1.1 datetime 類圖1.2 類描述 2 常用方法2.1 獲取當前日期時間&#xff1a;now()、today()、time()2.2 日期時間格式化&#xff1a;strftime()2.3 日期時間大小比較&#xff1a;>、、<2.4 日期時間間隔&#xff1a;- 3 擴展3.1 Python 中日期時間格式化符…

混合預編碼(Hybrid Precoding)的全連接結構與子連接結構

A Survey on Hybrid Beamforming Techniques in 5G: Architecture and System Model Perspectives 全連接結構的混合預編碼 子連接結構的混合預編碼 Alternating Minimization Algorithms for HybridPrecoding in Millimeter Wave MIMO Systems

UE Websocket筆記

參考鏈接 [UE4 C入門到進階]12.Websocket網絡通信 - 嗶哩嗶哩 包含怎么用Nodejs 寫測試服務器 UE4_使用WebSocket和Json&#xff08;上&#xff09; - 知乎 包含Python寫測試服務器 UE4_使用WebSocket和Json&#xff08;下&#xff09; - 知乎 示例代碼 xxx.Build.cs"W…