2012-01-11 14 views
6

यह प्रश्न this one की निरंतरता है।स्टॉक मूल्य डेटा में मोड़ों की पहचान कैसे करें

मेरा लक्ष्य स्टॉक मूल्य डेटा में मोड़ों को ढूंढना है।

अब तक मैं:

समतल मूल्य सेट, Dr. Andrew Burnett-Thompson केंद्रित पाँच सूत्रीय विधि का उपयोग कर की मदद से फर्क की कोशिश की, के रूप में समझाया here

मैं डेटा सेट को चिकनाई के लिए टिक डेटा के ईएमए 20 का उपयोग करता हूं।

चार्ट पर प्रत्येक बिंदु के लिए मुझे पहला व्युत्पन्न (डीई/डीएक्स) मिलता है। मैं मोड़ के लिए एक दूसरा चार्ट बनाते हैं। हर बार dy/dx [-some_small_value] और [+ some_small_value] के बीच होता है - मैं इस चार्ट में एक बिंदु जोड़ता हूं।

समस्याएं हैं: मुझे असली मोड़ नहीं मिलते हैं, मुझे कुछ करीब मिलता है। मुझे बहुत कुछ या बहुत कम अंक मिलते हैं - [some_small_value]

मैंने डीआई/डीएक्स नकारात्मक से सकारात्मक में बदलते समय एक बिंदु जोड़ने की दूसरी विधि की कोशिश की, जो बहुत सारे अंक भी बनाता है, शायद क्योंकि मैं ईएमए का उपयोग करता हूं टिक डेटा (और 1 मिनट की बंद कीमत का नहीं)

डेटा सेट को एन बिंदुओं के स्लाइस में विभाजित करने और न्यूनतम और अधिकतम अंक खोजने के लिए एक तीसरी विधि है। यह ठीक काम करता है (आदर्श नहीं), लेकिन यह लगी हुई है।

किसी के पास कोई बेहतर तरीका है?

मैं उत्पादन के 2 चित्रों संलग्न (1 व्युत्पन्न और n अंक न्यूनतम/अधिकतम)

enter image description here enter image description here

+1

यह टैग "ग्राफ-एल्गोरिदम" क्यों है? – harold

+0

@harold मेरा अनुमान है कि वह एक एल्गोरिदम चाहता है, और इनपुट डेटा को दबाया जा सकता है (ऊपर देखें)। ; डी एक और गंभीर नोट पर, यह स्पष्ट रूप से ग्राफ एल्गोरिदम नहीं है। – Patrick87

+0

टैग हटा दिया गया है, अब क्या आपको पता है कि इसे कैसे हल किया जाए? : डी धन्यवाद – Yaron

उत्तर

4

आप खाते में दूसरा व्युत्पन्न ले सकता है, जिसका अर्थ है आप चाहिए अतिरिक्त (अपने पहले व्युत्पन्न करने के लिए) (y_{i-1} + y_{i+1} - 2y_i)/(dx)² का मूल्यांकन करें। यदि यह एक निश्चित दहलीज से ऊपर है तो आपके पास अधिकतम है, यदि यह नीचे है तो आपके पास न्यूनतम है और अन्यथा आप इसे छोड़ सकते हैं। यह एक्स्ट्रेमा (y' = 0) खोजने की आपकी पद्धति का उपयोग करके बहुत सारे अंक फेंकना चाहिए, क्योंकि यह स्थिति सैडल पॉइंट्स के लिए भी मान्य है।

1

यहां एक विचार है, एक अलग कोण से एक विचार, और संभवतः एक बहुत बुरा विचार है, लेकिन क्योंकि भेदभाव काम नहीं कर रहा है, ऐसा कुछ ऐसा विचार हो सकता है।

सबसे पहले, आपको न्यूनतम अर्थपूर्ण एक्स-अक्ष अंतराल निर्धारित करने की आवश्यकता है। आपकी आकृति में, यदि आप इसे बहुत छोटे होने के लिए लेते हैं, तो आपको बाधाओं से झूठे सकारात्मक मिलेगा। यह अवधारणात्मक रूप से आपके डेटा को चिकनाई करने के विचार के समान है। इस अंतराल डीएक्स को बुलाओ।

अगला, आकार डीएक्स की एक स्लाइडिंग विंडो का उपयोग करके, आपके वक्र के अनुरूप एक चलती औसत वक्र उत्पन्न करता है। ऐसा करने के बारे में आप सोच सकते हैं कि कई अलग-अलग तरीके हैं (सांख्यिकीय आउटलायर को हटाने के लिए, या खिड़की में अधिक या कम अंक का उपयोग करने के लिए)। इस वक्र जी (एक्स), और अपने मूल वक्र एफ (एक्स) पर कॉल करें। इसके अतिरिक्त, एक वक्र एच (एक्स) बनाएं जो स्लाइडिंग विंडो में डेटा की विविधता का कुछ उपाय देता है जिसका उपयोग आप जी (x) की गणना करने के लिए करते हैं (यदि आप अंतराल से कुछ बिंदुओं का उपयोग कर रहे हैं तो मानक विचलन ठीक काम करना चाहिए)।

अब, फॉर्म c_m (x) = | f (x) - g (x) के घटते वक्र शुरू करें। - एम * एच (एक्स)। आप एम = 1 से शुरू कर सकते हैं।कोई बिंदु x जिसके लिए c_m (x) सकारात्मक है स्थानीय स्थानीय/अधिकतम के लिए उम्मीदवार हैं। आप कितने हिट प्राप्त करते हैं, इस पर निर्भर करते हुए, आप एम को बढ़ाने या घटाने शुरू कर सकते हैं। आप इसे बाइनरी खोज के समान तरीके से कर सकते हैं: यदि आप अधिक अंक चाहते हैं, तो m = (min + m)/2 बनाएं, और यदि आप कम अंक चाहते हैं, तो m = (max + m)/2 (न्यूनतम समायोजन करें और तदनुसार अधिकतम)।

तो यहां मैं जो सुझाव दे रहा हूं उसका एक उदाहरण यहां दिया गया है। मान लीजिए कि हम आगामी श्रृंखला करते हैं:

f(x) = [ 1, 2, 4, 3, 2, 3, 6, 7, 8, 7, 
      5, 4, 3, 2, 2, 3, 2, 3, 5, 8, 9] 

हम चुनें dx = 5. हम (x) के आसपास तथ्यों की एक सरल औसत निकालकर ग्राम का निर्माण:

g(x) = [2.3, 2.5, 2.4, 2.8, 3.6, 4.2, 5.2, 6.2, 6.6, 6.2, 
     5.4, 4.2, 3.2, 2.8, 2.4, 2.4, 3.0, 4.2, 5.4, 6.3, 7.3] 

h(x) = [1.2, 1.1, 1.0, 0.7, 1.4, 2.4, 2.3, 1.7, 1.0, 1.5, 
     1.9, 1.7, 1.2, 0.7, 0.5, 0.6, 1.1, 2.1, 2.7, 2.4, 1.7] 
मीटर के साथ

= 1 हम प्राप्त करें:

c(x) = [0.1, xxx, 0.6, xxx, 0.2, xxx, xxx, xxx, 0.4, xxx, 
     xxx, xxx, xxx, 0.1, xxx, 0.0, xxx, xxx, xxx, xxx, 0.0] 

ऐसा लगता है कि वास्तव में काफी अच्छा काम किया है। विचार साझा करने के लिए स्वतंत्र महसूस करें। ध्यान दें कि यह औसत मूल्य प्रमेय दिया गया है, भेदभाव के बराबर कम या कम हो सकता है।

+0

क्या आप विस्तार कर सकते हैं कि आप वास्तव में एफ (x) से g (x) से कैसे जा रहे हैं? एफ (एक्स) और जी (एक्स) में डेटा पॉइंट्स की संख्या समान है, इसलिए मुझे नहीं लगता कि यह एक आसान चलती औसत कैसे हो सकता है? – Ivan

+0

आह, मैं देखता हूं, यह एक चलती मतलब है। – Ivan

1

यह काम करता है Patrick87, धन्यवाद। बाद जावा समारोह को लागू करने के लिए एक ही कर रहे हैं:

StockPrices मान लें है कुंजी की तारीख और मूल्य StockPrice का एक नक्शा (कीमत, औसत जहां एक्स = 5)

निजी डबल getCx (StockPrices stockPrices, LOCALDATE executionDate, पूर्णांक एक्स, डबल एम) { वापसी Math.abs (getFx (स्टॉकप्रिसेस, निष्पादन दिनांक) - getGx (स्टॉकप्रिसेस, निष्पादनडेट)) - एम * getHx (स्टॉकप्रिसेस, निष्पादनडेट, एक्स); }

private double getGx(StockPrices stockPrices, LocalDate executionDate) { 
    return stockPrices.getAvg(executionDate, 5); 
} 

private double getFx(StockPrices stockPrices, LocalDate executionDate) { 
    return stockPrices.getPrice(executionDate); 
} 

public double getHx(StockPrices stockPrice, LocalDate localDate, int x) { 
    //standard deviation 
    return Math.sqrt(getVariance(stockPrice, localDate, x)); 
} 

private double getVariance(StockPrices stockPrice, LocalDate localDate, int x) { 
    double sum = 0; 
    int count = 0; 
    for (int i = - (x/2); i <= (x/2) ; i++) { 
     LocalDate date = localDate.with(BusinessDay.add(localDate, i, stockPrice.getPriceMap(), 2)); 
     double avg = stockPrice.getAvg(date, 5); 
     double price = stockPrice.getPrice(date); 
     if (price != 0.0) { 
      sum += Math.pow((price - avg), 2); 
      count++; 
     } 
    } 
    return sum/count; 
} 
+0

क्या आप पूरा स्रोत प्रदान कर सकते हैं? कुछ कार्यान्वयन गायब हैं। – endeffects

संबंधित मुद्दे