3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
直接给出结论:完全不可行,这是一个典型的量化思维陷阱。
很多初学者在写出带有“未来函数”的策略时,看到那条完美向上的收益曲线,都会产生和你一样的想法:“既然它选的股这么牛,我不让它自动买,我人工跟着买行不行?”
要理解为什么不行,我们需要彻底搞懂“未来函数”到底在干什么。
未来函数是指在量化回测中,策略在 $T$ 时刻使用了 $T$ 时刻之后才能获取的数据。例如:
为什么收益高? 因为它在“作弊”。它之所以能选出那些大涨的股票,是因为它已经提前看到了这些股票未来会大涨。这就像你拿着明天的报纸去今天的彩票站买彩票,收益率当然是 100%。
你的设想是:策略回测牛 $\rightarrow$ 策略选股牛 $\rightarrow$ 我拿它今天的选股结果人工挑。
这个逻辑链条在“实盘/模拟盘”的当下是断裂的,原因如下:
在回测里,策略在历史的某一天(比如2023年1月1日)能选出牛股,是因为它读取了2023年1月2日的数据。但在现实的今天,你运行这个策略时,系统是无法提供“明天的数据”给它的。
当策略在实盘/模拟盘中运行时,如果它强行请求未来数据(比如今天开盘请求今天的收盘价),它要么报错,要么只能拿到昨天的收盘价(或者 NaN)。这意味着,策略在现实中根本无法选出它在回测中选出的那种“牛股”。
带有未来函数的策略,其选股逻辑是:“因为这只股票明天涨停了,所以我今天把它加入持仓。”
当你把它当做自选池时,你以为你得到的是“即将大涨的潜力股”,但实际上,一旦剥离了未来数据,这个策略的选股逻辑可能完全是混乱的、随机的,甚至是有害的。你在这个池子里人工挑选,和在全市场随机挑选没有本质区别,甚至胜率更低。
你看到的高收益,是建立在“只买未来会涨的股票”这一基础上的。一旦到了实盘,未来函数失效,策略的真实面目就会暴露。你以为你在“优中选优”,其实你是在一个失去了魔法的废池子里淘金。
在 JoinQuant 平台上,强烈建议在策略初始化时开启避免未来数据的选项,这能帮你及早发现代码中的逻辑漏洞:
def initialize(context):
# 设置回测是否开启避免未来数据模式
set_option("avoid_future_data", True)
开启此功能后:
FutureDataError 异常。未来函数造就的不是一个“优秀的选股模型”,而是一个“完美的历史复盘机”。
不要对带有未来函数的策略抱有任何实盘幻想(包括作为自选股池)。正确的做法是:找出代码中的未来函数,将其剔除,然后重新回测。 只有在没有未来函数、没有偷窥未来的情况下取得的正收益,才是真正有价值的量化策略。