如果可能,如何为 Google Bigquery 上的回溯测试设置追踪止损
How to set trailing stop loss for backtesting on Google Bigquery if possible
所以我正在 Google Bigquery 上对股票市场上的一些交易策略进行一些回溯测试,我想将追踪止损设置为距输入价格 1%。如果股价上涨 5%,追踪止损也会上涨 5%。如果股价下跌,追踪止损不会改变。 (https://www.investopedia.com/terms/t/trailingstop.asp)
我有这个 table,它显示我的入场信号,如果价格低于追踪止损价格,出场栏将显示值 1,这意味着交易已出场。
这是 table 我目前拥有的:
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
我想要一个列显示每个日期的追踪止损是多少。当 enter_signal = 1 时,追踪止损首先设置为 01/07/2018 价格的 99%,交易在该日期执行。
当价格上涨y%时,追踪止损也会上涨y%。然而,如果价格下跌,追踪止损将不会改变其最后的值。
当价格 <= 追踪止损时,交易退出,exit_signal 为 1...
如果价格也下跌 y%,我目前无法让追踪止损下跌 y%....
期望的table结果:
date price trailing stop loss entry_signal exit_signal
30/06/2018 95 NULL 0 0
01/07/2018 100 99 1 0
02/07/2018 103 101.97 0 0
03/07/2018 105 103.95 0 0
04/07/2018 104.50 103.95 0 0
05/07/2018 101 103.95 0 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
)
)
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
以下适用于 BigQuery 标准 SQL
I am currently stuck at not having the trailing stop loss to move down by y% if the price move down by y% as well....
#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
Desired table outcome: ...
如您所见,以上查询至少部分解决了您的 stuck at
点 - 虽然我不确定整个情况是什么以及还有什么需要解决 - 即使您的整体问题仍然没有完全解决 - 我觉得你的特定问题得到了回答。
所以,我希望上面的内容能为您解封,您可以自己完成挑战:o)
顺便说一句,我使用了以下虚拟数据(来自你的问题)
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
)
所以我正在 Google Bigquery 上对股票市场上的一些交易策略进行一些回溯测试,我想将追踪止损设置为距输入价格 1%。如果股价上涨 5%,追踪止损也会上涨 5%。如果股价下跌,追踪止损不会改变。 (https://www.investopedia.com/terms/t/trailingstop.asp)
我有这个 table,它显示我的入场信号,如果价格低于追踪止损价格,出场栏将显示值 1,这意味着交易已出场。
这是 table 我目前拥有的:
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
我想要一个列显示每个日期的追踪止损是多少。当 enter_signal = 1 时,追踪止损首先设置为 01/07/2018 价格的 99%,交易在该日期执行。
当价格上涨y%时,追踪止损也会上涨y%。然而,如果价格下跌,追踪止损将不会改变其最后的值。
当价格 <= 追踪止损时,交易退出,exit_signal 为 1...
如果价格也下跌 y%,我目前无法让追踪止损下跌 y%....
期望的table结果:
date price trailing stop loss entry_signal exit_signal
30/06/2018 95 NULL 0 0
01/07/2018 100 99 1 0
02/07/2018 103 101.97 0 0
03/07/2018 105 103.95 0 0
04/07/2018 104.50 103.95 0 0
05/07/2018 101 103.95 0 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
)
)
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
以下适用于 BigQuery 标准 SQL
I am currently stuck at not having the trailing stop loss to move down by y% if the price move down by y% as well....
#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
Desired table outcome: ...
如您所见,以上查询至少部分解决了您的 stuck at
点 - 虽然我不确定整个情况是什么以及还有什么需要解决 - 即使您的整体问题仍然没有完全解决 - 我觉得你的特定问题得到了回答。
所以,我希望上面的内容能为您解封,您可以自己完成挑战:o)
顺便说一句,我使用了以下虚拟数据(来自你的问题)
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
)