大家好,遺傳算法是一種受自然選擇過程啟發的進化算法,用于尋找優化和搜索問題的近似解決方案。本文將使用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實現了一個遺傳算法來優化簡單的移動平均線交叉交易策略。通過將遺傳算法與交易策略集成,能夠搜索出最優的移動平均線長度組合,從而最大化交易策略的累計收益率。?