如何将单只股票的最优移动平均线(MA)回测代码适配为多只股票批量运行
嘿,我明白你现在的困境——单只股票的最优MA回测跑通了,但扩展到多只股票时卡壳了。别担心,我们只需要把单只股票的回测逻辑封装成可复用的函数,再遍历股票列表收集结果就行。我帮你重构了代码,来看看怎么做:
多股票最优MA回测解决方案
import pandas as pd import numpy as np import yfinance as yf # 定义要测试的MA周期区间 intervals = range(10, 50, 5) def backtest_single_stock(symbol, start_date='2021-09-01'): """针对单只股票回测最优MA参数,返回最优结果的单行DataFrame""" # 下载目标股票数据 df = yf.download(symbol, start=start_date) # 存储当前股票所有MA周期的回测结果 stock_results = [] for interval in intervals: df_copy = df.copy() # 计算核心指标:收益率、移动平均线、持仓信号、策略收益 df_copy['Return'] = np.log(df_copy.Close.pct_change() + 1) df_copy['MA'] = df_copy.Close.rolling(interval).mean() df_copy['Position'] = np.where(df_copy.Close > df_copy['MA'], 1, 0) df_copy['MAret'] = df_copy['Position'].shift(1) * df_copy['Return'] # 计算累计收益和策略优势(Edge) total_return = np.exp(df_copy['Return'].dropna().sum()) strategy_return = np.exp(df_copy['MAret'].dropna().sum()) edge = strategy_return - total_return # 收集当前MA周期的结果 stock_results.append({ 'Symbol': symbol, 'MA_Period': interval, 'Total_Return': total_return, 'Strategy_Return': strategy_return, 'Edge': edge }) # 转换为DataFrame并筛选Edge最大的最优结果 results_df = pd.DataFrame(stock_results) optimal_result = results_df.sort_values('Edge', ascending=False).head(1) return optimal_result # 待测试的股票列表 symbols = ['AAPL', 'MSFT', 'AMZN'] # 遍历所有股票,合并最优结果 all_optimal_results = pd.concat([backtest_single_stock(sym) for sym in symbols], ignore_index=True) # 查看最终结果 print(all_optimal_results)
关键改进说明
- 模块化封装:把单只股票的回测逻辑放进
backtest_single_stock函数,输入股票代码就能输出该股票的最优结果,代码复用性更强,也更容易调试。 - 弃用append改用concat:原代码里的
new.append()已经被pandas官方弃用,改用pd.concat()合并多只股票的结果,效率更高且符合最新规范。 - 简化计算流程:去掉了不必要的列删除操作,直接计算核心收益指标,让代码更简洁易懂。
- 添加股票标识:在结果中加入
Symbol列,清晰区分每只股票的最优参数和收益情况。
运行这段代码后,all_optimal_results就是你想要的最终DataFrame,每一行对应一只股票的最优MA周期、基准收益、策略收益以及策略相对基准的优势值。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

