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