3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant(聚宽)平台上,您不需要手动去计算(卖出价-买入价)或者通过公司总市值来推算投资回报率。平台底层的回测引擎已经为您完美解决了拆股、合股、分红以及增发带来的收益率计算失真问题。
解决这个问题的核心办法是:开启动态复权(真实价格)模式。
在策略的 initialize 函数中,加入以下代码:
def initialize(context):
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
在未开启真实价格模式时,如果使用前复权数据,确实会存在未来函数问题,导致回测价格不真实。但当您开启 use_real_price = True 后:
context.portfolio.total_value)在除权除息日是平滑且真实的,完全符合真实交易场景。您提到的用“总市值”来计算回报率本身就是一个误区。投资者的个人投资回报率只与个人账户的资产净值变化有关,与上市公司的总市值(股本×股价)无关。定向增发虽然增加了公司的总股本和总市值,但只要除权除息处理得当,您手中持有的股票价值变化系统会自动计算。
JoinQuant 平台通过跟踪您账户的资金流入流出(inout_cash)和当前总资产(total_value)来计算收益率,完全避开了公司总市值变动的干扰。
在开启了真实价格模式后,您可以在策略的任何地方(如 handle_data 或 after_trading_end 中)直接通过 context 对象获取当前最准确的投资回报率和账户资产:
def handle_data(context, data):
# 获取总账户的持仓价值
positions_value = context.portfolio.positions_value
# 获取总账户的总资产(包含现金和持仓价值)
total_value = context.portfolio.total_value
# 获取总权益的累计收益率(即真实的投资回报率)
# 计算公式大致为:(total_value / inout_cash) - 1
returns = context.portfolio.returns
log.info(f"当前账户总资产: {total_value}, 累计投资回报率: {returns*100:.2f}%")
set_option('use_real_price', True)。context.portfolio.returns 获取账户级别的真实累计收益率。