如何在PineScript中实现条件满足后SPX未来12个月收益测试?
在PineScript中测试SPX条件触发后未来12个月收益的实现方案
下面是实现需求的完整PineScript代码,你可以直接修改适配自己的触发条件:
//@version=5 indicator("SPX 12个月后收益测试", overlay=true, shorttitle="SPX Future Return") // 1. 定义你的触发条件(示例:RSI低于30,可替换为任意逻辑) triggerCondition = ta.rsi(close, 14) < 30 // 2. 设置未来周期:日线约252个交易日=12个月;月线则设为12 futurePeriods = input.int(252, title="未来周期数", tooltip="日线填252=12个月,月线填12=12个月") // 3. 计算触发时未来N周期的收盘价及收益百分比 var float[] returnsArray = array.new_float() if triggerCondition // 确保未来周期数据存在(避免图表末端无数据的情况) if bar_index >= futurePeriods futureClose = close[-(futurePeriods)] returnPct = (futureClose / close - 1) * 100 array.push(returnsArray, returnPct) // 在触发K线上标记并显示收益 plotshape(series=triggerCondition, title="触发信号", location=location.belowbar, color=color.green, style=shape.labelup, text=str.tostring(returnPct, "#.##%"), textcolor=color.white, size=size.small) // 4. 统计收益数据(在数据窗口查看) var label statsLabel = label.new(bar_index, high, "", color=color.blue, textcolor=color.white, style=label.style_label_down) if barstate.islast and array.size(returnsArray) > 0 avgReturn = array.avg(returnsArray) winRate = array.sum(array.new_float(size=array.size(returnsArray), initial_value=1) * array.gt(returnsArray, 0)) / array.size(returnsArray) * 100 maxReturn = array.max(returnsArray) minReturn = array.min(returnsArray) statsText = str.format("信号总数: {0}\n平均收益: {1:.2f}%\n胜率: {2:.2f}%\n最大收益: {3:.2f}%\n最小收益: {4:.2f}%", array.size(returnsArray), avgReturn, winRate, maxReturn, minReturn) label.set_xy(statsLabel, bar_index, high) label.set_text(statsLabel, statsText)
关键部分说明:
- 触发条件替换:把
triggerCondition = ta.rsi(close, 14) < 30改成你自己的条件,比如ta.crossover(ta.sma(close,5), ta.sma(close,20))(5日均线上穿20日均线),或者价格突破某一阻力位等。 - 周期调整:如果用月线图表,直接把
futurePeriods改成12即可,不用改其他逻辑。 - 数据查看:触发信号会在K线下方显示未来12个月的收益百分比,图表右上角的标签会显示所有信号的统计数据(信号总数、平均收益、胜率等)。
- 注意事项:图表末端的N根K线(等于
futurePeriods)因为没有未来数据,不会触发统计,这是正常现象。
内容的提问来源于stack exchange,提问作者KarlEs
相关产品推荐
相关产品推荐

