如何在趋势交易系统中遍历移动平均线参数组合
解决方案
核心思路
通过生成所有参数组合,循环调用策略函数并收集结果,最终整合为包含参数信息的对比数据框。
修改后的完整代码
import pandas as pd import numpy as np from itertools import product def trendfunc(f1, fastnum, slownum): f1['Change'] = f1['Close'].pct_change() f1['Fast'] = f1['Close'].rolling(window=fastnum, center=False).mean() f1['Slow'] = f1['Close'].rolling(window=slownum, center=False).mean() f1['Trend'] = f1['Fast'] - f1['Slow'] f1['Position'] = np.where(f1['Trend'].shift(2) > 0, 1, 0) f1['Result'] = f1['Position'] * f1['Change'] f1 = f1.dropna() # 计算市场基准VAMI与最大回撤 f1['MktVAMI'] = f1['Change'] + 1 f1['MktVAMI'].iloc[0] = 1000 f1['MktVAMI'] = f1['MktVAMI'].cumprod() f1['MktHi'] = f1['MktVAMI'].cummax() f1['MktDD'] = (f1['MktVAMI'] / f1['MktHi']) - 1 f1['MktMaxDD'] = f1['MktDD'].cummin() # 计算策略系统VAMI与最大回撤 f1['SysVAMI'] = f1['Result'] + 1 f1['SysVAMI'].iloc[0] = 1000 f1['SysVAMI'] = f1['SysVAMI'].cumprod() f1['SysHi'] = f1['SysVAMI'].cummax() f1['SysDD'] = (f1['SysVAMI'] / f1['SysHi']) - 1 f1['SysMaxDD'] = f1['SysDD'].cummin() keep = ['Date', 'MktVAMI', 'MktMaxDD', 'SysVAMI', 'SysMaxDD'] f2 = f1[keep].tail(1) return f2 tkrs = ['spy'] # 定义待测试的参数组合 fast_params = [10, 20, 30] slow_params = [100, 200, 300] # 初始化空数据框用于存储所有结果 final_results = pd.DataFrame() for tkr in tkrs: df1 = pd.read_csv(f'C:\\Path\\To\\Date\\{tkr}.csv') # 遍历所有参数组合(用product避免嵌套循环) for fast_ma, slow_ma in product(fast_params, slow_params): # 传入数据副本,避免原数据被多次修改 single_result = trendfunc(df1.copy(), fast_ma, slow_ma) # 添加当前参数组合标识 single_result['FastMA'] = fast_ma single_result['SlowMA'] = slow_ma # 追加到总结果数据框 final_results = pd.concat([final_results, single_result], ignore_index=True) # 导出对比结果到CSV文件 final_results.to_csv('ma_strategy_comparison.csv', index=False)
关键细节说明
- 用
itertools.product一键生成所有参数组合,替代手动嵌套循环,代码更简洁易维护。 - 每次调用策略函数时传入
df1.copy(),防止原数据被多次修改引发计算错误。 - 使用
pd.concat合并结果(替代已弃用的append方法),保证数据框操作的规范性。 - 最终结果包含
FastMA、SlowMA参数列与绩效指标,直接满足对比分析需求。
内容的提问来源于stack exchange,提问作者GC123
相关产品推荐
相关产品推荐

