Google bigquery 如果可能的话,如何为Google Bigquery上的回溯测试设置跟踪止损

Google bigquery 如果可能的话,如何为Google Bigquery上的回溯测试设置跟踪止损,google-bigquery,quantitative-finance,back-testing,Google Bigquery,Quantitative Finance,Back Testing,因此,我正在谷歌Bigquery上对股票市场上的一些交易策略进行回溯测试,我想设定一个从输入价格开始的1%的后续止损。如果股价上涨5%,那么后续止损也会上涨5%。如果股价下跌,后续止损不会改变。() 这张表显示了我进入的信号,如果价格低于尾随止损价格,则退出列将显示值1,这意味着交易退出 这是我到目前为止的表格: date price entry_signal 30/06/2018 95 0

因此,我正在谷歌Bigquery上对股票市场上的一些交易策略进行回溯测试,我想设定一个从输入价格开始的1%的后续止损。如果股价上涨5%,那么后续止损也会上涨5%。如果股价下跌,后续止损不会改变。()

这张表显示了我进入的信号,如果价格低于尾随止损价格,则退出列将显示值1,这意味着交易退出

这是我到目前为止的表格:

date           price      entry_signal      
30/06/2018     95              0                
01/07/2018     100             1                
02/07/2018     103             0                
03/07/2018     105             0                
04/07/2018     104.50          0                
05/07/2018     101             0                
我想有一个列,显示什么是尾随止损在每个日期。2018年7月1日,当enter_信号=1时,后续止损首次设置为价格的99%,交易在此日期执行

当价格上涨y%时,后续止损也将上涨y%。然而,如果价格下跌,后续止损将不会改变其上一个值


当以下价格为BigQuery标准SQL时

如果价格也下跌了y%,我目前陷入了跌停状态,没有后续止损下跌y%

结果

Row day         price   trailing_stop_loss  entry_signal    exit_signal  
1   30/06/2018  95.0    94.05               0               0    
2   01/07/2018  100.0   99.0                1               0    
3   02/07/2018  103.0   101.97              0               0    
4   03/07/2018  105.0   103.95              0               0    
5   04/07/2018  104.5   103.95              0               0    
6   05/07/2018  101.0   103.95              0               1    
期望的表格结果:

正如您所见,上述查询至少部分地解决了您的
问题,而我不确定整个情况是什么,还有哪些问题需要解决,即使您的总体问题仍未完全解决,但我觉得您的特定问题已经得到了回答

因此,我希望上面的内容能够为您打开障碍,您可以自己完成挑战:o)

顺便说一句,我使用了以下虚拟数据(来自您的问题)


“我现在被困在…”-你能显示你被困的问题吗?嗨,米凯尔,谢谢你再次提供帮助!嗨@MikhailBerlyant我已经添加了我的代码和从代码中获得的表。与我的代码相比,我想不出如何在我想要的表中获得尾随的停止损失。只有在正确完成尾随_停止_损失的情况下才能获得退出_信号,如果价格正确,则退出_信号=1
SELECT 
date, price, entry_signal,
GREATEST(trailing_stop_loss, 0.99 * price) AS trailing_stop_loss
FROM (
SELECT
date, price, entry_signal,
LAST_VALUE(trailing_stop_loss IGNORE NULLS) OVER (ORDER BY DATE) AS trailing_stop_loss
FROM (
SELECT
 date, price, entry_signal,
IF(entry_signal * 0.99 * price > 0, 0.99 * price, NULL) AS trailing_stop_loss
FROM table
)
)

date           price      trailing stop loss      entry_signal      
30/06/2018     95              NULL                     0                
01/07/2018     100             99                       1                
02/07/2018     103             101.97                   0                
03/07/2018     105             103.95                   0                
04/07/2018     104.50          103.455                  0                
05/07/2018     101             99.99                    0                
#standardSQL
WITH temp1 AS (
  SELECT day, price, entry_signal,
    UNIX_DATE(PARSE_DATE('%d/%m/%Y', day)) day_as_days,
    COUNTIF(entry_signal = 1) OVER(ORDER BY UNIX_DATE(PARSE_DATE('%d/%m/%Y', day))) grp
  FROM `project.dataset.table`
), temp2 AS (
  SELECT day, price,
    0.99 * price AS trailing_stop_loss,
    IFNULL(price > LAG(price) OVER(PARTITION BY grp ORDER BY day_as_days), TRUE) AS up,
    entry_signal, grp, day_as_days
  FROM temp1
)
SELECT day, price, trailing_stop_loss, entry_signal, 
  IF(price > trailing_stop_loss, 0, 1) AS exit_signal
FROM (
  SELECT day_as_days, day, price, entry_signal,
    IF(up, trailing_stop_loss, arr[OFFSET(0)]) trailing_stop_loss
  FROM (
    SELECT day_as_days, day, price, up, trailing_stop_loss, entry_signal,
      ARRAY_AGG(trailing_stop_loss) OVER(PARTITION BY grp ORDER BY IF(up, day_as_days, 0) DESC) arr
    FROM temp2
  )
)
-- ORDER BY day_as_days   
Row day         price   trailing_stop_loss  entry_signal    exit_signal  
1   30/06/2018  95.0    94.05               0               0    
2   01/07/2018  100.0   99.0                1               0    
3   02/07/2018  103.0   101.97              0               0    
4   03/07/2018  105.0   103.95              0               0    
5   04/07/2018  104.5   103.95              0               0    
6   05/07/2018  101.0   103.95              0               1    
WITH `project.dataset.table` AS (
  SELECT '30/06/2018' day, 95 price, 0 entry_signal UNION ALL
  SELECT '01/07/2018', 100, 1 UNION ALL
  SELECT '02/07/2018', 103, 0 UNION ALL
  SELECT '03/07/2018', 105, 0 UNION ALL
  SELECT '04/07/2018', 104.50, 0 UNION ALL
  SELECT '05/07/2018', 101, 0 
)