애들센스


dated 클래스에 approximate_date()함수추가 C/C++

dated 클래스를 가지고 놀다보니 백테스팅을 할 때 필요한 것이 하나 생각 났습니다. 가령 t0시점에서 3개월후 주가를 쓰려면 add_months()함수를 이용하여 구하면 됩니다. 그러나 그 날짜가 토/일/공휴일이라면 분명 주가는 없겠죠. 따라서 존재하는 비슷한 날짜의 것을 가져다 써야 합니다. 그래서 근사값을 구하 듯 해당날짜와 가까운 날짜(여기선 이후 날짜로만 검색)를 검색하여 주가를 가져올 필요가 있습니다.

그래서 주어진 날짜와 가장 가까운 날짜를 돌려주는 approximate_date()를 10% 국산기술로 만들어 dated클래스의 멤버함수로 추가하였습니다.
template <class T> date dated<T>::approximate_date(const date& indate) const{
date d=indate;
if (!d.valid()) return date();
if (d<=first_date()) return first_date();
if (d>=last_date()) return last_date();
while(!binary_search(dates_.begin(),dates_.end(),d)){
if(d++>=last_date()) return last_date();
}
return d;
}
이제 제대로 작동하는 지 확인해볼까요?
cout<<"approximate date of '2001-12-08'? "<<dd.approximate_date(date(20011208))<<endl;
2001년 12월 8일은 토요일이라 월요인인 12월 10일에 데이터가 있습니다. 따라서 위의 함수는 '20011210'을 돌려 줍니다. 이번엔 각각에 대해 3개월이후 날짜를 구하고 혹시 그 날짜가 없다면 다시 거기서 가까운 날짜를 구하는 것을 해볼까요?
int main()
{
char* filename="skt.txt";
long yymmdd,price;
dated<long> dd;

ifstream inf(filename);

if(inf.fail())
{
cout<<"Cannot open input file."<<endl;
return 1;
}

while(inf>>yymmdd>>price)
dd.insert(date(yymmdd),price);

for(int i=0;i<dd.size();i++){
date d=dd.approximate_date(add_months(dd.date_at(i),3));
if (d>=dd.last_date()) break;
cout<<dd.date_at(i)<<": "<<dd.element_at(i)
<<"\t"<<d<<": "<<dd.element_at(d)<< endl;
}
inf.close();
return 0;
}

1-2 컬럼이 raw데이터의 내용이고, 3-4 컬럼이 3개월후의 날짜와 종가입니다.

덧글

댓글 입력 영역