我从1983年到2010年有5分钟频率的S& P500数据。 给定矩阵作为[日期时间价格返回]被激活。 日期和时间的更多细节描述如下: 数据:yyyymmdd 时间:hhmm
我想按周编号对给定数据进行排序。 更具体地说,我想标记每列的周数。 我知道'weeknum'功能,但只是使用该功能有两个问题 实现我的目的。 一,它返回一年中的周数。因此,1986.12.31标记为53,而1987.1.1标记为1,尽管两天属于同一周。 二,我想累积基于周的标签。如果1986.12.31标记为53,1987.1.1需要标记为105。
答案 0 :(得分:0)
假设任意开始日期为1/1/1983(假设您使用的是datetime变量),则需要在weekn周围编写一个包装器来处理1月1-4场景的边缘情况。
最糟糕的情况是,1月第一周的大部分时间可能是前一年的交易周,如果12月31日周一下跌,1月1日到4月是周二到周五(尽管新年是一天) S& P的交易假期。再假设1月1日是星期一,这是一个新的一周,你想要做的快速而肮脏的例子如下所示
function weekcounter=edgecases(dateinput)
if (month(dateinput)==1 & (day(dateinput)<4)) % only care about those first 4 days in January, otherwise weeknum works as advertised.
if 2<weekday(dateinput)&& weekday(dateinput)<7
weekcounter= weeknum(dateshift(dateinput-calmonths(1),'end','month')) % make sure this matches the last day of the previous month
end
else
weekcounter=weeknum(dateinput)
end
end
测试代码显示以下
>> edgecases(datetime([1986 1 1]))
ans =
53
>> edgecases(datetime([1986 1 4]))
ans =
1
>> edgecases(datetime([1986 1 3]))
ans =
53
>> edgecases(datetime([1987 1 3]))
ans =
1
>> edgecases(datetime([1987 1 2]))
ans =
53
计算完给定的周数后,请执行@Trogdor建议的累积周数。
当然,这也预先假定你的日期变量已经删除了交易假期等。
答案 1 :(得分:0)
如果inputdates是日期时间向量:
previousSundays = dateshift(inputdates,'dayofweek','Sunday','previous');
weekCount = findgroups(previousSundays); % a vector of same size as inputdates