R создать торговый симулятор - PullRequest
2 голосов
/ 16 мая 2019

Я хочу написать функцию, которая представляет торговый симулятор.У меня есть фрейм данных о ценах финансовых активов, и я хочу создать торговую стратегию, основанную на сигналах.

Вот мой фрейм данных:

(open = цена открытия, close = цена закрытия, возврат = скорость изменения в%)

    date        open close return signal
    <date>     <dbl> <dbl>  <dbl>  <dbl>
  1 2015-01-20  213.  211.     -1      0
  2 2015-01-21  211.  227.      7      1
  3 2015-01-22  227.  233.      3      0
  4 2015-01-23  234.  233.      0      0
  5 2015-01-24  233.  248.      7      1
  6 2015-01-25  247.  254.      3      0
  7 2015-01-26  254.  273.      8      1
  8 2015-01-27  273.  263.     -4      0
  9 2015-01-28  263.  234.    -11      0
 10 2015-01-29  233.  234.      0      0

Моя торговая стратегия описывается следующим образом: если есть сигнал на day t, тогда покупайте на следующем day t+1 к цене открытия и продавайтек цене закрытия.В моем примере набора данных есть сигнал на 2-й день, поэтому я покупаю на 3-й день и продаю по цене закрытия 3-го дня. Я вкладываю 100 $, поэтому в 3-й день я получаю прибыль в 3 $.Следующий сигнал приходит на 5-й день, поэтому я вкладываю свои 103 $ в 6-й день и получаю 3 дополнительных доллара.Эта таблица иллюстрирует мою торговую стратегию:

   date        open close return signal  trading.strategy capital    
   <date>     <dbl> <dbl>  <dbl>  <dbl>     
 1 2015-01-20  213.  211.     -1      0     -             100
 2 2015-01-21  211.  227.      7      1     -             100
 3 2015-01-22  227.  233.      3      0     buy+sell      103
 4 2015-01-23  234.  233.      0      0     -             103
 5 2015-01-24  233.  248.      7      1     -             103
 6 2015-01-25  247.  254.      3      0     buy+sell      106
 7 2015-01-26  254.  273.      8      1     -             106
 8 2015-01-27  273.  263.     -4      0     buy+sell      102
 9 2015-01-28  263.  234.    -11      0     -             102
10 2015-01-29  233.  234.      0      0     -             102

Может ли кто-нибудь помочь мне написать функцию, которая выполняет мою торговую стратегию?

Вот мои данные:

structure(list(date = structure(c(16455, 16456, 16457, 16458, 
16459, 16460, 16461, 16462, 16463, 16464), class = "Date"), open = c(212.91, 
211.38, 227.32, 233.52, 232.7, 247.35, 254.08, 273.17, 263.35, 
233.35), close = c(211.32, 226.9, 233.41, 232.88, 247.85, 253.72, 
273.47, 263.48, 233.91, 233.51), return = c(-1, 7, 3, 0, 7, 3, 
8, -4, -11, 0), signal = c(0, 1, 0, 0, 1, 0, 1, 0, 0, 0)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -10L))

Ответы [ 3 ]

2 голосов
/ 16 мая 2019
library(dplyr)

initial_capital <- 10000

df %>%
  mutate(
    trade = ifelse(lag(signal, default = 0), 1, 0),
    trading.strategy = ifelse(trade, "buy+sell", "-"),
    days_return = trade * (close - open) / (open),
    cum_return = cumsum(days_return),
    capital = initial_capital * (1 + cum_return)
  ) %>%
  select(-trade,-return)

# A tibble: 10 x 8
   date        open close signal trading.strategy days_return cum_return capital
   <date>     <dbl> <dbl>  <dbl> <chr>                  <dbl>      <dbl>   <dbl>
 1 2015-01-20  213.  211.      0 -                     0          0       10000 
 2 2015-01-21  211.  227.      1 -                     0          0       10000 
 3 2015-01-22  227.  233.      0 buy+sell              0.0268     0.0268  10268.
 4 2015-01-23  234.  233.      0 -                     0          0.0268  10268.
 5 2015-01-24  233.  248.      1 -                     0          0.0268  10268.
 6 2015-01-25  247.  254.      0 buy+sell              0.0258     0.0525  10525.
 7 2015-01-26  254.  273.      1 -                     0          0.0525  10525.
 8 2015-01-27  273.  263.      0 buy+sell             -0.0355     0.0171  10171.
 9 2015-01-28  263.  234.      0 -                     0          0.0171  10171.
10 2015-01-29  233.  234.      0 -                     0          0.0171  10171.

2 голосов
/ 16 мая 2019

Вы можете сделать что-то вроде этого:

library(tidyverse)

df %>% 
  mutate(trading.strategy = if_else(lag(signal) == 1, "buy+sell", "-")) %>% 
  filter(trading.strategy == "buy+sell") %>% 
  mutate(capital = 100 + cumsum(return)) %>% 
  right_join(df) %>% 
  fill(capital) %>% 
  mutate(capital = if_else(is.na(capital), 100, capital),
         trading.strategy = if_else(is.na(trading.strategy), "-", trading.strategy))

   date        open close return signal trading.strategy capital
   <date>     <dbl> <dbl>  <dbl>  <dbl> <chr>              <dbl>
 1 2015-01-20  213.  211.     -1      0 -                    100
 2 2015-01-21  211.  227.      7      1 -                    100
 3 2015-01-22  227.  233.      3      0 buy+sell             103
 4 2015-01-23  234.  233.      0      0 -                    103
 5 2015-01-24  233.  248.      7      1 -                    103
 6 2015-01-25  247.  254.      3      0 buy+sell             106
 7 2015-01-26  254.  273.      8      1 -                    106
 8 2015-01-27  273.  263.     -4      0 buy+sell             102
 9 2015-01-28  263.  234.    -11      0 -                    102
10 2015-01-29  233.  234.      0      0 -                    102
0 голосов
/ 16 мая 2019

Просто разрабатывая стратегию @Lennyy, пожалуйста, не рассматривайте это как самостоятельное решение:

library(tidyverse)

CPTL = 100

right_join(
  filter(dat, lag(signal == 1)) %>%
  mutate(
    trading.strategy = 'buy+sell',
    capital = CPTL + cumsum(return / 100) * CPTL
    ),
  dat
  ) %>%
  mutate(
    capital = replace_na(fill(., capital)$capital, CPTL),
    trading.strategy = replace_na(trading.strategy, '-')
    )

# A tibble: 10 x 7
#   date        open close return signal trading.strategy capital
#   <date>     <dbl> <dbl>  <dbl>  <dbl> <chr>              <dbl>
# 1 2015-01-20  213.  211.     -1      0 -                    100
# 2 2015-01-21  211.  227.      7      1 -                    100
# 3 2015-01-22  227.  233.      3      0 buy+sell             103
# 4 2015-01-23  234.  233.      0      0 -                    103
# 5 2015-01-24  233.  248.      7      1 -                    103
# 6 2015-01-25  247.  254.      3      0 buy+sell             106
# 7 2015-01-26  254.  273.      8      1 -                    106
# 8 2015-01-27  273.  263.     -4      0 buy+sell             102
# 9 2015-01-28  263.  234.    -11      0 -                    102
#10 2015-01-29  233.  234.      0      0 -                    102
...