2017-02-08 8 views
2

Я хочу рассчитать еженедельную доходность взаимного фонда из временных рядов суточных цен. Мои данные выглядит следующим образом:Расчет еженедельных возвратов из ежедневных рядов цен

A  B  C  D  E 
DATE  WEEK W.DAY MF.PRICE WEEKLY RETURN 
02/01/12 1 1  2,7587 
03/01/12 1 2  2,7667 
04/01/12 1 3  2,7892 
05/01/12 1 4  2,7666 
06/01/12 1 5  2,7391 -0,007 
09/01/12 2 1  2,7288 
10/01/12 2 2  2,6707 
11/01/12 2 3  2,7044 
12/01/12 2 4  2,7183 
13/01/12 2 5  2,7619 0,012 
16/01/12 3 1  2,7470 
17/01/12 3 2  2,7878 
18/01/12 3 3  2,8156 
19/01/12 3 4  2,8310 
20/01/12 3 5  2,8760 0,047 

Дата является (уу дд/мм /) формат и «» десятичный разделитель. Это можно сделать, используя эту формулу: (Цена за последний рабочий день - Цена за первый рабочий день)/(Цена за первый рабочий день). Например, доход на первую неделю составляет (2,7391 - 2,7587)/2,7587 = -0,007, а для второго - (2,7619-2,7288)/2,7288 = 0,012.

Проблема в том, что этот список можно найти в течение года, а некоторые недели имеют менее пяти рабочих дней из-за праздников или по другим причинам. Поэтому я не могу просто скопировать и вставить формулу выше. Я добавил дополнительные два столбца для номера недели и дня недели, используя функции WEEKNUM и WEEKDAY, подумал, что это может помочь. Я хочу, чтобы автоматизировать это с помощью формулы или с помощью VBA и в надежде получить таблицу, как это:

WEEK RETURN 
1  -0,007 
2  0,012 
3  0,047 
.  
.  
.  

Как я уже говорил несколько недель меньше, чем пяти будней, некоторые начинают с будним днем ​​2 или заканчиваться будним днем ​​3 и т.д. из-за праздников или по другим причинам. Поэтому я подумываю о том, чтобы сказать excel, чтобы «найти цены, которые соответствуют максимальному и минимальному будни недели каждой недели и применять формулу (Цена за последний рабочий день - Цена за первый рабочий день)/(Цена за первый рабочий день)» ,

Извините за длинный пост, я постарался быть как можно более ясным, я был бы признателен за любую помощь! (У меня есть 5 отдельных рабочих листов в течение последовательных лет, каждый с ежедневными ценами на 20 паевых инвестиционных фондов)

ответ

2

Чтобы сделать это в одной формуле:

=(INDEX(D:D,AGGREGATE(15,6,ROW($D$2:$D$16)/(($C$2:$C$16=AGGREGATE(14,6,$C$2:$C$16/($B$2:$B$16=G2),1))*($B$2:$B$16=G2)),1))-INDEX(D:D,MATCH(G2,B:B,0)))/INDEX(D:D,MATCH(G2,B:B,0)) 

Вы, возможно, потребуется изменить все , к ; за ваши местные настройки.

enter image description here

+0

Спасибо @Scott Craner, ты спас мне много времени. Я был бы признателен, если бы вы могли проверить внесенное мной изменение на мой вопрос. – orkanoid

+0

Не меняйте вопрос после получения ответа. Создайте новый вопрос. Он открывает текущие ответы для голосов. @orkanoid –

+0

О, извините, не знал этого. Должен ли я удалить редактирование и создать новый вопрос сейчас, или это слишком поздно? – orkanoid

1

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

результирующей таблице:

H I   J   K   L   M  
    first  last  first val last val return 
1 02.01.2012 06.01.2012 2,7587  2,7391  -0,007 
2 09.01.2012 13.01.2012 2,7288  2,7619  0,012 
3 16.01.2012 20.01.2012 2,747  2,876  0,047 

Формула в колонке I:

=MINIFS($A:$A;$B:$B;$H2) 

Fomula в колонке J:

=MAXIFS($A:$A;$B:$B;$H2) 

Формула в столбце K:

=VLOOKUP($I2;$A:$D;4;FALSE) 

формула в колонке L:

=VLOOKUP($J2;$A:$D;4;FALSE) 

формула в колонке M:

=(L2-K2)/K2 
+0

FWIW: MINIFS и MAXIFS доступны только на Office 365 Excel. Если нет, вам нужно будет использовать AGGREGATE или ARRAY MAX (IF()). Кроме того, поскольку ни одна из них не является формулой массива, вы можете использовать полные ссылки на столбцы. Последняя записка. Замените 'WRONG' в четвертом критерие VLOOKUP на' FALSE'. –

+0

@ScottCraner thx для уточнения. Извините за «НЕПРАВИЛЬНЫЙ», он проскользнул во время перевода на английский язык. – pintxo

+0

Думаю, я не могу использовать функцию MINIFS. Не дает мне #NAME? ошибка. Как использовать функции AGGREGATE и ARRAY MAX (IF()) @ScottCraner? – orkanoid