2017-11-23 4 views
1

입/퇴장 날짜 사이의 주식 시장 위치의 일일 변동을 계산할 방법을 찾고 있습니다. 예를 들어 나는 매일 Daily market price 에 따라 가격 변화 내가 두 데이터가 merge(df1,df2,all=T) 프레임하지만 동시에 구입과 날짜를 판매 고려하고 merge 싶습니다이 무엇인지 가격 967.4202/19/08에서 가격 951.84 및 출구에서 02/06/08에 입력하면 그 사이의 변화를 계산하라.진입 출구 신호에서 시가 변경

>DailyMarketPrice 

date  price 
01/21/08 917.75 
01/22/08 955.93 
01/23/08 921.28 
01/24/08 958.55 
01/25/08 961.69 
01/28/08 949.08 
01/29/08 956.97 
01/30/08 951.14 
01/31/08 949.04 
02/01/08 976.43 
02/04/08 976.46 
02/05/08 945.63 
02/06/08 951.84 
02/07/08 925.87 
02/08/08 920.76 
02/11/08 911.39 
02/12/08 945.41 
02/13/08 949.05 
02/14/08 950.84 
02/15/08 938.79 
02/18/08 962.13 
02/19/08 967.42 


>signals 

date Cond 
01/21/08 Buy 
01/22/08 Sell 
02/06/08 Buy 
02/19/08 Sell 

답변

1

불행히도, 나는 당신을 위해 뭔가를 처리할만한 것을 마련하기에 충분한 패키지에 익숙하지 않습니다. 그러나 여기서 거래되는 자산은 하나뿐이므로 무언가를 코드하는 것은 간단합니다. 이것은 당신이 찾고있는 결과물입니까?

DailyMarketPrice <- do.call(rbind, list(
    data.frame(date = "01/21/08", price = 917.75), 
    data.frame(date = "01/22/08", price = 955.93), 
    data.frame(date = "01/23/08", price = 921.28), 
    data.frame(date = "01/24/08", price = 958.55), 
    data.frame(date = "01/25/08", price = 961.69), 
    data.frame(date = "01/28/08", price = 949.08), 
    data.frame(date = "01/29/08", price = 956.97), 
    data.frame(date = "01/30/08", price = 951.14), 
    data.frame(date = "01/31/08", price = 949.04), 
    data.frame(date = "02/01/08", price = 976.43), 
    data.frame(date = "02/04/08", price = 976.46), 
    data.frame(date = "02/05/08", price = 945.63), 
    data.frame(date = "02/06/08", price = 951.84), 
    data.frame(date = "02/07/08", price = 925.87), 
    data.frame(date = "02/08/08", price = 920.76), 
    data.frame(date = "02/11/08", price = 911.39), 
    data.frame(date = "02/12/08", price = 945.41), 
    data.frame(date = "02/13/08", price = 949.05), 
    data.frame(date = "02/14/08", price = 950.84), 
    data.frame(date = "02/15/08", price = 938.79), 
    data.frame(date = "02/18/08", price = 962.13), 
    data.frame(date = "02/19/08", price = 967.42) 
)) 

signals <- setNames(as.data.frame(matrix(c(
    "01/21/08", "Buy", 
    "01/22/08", "Sell", 
    "02/06/08", "Buy", 
    "02/19/08", "Sell" 
), ncol = 2, byrow = TRUE)), c("date", "Cond")) 

# Set `inv.change` to `+1` on "Buy" days, `-1` on "Sell" days and `0` on every 
# day without a transaction. 
merged <- cbind(DailyMarketPrice, inv.change = c(+1, -1, 0)[match(signals$Cond[match(DailyMarketPrice$date, signals$date)], c("Buy", "Sell", NA))]) 
# Set `inventory` to 0 on "Buy" days, 1 on "Sell" days, and 1 on every day 
# between "Buy" and "Sell" days. 
merged$inventory <- head(diffinv(merged$inv.change), -1) 
# Mark-to-market the inventory positions by calculating change in prices during 
# holding periods. 
merged$pnl.change <- merged$inventory * c(0, diff(merged$price)) 
# Record the cumulative P&L. 
merged$pnl <- tail(diffinv(merged$pnl.change), -1) 
print(merged) 
: 그렇다면

date price inv.change inventory pnl.change pnl 
01/21/08 917.75   1   0  0.00 0.00 
01/22/08 955.93   -1   1  38.18 38.18 
01/23/08 921.28   0   0  0.00 38.18 
01/24/08 958.55   0   0  0.00 38.18 
01/25/08 961.69   0   0  0.00 38.18 
01/28/08 949.08   0   0  0.00 38.18 
01/29/08 956.97   0   0  0.00 38.18 
01/30/08 951.14   0   0  0.00 38.18 
01/31/08 949.04   0   0  0.00 38.18 
02/01/08 976.43   0   0  0.00 38.18 
02/04/08 976.46   0   0  0.00 38.18 
02/05/08 945.63   0   0  0.00 38.18 
02/06/08 951.84   1   0  0.00 38.18 
02/07/08 925.87   0   1  -25.97 12.21 
02/08/08 920.76   0   1  -5.11 7.10 
02/11/08 911.39   0   1  -9.37 -2.27 
02/12/08 945.41   0   1  34.02 31.75 
02/13/08 949.05   0   1  3.64 35.39 
02/14/08 950.84   0   1  1.79 37.18 
02/15/08 938.79   0   1  -12.05 25.13 
02/18/08 962.13   0   1  23.34 48.47 
02/19/08 967.42   -1   1  5.29 53.76 

, 여기에 내가 DailyMarketPricesignals을 병합하는 데 사용되는 코드는