You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将单只股票的最优移动平均线(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:44:26