5

Mathematica에서 시계열 데이터의 지역 최소 점과 최대 점을 확인하는 방법이 필요합니다. 이것은 쉬운 일이되어야하는 것처럼 보이지만 까다로워집니다. 나는 이것을 MathForum에 올렸지 만, 여기에 좀 더 눈을 뜰 수도 있다고 생각했습니다.Mathematica를 사용하여 시계열에서 중요한 최소 점과 최대 점을 확인하십시오.

당신의 문제에 대해 설명 종이 찾을 수 있습니다 내가 지금까지 시도했습니다 http://www.cs.cmu.edu/~eugene/research/full/compress-series.pdf

을 ...

가져 오기 및 일부 데이터 형식 :

data = FinancialData["SPY", {"May 1, 2006", "Jan. 21, 2011"}][[All, 2]]; 
data = data/[email protected]; 
data = Transpose[{Range[[email protected]], data}]; 

2 개 함수를 정의 :

첫 번째 방법 :

이제 또 다른 방법 (210), 유연하지 않지만 각 기능이 무엇에

findMinimaMaxima2[data_] := data[[[email protected](Length[#] & /@ Split[Prepend[Sign[[email protected][[All, 2]] - M[email protected][[All, 2]]], 0]])]] 

봐. 우선 findMinimaMaxima2 []는 :

minmax = findMinimaMaxima2[data]; 
{[email protected], [email protected]} 
[email protected] 

이는 약 49 %의 데이터 압축에 (이 경우에) 모든 최소값 및 최대 값과 결과를 선택하지만, 창을 확장하는 유연성이 없다. 이 다른 방법이 있습니다.

minmax2 = findMinimaMaxima[data, 2]; 
{[email protected], [email protected]} 
[email protected] 

그러나 우리는 (60)에 창을 확장 할 때 어떻게되는지 살펴 : 2의 창 적은 틀림없이 더 중요한 극값 산출

minmax2 = findMinimaMaxima[data, 60]; 
ListLinePlot[{data, minmax2}] 

더 이상 대체 최소값과 최대 값의 일부. [] findMinimaMaxima의 출력에 findMinimaMaxima2 [] 적용 은 ...

minmax3 = findMinimaMaxima2[minmax2]; 
ListLinePlot[{data, minmax2, minmax3}] 

을 해결 방법을 제공하지만,이 문제를 해결하기 위해 서투른 방법처럼 보인다.

따라서 고정 된 창을 사용하여 왼쪽 및 오른쪽으로 보는 아이디어는 모든 것을 원하는대로하지 않습니다. 필자는 다음 최소값 또는 최대 값을 설정하기 위해 함수가 충족 시키거나 초과해야하는 범위 값 R (예 : 퍼센트 이동 위 또는 아래)을 사용할 수있는 대안을 생각하기 시작했습니다. 여기 내 첫 번째 시도이다 :

findMinimaMaxima3[data_, R_] := Module[{d, n, positions}, 
    d = data[[All, 2]]; 
    n = Transpose[{data[[All, 1]], [email protected][If[(#2 <= #1 + #1*R && #2 >= #1) || (#2 >= #1 - #1* R && #2 <= #1), #1, #2] &, d[[1]], d]}]; 
    n = Sign[[email protected][[All, 2]] - [email protected][[All, 2]]]; 
    positions = [email protected][Most[Position[n, Except[0]]]]; 
    data[[positions]] 
    ] 

minmax4 = findMinimaMaxima3[data, 0.1]; 
ListLinePlot[{data, minmax4}] 

이 너무과 사후 처리에서 혜택 findMinimaMaxima2 []

ListLinePlot[{data, findMinimaMaxima2[minmax4]}] 

그러나 당신이 자세히 보면, 당신은 그들이 R 값을 넘어 가면이 극단이 골대를 벗어났습니다 볼 차트의 절대 최소값과 최대 값을 비롯하여 큰 위아래로 움직이는 여러 위치가 있습니다. R 값을 변경하면 더욱 상단과 바닥이 골대를 벗어났습니다 방법을 보여줍니다

minmax4 = findMinimaMaxima3[data, 0.15]; 
ListLinePlot[{data, minmax4}] 

그래서, 나는 다시 생각해야합니다. 누구든지 데이터 플롯을보고 중요한 최소 및 최대 값을 쉽게 식별 할 수 있습니다. 그것을하기위한 알고리즘을 얻는 것이 더 어려워 보입니다. 창 및/또는 R 값은 솔루션에 중요하게 보이지만 어느 것도 독자적으로는 충분하지 않습니다 (적어도 위의 방법은 아님).

중요한 미니 마 및 최대를 식별하는 방법을 제시하거나 대안을 제안 할 수 있습니까?

이 코드와 토론이 모두 포함 된 노트북을 전달해 주시기 바랍니다. 아무도 필요 없다면 알려주세요.

내가 반복적 인 방법을 사용하는 것이 좋습니다 Jagra

+0

maxima와 minima의 교체 기준이 가격 변동에 항상 중요한 것은 아닙니다. 여기처럼 http://i.imgur.com/nsIK7.png –

+0

StackOverflow를 환영하고 우리가 일반적으로 여기에서하는 세 가지 사항을 생각 나게 해주십시오 : 1) 도움을 받으면 답변을 주겠다. 귀하의 전문 분야에서 2) ['FAQs'를 읽으십시오.] (http://tinyurl.com/2vycnvr) 3) 좋은 Q & A를 볼 때 [회색 삼각형을 사용하여] 투표하십시오 (http : // i .imgur.com/kygEP.png) 시스템의 신뢰성은 사용자가 자신의 지식을 공유함으로써 얻을 수있는 평판을 기반으로합니다. 또한 문제가있는 경우 문제를 해결하는 대답을 수락하는 것을 잊지 마십시오. [checkmark 기호를 누르십시오] (http://i.imgur.com/uqJeW.png) –

답변

8

, 감사합니다. 다음 기능은 this post에서 가져옵니다, 그들이 컴파일하지 않고 더 간결하게 쓸 수 있지만, 그들은 일을 할 수 있습니다 :

여기
dplot = ListLinePlot[data] 

우리가 줄거리 : 여기

localMinPositionsC = 
Compile[{{pts, _Real, 1}}, 
    Module[{result = Table[0, {Length[pts]}], i = 1, ctr = 0}, 
    For[i = 2, i < Length[pts], i++, 
    If[pts[[i - 1]] > pts[[i]] && pts[[i + 1]] > pts[[i]], 
     result[[++ctr]] = i]]; 
    Take[result, ctr]]]; 

localMaxPositionsC = 
    Compile[{{pts, _Real, 1}}, 
    Module[{result = Table[0, {Length[pts]}], i = 1, ctr = 0}, 
     For[i = 2, i < Length[pts], i++, 
     If[pts[[i - 1]] < pts[[i]] && pts[[i + 1]] < pts[[i]], 
      result[[++ctr]] = i]]; 
     Take[result, ctr]]]; 

이 데이터 플롯이다

mins = ListPlot[Nest[#[[localMinPositionsC[#[[All, 2]]]]] &, data, 3], 
    PlotStyle -> Directive[PointSize[0.015], Red]] 

맥시 대해 동일한 :

012 3 번 반복 한 후에 얻어지는 분,

그리고 결과 플롯 :

Show[{dplot, mins, maxs}] 

enter image description here

당신은 더-거친 나뭇결이나 미세한 최소값/최대 값을 얻기 위해, 반복의 수를 다를 수 있습니다.

는 편집 :

사실, 난 그냥 포인트의 몇 여전히 최소값과 최대 값 모두이 방법으로 누락 된 것으로 나타났습니다. 그래서 저는 이것을 완전한 해결책이 아닌 출발점으로 제안합니다. 아마도 은 다른 반복에서 나오는 minima/maxima를 분석 할 수 있으며, 때로는 "이전"의 더 세분화 된 것을 포함 할 수도 있습니다. 또한 이러한 종류의 작품이 취할 수있는 유일한 "물리적 인 이유"는 금융 데이터의 성격이 몇 가지 명백하게 다른 척도와 함께 프랙탈처럼 보입니다. 위의 Nest-s의 각 반복은 특정 척도를 대상으로합니다. 이것은 임의의 신호에 대해서는 잘 작동하지 않습니다.

+0

Leonid - 솔루션에 대해 많은 감사를드립니다. 두 가지 빠른 질문 : 1. 컴파일 된 함수에서 "_Real"을 사용하는 것에 익숙하지 않습니다. 그것이 무엇을 설명 할 수 있습니까? 2. Mathematica에서 무엇이든 매번 저의 책 "Mathematica Programming : Advanced Introduction"의 pdf 파일을 열어두면, 왜 localMinPositionsC와 localMaxPositionsC에서 for 루프가 가장 좋은지 느낀 이유에 대해 의견을 말할 수 있을지 궁금합니다. 당신의 책에서 종종 옹호하는 것처럼보다 기능적인 접근 방식에 비해이 상황에서의 선택은 무엇입니까? 다시 한번 많은 감사합니다. – Jagra

+0

@Jagra - _Real은 유형을 선언하는 데 사용됩니다. 이것은 어떤 계급 - 벡터, 행렬 등의 텐서 인 인수에 필요합니다.이 특별한 경우에, 우리는 실제 벡터 (계급 1의 텐서)가 필요했습니다. 문서에서 좋은 예를 찾을 수 있습니다.Compile 사용법에 관해서는 맞습니다 - 빠른 기능성 라이브러리를 작성하고 테스트 할 시간이 없었습니다. 그리고 내가 사용했던 원래 문제 (링크 된 것)에서 속도가 중요했습니다. 귀하의 경우,이 계산을 위해 충분히 빠르지 만 Partition을 사용하여 무언가를 쓸 수 있어야합니다. –

+0

알았습니다. 다시 한번 감사드립니다. – Jagra