Տվյալների պատկերացում

Ժամանակային շարքի տվյալների վիճակագրական մոդելավորում Մաս 2. Հետախուզական տվյալների վերլուծություն

Հոդվածների այս շարքում S&P 500 շուկայական ինդեքսը վերլուծվում է հանրաճանաչ վիճակագրական մոդելի միջոցով՝ SARIMA(Սեզոնային ավտոռեգեսիվ ինտեգրված շարժվող միջին) և GARCH(Ընդհանրացված ավտոմատ ռեգրեսիվ պայմանական հետերոսկեդաստիկություն):

Առաջին մասում այս հոդվածաշարում օգտագործված տվյալները՝ S&P 500 Prices (որը նշված է որպես spx փոխադարձաբար), հանվել է yfinance API-ից: Սերիան նկարագրում է յուրաքանչյուր աշխատանքային օր 1994–01–06_________________________________________________ օրերի ընթացքում: Այն մաքրվեց և օգտագործվեց շուկան ուսումնասիրելու համար օգտագործվող երկու այլ շարքեր ստանալու համար.

Այս երկրորդ մասում նախապես մշակված ժամանակային շարքերը պատկերացվում և ուսումնասիրվում են՝ հասկանալու համար ցանկացած միտում, կրկնվող օրինաչափություններ և/կամ այլ բնութագրեր, որոնք հետագայում կարող են օգտագործվել շարքը մոդելավորելու և ապագա արժեքները կանխատեսելու համար (հետագա բաժիններում): Այս հոդվածում օգտագործված կոդը այս պահեստում գտնվող Visualization and EDA.ipynbնոթատետրից է:

Բովանդակություն

  1. Տվյալների ներմուծում
  2. Նախնական գծային հողամասեր
  3. Ժամանակային շարքերի տվյալների բաժանում Train-Test հավաքածուների մեջ
  4. Տարեկան միտումների ուսումնասիրություն՝ օգտագործելով Box Plots
  5. Տվյալների բաշխում
  6. Տվյալների տարրալուծում (հավելումային և բազմապատկիչ)
  7. Ժամանակային շարքերի հարթեցում (շարժվող միջիններ)
  8. Հարաբերակցության սխեմաներ (ACF և PACF)
  9. Ստացիոնարության ստուգում
  10. Եզրակացություն
  11. Այս շարքի այլ մասերի հղումներ
  12. Հղումներ

Տվյալների ներմուծում

Նախքան որոնումը սկսելը, նախ ներմուծենք նախապես մշակված տվյալները վերջին մասից։ Տվյալները քերծվել են yfinance API-ից python-ում: Այն պարունակում էր S&P 500 բաժնետոմսերի գների տվյալները 1994–01–06-ից 2020–08–30: Այնուհետև տվյալները մաքրվեցին (բացակայող արժեքի լրացում) և օգտագործվեցին 2 նոր շարքեր ստեղծելու համար՝ վերադարձներ և անկայունություն: Այսպիսով, վերջնական տվյալների բազան ունի հետևյալ 3 սյունակները՝ spx (S&P 500 գներ), spx_ret (S&P 500 վերադարձներ) և spx_vol (S&P 500 Volatility): Տվյալները պատրաստելու համար տես 1-ին մասը կամ ներբեռնիր data.csv ֆայլը այս պահեստից:

Նախ, մենք ներմուծում ենք բոլոր ստանդարտ գրադարանները, որոնք օգտագործվում են գրեթե ցանկացած վերլուծության համար, օգտագործելով python: sns.set() ֆունկցիան պարզապես թեմա է ավելացնում matplotlib.pyplot-ի կողմից պատրաստված սյուժեներին: Դա բացառելը կհանգեցնի միայն մի քանի ոճային փոփոխությունների:

read_csv() ֆունկցիան ընդունում է ֆայլի ուղին որպես արգումենտ (այս դեպքում “data.csv”) և պահպանում է արդյունքը՝ pandas DataFrame: Քանի որ Date սյունակը պահվում է որպեսobject տվյալների տեսակ (կամ string), to_datetime() ֆունկցիան pandas-ում օգտագործվում է ամսաթվերը datetime ձևաչափի փոխարկելու համար: Երբ դա արվի, մենք կարող ենք սահմանել այս տվյալների շրջանակի ամսաթվերը որպես դրա ինդեքս՝ օգտագործելով set_index() ֆունկցիան: Սա շատ ավելի ինտուիտիվ կդարձնի ինդեքսավորումը և հատվածը: inplace = True արգումենտը հանձնարարում է pandas-ին կատարել այս գործողությունը նույն տվյալների շրջանակում, այլ ոչ թե տվյալների շրջանակի պատճենված տարբերակի վրա: Առանց այս փաստարկի, փոփոխությունները չեն արտացոլվի սկզբնական data տվյալների շրջանակում: Եվ վերջապես, data.head() ֆունկցիան պարզապես ցուցադրում է տվյալների շրջանակի առաջին 5 տողերը (ինչպես ցույց է տրված վերևի նկարում):

Նախնական գծային հողամասեր

Simple Line սյուժեները ժամանակի ընթացքում սերիալի միտումը պատկերացնելու հիանալի միջոց են: Ընդհանուր առմամբ, գծային գծապատկերների համար (և այս հոդվածի այլ սյուժեների համար) x-առանցքը ներկայացնում է ժամանակը, իսկ y-առանցքը ներկայացնում է շարքը:

plt.rcParams[“figure.figsize”]-ն օգտագործվում է նկարի չափը սահմանելու համար: Այն ակնկալում է ուրվագիծ՝ գործչի երկարությամբ և բարձրությամբ հետևյալ կերպ՝ (երկարություն, բարձրություն): plt.subplots()-ն օգտագործվում է նկարի ներսում մի քանի հողամասեր կառուցելու համար: Նկարների կոնտեյները պահվում է այս ֆունկցիայի առաջին ելքում (այս դեպքում fig), իսկ երկրորդ ելքում (այս դեպքում ax) պահվող սյուժեների դիրքը: (1, 3) արգումենտը սահմանում է, որ մեկ տողում կա 3 ենթահող: 3 ենթահողերը հասանելի են՝ ինդեքսավորելով ax փոփոխականը: Այսպիսով, ax[0].plot() այն գծագրելու է plot() մեթոդով նշված շարքը առաջին ենթահողում և նմանապես ax[1]-ի և ax[2]-ի համար: set_title() ֆունկցիան թույլ է տալիս մեզ վերնագիր դնել ենթահողերի վրա: legend() ֆունկցիան մեզ հնարավորություն է տալիս ցույց տալ պիտակները սյուժեում: Պիտակի տեքստը նշված է plot() ֆունկցիայի մեջ որպես label արգումենտ: Եվ վերջապես, plt.show()-ը ցուցադրում է ելքը առանց Jupyter Notebook-ի լրացուցիչ տեքստի: Առանց դրա, Jupyter Notebook-ի նման միջավայրում կարող է տեսանելի լինել որոշակի տեքստ հենց սյուժեից առաջ:

Այս գծապատկերները ցույց են տալիս, որ S&P 500 գները, ընդհանուր առմամբ, աճել են 1994 թվականից ի վեր, 2004 և 2008 թվականներին մոտ 2 խոշոր անկումներով: Եկամուտները բավականին կենտրոնացած են 0-ի շուրջ և ցույց են տալիս բարձր շեղումներ մոտ 2004 և 2008 թվականներին: Նմանապես, անկայունությունը նաև ցույց է տալիս, որ շուկան եղել է: բավականին անկայուն այս 2 ժամանակահատվածում: Ավելի բարձր տատանողականության շրջանը (եկամուտների մեծությունը) ցույց է տալիս այդ ժամանակահատվածում անկայուն շուկայի առկայությունը:

Ժամանակային շարքերի տվյալների բաժանում Train-Test հավաքածուների մեջ

Նախորդ բաժնում կառուցված նախնական սյուժեներից հետո ավելի լավ է, որ տվյալները բաժանենք վերապատրաստման և փորձարկման խմբերի: Դա պայմանավորված է նրանով, որ իրական աշխարհի կանխատեսման խնդիրների մեծ մասում մենք մուտք չենք ունենա ապագա դիտարկումներին: Այսպիսով, իրական աշխարհի խնդիր մոդելավորելու համար մենք պետք է ուսումնասիրենք մեր տվյալների միայն մի հատվածը և օգտագործենք այս գտածոները՝ մոդելներ կառուցելու համար՝ կանխատեսելու մնացած տվյալները: Այսպիսով, նախքան որևէ հետախուզում առաջ շարժվելը, եկեք նախ բաժանենք տվյալները Ուսուցման և Թեստավորման խմբերի:

Թրեյնինգային հավաքածուն կօգտագործվի մոդելի ստեղծման համար: Այնուհետև մոդելը կօգտագործվի փորձարկման տվյալների հավաքածուի արժեքները կանխատեսելու/կանխատեսելու համար, իսկ փորձարկման հավաքածուի իրական դիտարկումները կօգտագործվեն մոդելի կատարողականությունը գնահատելու համար: Երբ մոդելը հասնում է ճշտության ցանկալի մակարդակին, այն օգտագործվում է չտեսնված տվյալների կանխատեսման համար (այսինքն՝ գնացքից դուրս տվյալներ և թեստային հավաքածուներ):

Նշում. Քանի որ մենք օգտագործում ենք փորձարկման հավաքածուն մեր մոդելները գնահատելու և ճշգրտելու համար, այս հավաքածուի համար ավելի լավ և ճշգրիտ տերմինը կլինի Cross-Validation Set: Եվ չտեսնված տվյալները (տվյալներում նկատվածներից հետո ընկած ժամանակահատվածների համար), որոնց համար պետք է ստեղծվեն կանխատեսումները, կկոչվեն որպես թեստավորման հավաքածու: Այնուամենայնիվ, այս հոդվածների շարքում նպատակն է մոդելներ կառուցել և տեսնել դրանց համապատասխանությունը միայն վերապատրաստման և խաչաձեւ վավերացման հավաքածուների վրա: Այսպիսով, պարզության համար օգտագործվում են վերապատրաստման և թեստավորման հավաքածուներ տերմինները:

Այժմ մենք պետք է ընտրենք, թե ինչպես կարելի է բաժանել մեր ունեցած տվյալները վերապատրաստման և թեստավորման խմբերի: Տվյալների գիտության այլ խնդիրներում, ինչպիսիք են դասակարգումը կամ ռեգրեսիան, սովորաբար մենք տվյալները բաժանում ենք 80–20 (80% վերապատրաստման և 20% թեստավորման համար) բաժանման, և դա արվում է պատահականորեն խառնելով տվյալները: Այնուամենայնիվ, ժամանակային շարքերի վերլուծության ժամանակ, եթե մենք խառնում ենք տվյալները, մենք վերացնում ենք տվյալների ժամանակային կախվածությունը: Այսպիսով, նախընտրելի մոտեցումը տվյալների բաժանումն է ժամանակի ինչ-որ պահի: Այս դեպքում մենք տվյալները բաժանում ենք 2 մասի՝ ամեն ինչ մինչև 2019–01–01-ը գնացքի հավաքածուն է, և այս ամսաթվից հետո յուրաքանչյուր դիտարկում՝ թեստային հավաքածու: Այսպիսով, մենք կառուցում ենք մեր մոդելները տվյալների վրա մինչև 2019–01–01 և փորձում ենք կանխատեսել 2019–01–01ից ի վեր դիտարկված տվյալները:

Մինչև 2019–01–01 տվյալները հասանելի են loc ինդեքսավորման օպերատորի միջոցով data տվյալների շրջանակում: Այսպիսով, data.loc[:“2018–12–31”] կոդը պարզապես հանում է data-ի բոլոր սյունակները մեկնարկային ինդեքսից մինչև “2018–12–31” պիտակավորված ինդեքսը, իսկ data.loc[“2019–01–01”:] ծածկագիրը հանում է բոլոր սյունակները “2019–01–01” պիտակավորված ինդեքսից մինչև վերջին ինդեքսը: train_df-ը և test_df-ը համապատասխանաբար պահում են ուսուցման և թեստավորման հավաքածուները: Տպելով այս 2 տվյալների շրջանակներից shape-ը, կարելի է տեսնել, որ մենք ունենք 6518 դիտարկումներ մեր ուսումնական հավաքածուում և 174 դիտարկումներ թեստային հավաքածուում:

Հետագայում բոլոր հետախուզումը կատարվում է գնացքի հավաքածուում՝ train_df

Տարեկան միտումների ուսումնասիրություն՝ օգտագործելով Box Plots

Ըստ Վիքիպեդիայի.

Նկարագրական վիճակագրության մեջ արկղի գծապատկերը կամ արկղային սյուժեն թվային տվյալների խմբերը իրենց քառորդների միջոցով գրաֆիկորեն պատկերելու մեթոդ է:

Եկեք հասկանանք այս սահմանումը իրականում նայելով տուփի սյուժեն.

Տուփի գծապատկերը բնութագրվում է 5 հորիզոնական գծերով, որոնք պիտակավորված են որպես A, B, C, D, և Eվերևի սյուժեում:

  • A.Այս տողը ներկայացնում է տվյալների շտեմարանի առավելագույն արժեքը (բացառությամբ արտանետումների)
  • B.Այս տողը ներկայացնում է 3-րդ քառորդը կամ 75-րդ տոկոսը: Սա տվյալների հավաքածուի վերին կեսի միջինն է
  • C.Այս տողը ներկայացնում է տվյալների հավաքածուի 2-րդ քառորդը կամ 50-րդ տոկոսը: Այլ կերպ ասած, սա ամբողջական տվյալների մեդիանն է
  • D.Այս տողը ներկայացնում է 1-ին քառորդը կամ 25-րդ տոկոսը: Սա տվյալների բազայի ստորին կեսի միջինն է
  • E.Այս տողը ներկայացնում է տվյալների շտեմարանի նվազագույն արժեքը (բացառությամբ արտանետումների)
  • Տվյալների ծայրամասերը գծագրվում են որպես առավելագույն և նվազագույն գծերի վերևում և ներքև կետերով (համապատասխանաբարA և E,)

Այսպիսով, տուփի սխեման կոկիկ կերպով ամփոփում է տվյալների բաշխվածությունը՝ իր արտանետումների հետ միասին: Եկեք յուրաքանչյուր տարվա համար կառուցենք արկղեր spx, spx_ret և spx_vol համար մեր ուսումնական տվյալների բազայում.

Նախ, մենք ավելացնում ենք նոր սյունակ մեր տվյալների բազայում, որը պահպանում է այն տարին, երբ գրանցվել են դիտարկումների համապատասխան շարքը: Սա արվում է՝ օգտագործելով datetime օբյեկտների year հատկանիշը, որոնք սահմանում են train_df-ի ինդեքսը: Տարիների սյունակը պահվում է Year անունով սյունակում՝ train_df-ում: Այնուհետև մենք տեղադրում ենք 3 ենթահող, մեկը մյուսի տակ, և դրանց մեջ գծագրում ենք spx spx_ret և spx_vol տուփերը: Այս սյուժեները կազմելու համար օգտագործվում է pandasboxplot() ֆունկցիան: Ֆունկցիան վերցնում է սյունակը, որն օգտագործվում է column արգումենտի տվյալները գծագրելու համար, և սյունակը, որն օգտագործվում է by արգումենտում գծագրվելիք տվյալները խմբավորելու համար: Այսպիսով, այս դեպքում մենք տվյալները բաժանում ենք ըստ տարվա (օգտագործելով by = “Year”) և այնուհետև գծագրում ենք առանձին տուփերի սյուժեներ յուրաքանչյուր տարվա համար, որը հասանելի է ուսուցման տվյալների բազայում:

Ավելի լայն տուփի առկայությունը ցույց է տալիս, որ այդ տարի դիտված արժեքները լայնորեն ցրվել են: Նմանապես, արտանետումների մեծ թվի առկայությունը նույնպես ցույց է տալիս, որ տվյալ տարում տվյալները մեծ տատանումներ են ունեցել։ Դրանց հիման վրա դժվար չէ նույնականացնել շուկայում տատանումների/անկայունության ավելի բարձր աստիճանով տարիները (օրինակ՝ 2004 և 2008 թվականներին):

Տվյալների բաշխում

Այս բաժնում մենք փորձում ենք հասկանալ S&P 500 գների, վերադարձի և փոփոխականության բաշխվածությունը՝ օգտագործելով խտության կորերը և հիստոգրամները: Տվյալների բաշխումը ցույց կտա արժեքների շրջանակը, որոնք ավելի հաճախ են տեղի ունենում, քան մյուսները, բայց դա կվերացնի ժամանակի գործոնը: Այսպիսով, մենք չենք կարողանա պարզել, թե երբ ենք բախվում որոշակի արժեքի մեր տվյալների բազայում՝ պարզապես նայելով բաշխման սյուժեները:

Ինչպես նախկինում բոլոր սյուժեները, նախ, մենք սահմանում ենք նկարի չափը և սահմանում ենթահողերը: Այնուհետև մենք օգտագործում ենք distplot() ֆունկցիան seaborn-ի խտության կորը գծագրելու համար հիստոգրամի վերևում ֆունկցիայի մեջ փոխանցված շարքի համար: Այնուհետև մենք վերնագիր ենք դնում յուրաքանչյուր ենթահողերի համար (օգտագործելով set_title()) և ցուցադրում ենք դրանք (օգտագործելով plt.show()):

S&P 500-ի գների բաշխումը անորոշ կերպով նորմալ է թվում՝ հետևի եզրին մի քանի մեծ ցատկերով: Այնուամենայնիվ, S&P 500 Returns-ի բաշխումը լիովին նորմալ է թվում՝ գրեթե 0 միջինով: Վերջապես, քանի որ անկայունությունը երբեք բացասական չէ և պարզապես եկամտաբերության մեծությունն է, S&P Volatility-ի բաշխումը խիստ աջ թեքված է (երկար աջ պոչ) Նորմալ բաշխում:

Տվյալների տարրալուծում (հավելումային և բազմապատկիչ)

Տվյալների տարրալուծումը ժամանակային շարքերը 3 բաղադրիչի բաժանելու գործընթաց է՝ Միտում, Սեզոնայնություն, և Աղմուկ: Դա մեզ հնարավորություն է տալիս պատկերացում կազմել մեր տվյալների կրկնվող օրինաչափությունների մասին, որոնք կարող են օգտագործվել մոդելի կառուցման ժամանակ: Python-ում statsmodels գրադարանն օգտագործվում է այս տարրալուծումը կատարելու համար: Գրադարանը ապահովում է տարրալուծման 2 տեսակի աջակցություն՝ Հավելում և Բազմապատկիչ:

Հավելումային տարրալուծման մեջ շարքը ներկայացված է որպես միտումների, սեզոնայնության և աղմուկի գումար, իսկ Multiplicative Decomposition-ում շարքը ներկայացված է որպես այս 3 բաղադրիչների արտադրյալ:

Մաթեմատիկորեն տարրալուծման 2 տեսակները կներկայացվեն հետևյալ կերպ.

Եկեք հիմա նայենք, թե ինչպես դա անել python-ում: Մասնավորապես, հետևյալ բաժինը կօգտագործվի S&P 500 գների վրա հավելումների տարրալուծման համար:

Նախ, մենք ներմուծում ենք seasonal_decompose() մեթոդը statsmodels.tsa.seasonal փաթեթից: Այս ֆունկցիան պահանջում է, որ մենք անցնենք ժամանակային շարքը որպես փաստարկ: Այնուհետև մենք պետք է model հատկանիշը դնենք “additive”՝ շարքը հավելումային բաղադրիչների բաժանելու համար: Այս ֆունկցիայի ելքը պահվում է result փոփոխականում, որը պարզապես գծագրվում է plot() ֆունկցիայի միջոցով: Սա կկազմի 4 գրաֆիկ. Առաջինը ինքնին շարքն է: Երկրորդը Թրենդն է։ Հաջորդը սեզոնային բաղադրիչն է, իսկ վերջին սյուժեն՝ աղմուկը:

Վերոնշյալ սյուժեում սեզոնային բաղադրիչը տարօրինակ է թվում: Այսպիսով, եկեք ուսումնասիրենք այն ավելի մանրամասն: Շարքի ամբողջական սեզոնային բաղադրիչը գծագրելու փոխարեն թույլ տվեք գծագրել դրա միայն առաջին 20 արժեքները:

marker = “o” պարամետրն օգտագործվում է արժեքները գծագրելու և յուրաքանչյուր դիտարկում առանձին նշելու համար՝ ավելի մեծ պարզության համար: Օգտագործելով result.seasonal մենք կարող ենք մուտք գործել քայքայված տվյալների սեզոնային բաղադրիչ: Մյուս բաղադրիչներին կարելի է նմանապես մուտք գործել՝ օգտագործելով result.trend (միտման համար) և result.resid (աղմուկի կամ մնացորդների համար):

Սյուժեն հստակ ցույց է տալիս կրկնվող ցիկլը յուրաքանչյուր 5 ժամանակահատվածում: Սա բավականին տրամաբանական է, քանի որ մեր տվյալները բաժնետոմսերի գների տվյալներն են: Մենք դիտարկում և հավաքում ենք բաժնետոմսերի գների տվյալներ շաբաթվա յուրաքանչյուր աշխատանքային օրը: Սա նշանակում է, որ տվյալները շաբաթական սեզոնայնություն են, շաբաթը աշխատանքային շաբաթ է (շաբաթական 5 օր): Այնուամենայնիվ, ավելի ուշադիր ուսումնասիրելու դեպքում արժեքները շատ շատ աննշան են (ինչպես երևում է y-առանցքի մասշտաբից): Այսպիսով, մեր մոդելներում 5 ժամանակաշրջանի սեզոնայնության օգտագործումը կարող է մեծ արդյունք չտալ:

Այս հոդվածը կարճ պահելու համար, քայքայվող մյուս 2 շարքերը՝ spx_ret և spx_vol, այստեղ ցուցադրված չեն: Նաև բազմապատկիչ տարրալուծումը ցուցադրված չէ, բայց կարող է գծագրվել՝ օգտագործելով վերը նշված մեկնաբանություններում նշված կոդը:

Ժամանակային շարքերի հարթեցում (շարժվող միջիններ)

Հարթեցումը տեխնիկա է, որն օգտագործվում է ժամանակային շարքի անկանոն տատանումները կամ հասկերը նվազեցնելու համար: Դա արվում է աղմուկի ազդեցությունը սերիայի վրա թուլացնելու համար: Ժամանակային շարքերը հարթելու ընդհանուր մեթոդըՇարժվող միջինների օգտագործումն է: Այս մեթոդով միջինը որոշակի թվով ժամանակաշրջանների ընթացքում (նաև կոչվում է Պատուհան ) հաշվարկվում է շարքի յուրաքանչյուր ժամանակային քայլի համար: Ժամանակային քայլի համար n չափի պատուհանը կարող է սահմանվել 2 եղանակով.

  • Ընթացիկ ժամանակային քայլը կարող է լինել պատուհանի վերջում: այսինքն՝ n-1 անցյալ ուշացումները և 1 ընթացիկ ժամանակային քայլը կազմում են n չափի պատուհանը:
  • Ընթացիկ ժամանակային քայլը կարող է լինել պատուհանի կենտրոնում: այսինքն՝ n-1 ուշացումների մոտ կեսը անցյալ ուշացումներ են, մնացածը՝ ապագա ուշացումներ, իսկ ընթացիկ ժամանակային քայլը գտնվում է կենտրոնում:

Նշում. Այս օրինակում մենք օգտագործում ենք պատուհան ընտրելու առաջին մոտեցումը: Այսպիսով, եթե պատուհանի չափը 3 է, ապա առաջին 2 արժեքների համար մենք բավարար ուշացումներ չունենք շարժվող միջինը հաշվարկելու համար: Այսպիսով, n չափի պատուհանի համար շարքի առաջին n-1 հետաձգումները կհանգեցնեն զրոյական արժեքների:

Ինչպես միշտ, մենք սկսում ենք նկարի չափը սահմանելուց և ենթահողերի սահմանումից: Այս անգամ, սակայն, մենք sharex արգումենտը սահմանեցինք True, որը թույլ է տալիս ենթագծագրերին ունենալ ընդհանուր x առանցք: Առաջին շարքում մենք գծագրում ենք իրական S&P 500 գները և հարթեցված տարբերակը: Հարթեցումը կատարվում է rolling() մեթոդով spx սերիայի վրա, որի պատուհանի չափը 360 է, սահմանված window=360 պարամետրով: mean() ֆունկցիան rolling(window = 360) ֆունկցիայի վրա կանչելով՝ մենք ստանում ենք ցանկալի շարժվող միջինը: Նմանատիպ գործառույթներ օգտագործվում են հաջորդ 2 տողերում՝ spx_ret և spx_vol շարքերի սյուժեները ստանալու համար:

Արդյունքները ստուգելիս մենք կարող ենք հստակ տեսնել 3-րդ շարքի միտումները: Ե՛վ գները, և՛ եկամուտները ցույց են տալիս կտրուկ անկումներ 2004 և 2008 թվականների ընթացքում: Անկայունությունը մեծանում է այս 2 ժամանակաշրջանների ընթացքում: Այս ամենը վկայում է վերը նշված ժամանակահատվածներում անկայուն շուկայի առկայության մասին։ S&P 500 գներն ունեն հստակ աճի միտում, բացառությամբ 2 անկումների: Եկամուտները և անկայունությունը որոշակիորեն հաստատուն են՝ բացառությամբ 2004 և 2008 թվականների շուրջ:

Փոփոխելով window պարամետրը rolling() ֆունկցիայի մեջ, մենք կարող ենք նման սյուժեներ կառուցել նաև այլ պատուհանների չափերի համար:

Հարաբերակցության սխեմաներ (ACF և PACF)

Մոդելները, որոնք օգտագործվում են ժամանակային շարքը կանխատեսելու համար, օգտագործում են հենց շարքի անցյալ արժեքները ապագան կանխատեսելու համար: Այսպիսով, վերլուծաբանների համար կարևոր է իմանալ, թե որքանով է սերիալը կախված իր նախորդ տարբերակներից (կամ ուշացած տարբերակներից): 2 սերիաների միջև կախվածությունը կարելի է դատել՝ 2 շարքերի միջև Հարաբերակցությունըհաշվելով: Այնուամենայնիվ, այս դեպքում 2 սերիան ըստ էության նույնն է: Մեկը մյուսի հետաձգված տարբերակն է: Հետևաբար, նման դեպքում հաշվարկված հարաբերակցությունը հայտնի է որպես Ավտոհարաբերակցություն։

Գոյություն ունեն հարաբերակցության գծագրերի 2 տեսակ, որոնք հաճախ օգտագործվում են ժամանակային շարքի կախվածությունն ինքն իրենից հասկանալու համար: Սրանք ACF (Auto-Correlation Function) և PACF (Partial Auto-Correlation Function) սյուժեներն են:

Մենք քննարկել ենք, թե ինչ է Auto-Correlation-ը: Այժմ եկեք հասկանանք Մասնակի ավտոմատ հարաբերակցությունը: Համաձայն Introductory Time Series with R գրքի.

Մասնակի ավտոկորելացիան k ուշացումով այն հարաբերակցությունն է, որն առաջանում է ցանկացած հարաբերակցության ազդեցությունը վերացնելուց հետո՝ պայմանավորված ավելի կարճ ուշացումներով տերմիններով:

Սա հասկանանք օրինակով։ Ենթադրենք, որ որոշակի չորեքշաբթի մենք դիտարկել ենք S&P 500 գների որոշակի արժեք: Այս արժեքը կախված կլինի մի քանի օր առաջ դիտարկված արժեքներից (ասենք երեքշաբթի և երկուշաբթի): Այսպիսով, չորեքշաբթի և երկուշաբթի գների միջև կախվածությունը չափվում է Auto-Correlation-ով: Այնուամենայնիվ, մենք գիտենք, որ ինչպես չորեքշաբթի, այնպես էլ երեքշաբթի օրվա գինը կախված է երկուշաբթի օրվա գնից: Այսպիսով, երբ մենք գնահատում ենք գների ավտոմատ հարաբերակցությունը չորեքշաբթի և երկուշաբթի, մենք գնահատում ենք հարաբերակցության 2 տեսակ՝ մեկը, որն ուղղակի է (չորեքշաբթիից երկուշաբթի), և մյուսը, որն անուղղակի է (չորեքշաբթի և երեքշաբթի և երեքշաբթի միջև ընկած ժամանակահատվածում): և երկուշաբթի): Մասնակի ավտոմատ հարաբերակցության միջոցով մենք հեռացնում ենք նման անուղղակի ազդեցությունները և գնահատում ենք միայն ուղղակի կախվածությունը:

Նախ, մենք ներմուծում ենք statsmodels.graphics.tsaplots փաթեթը, որը պարունակում է plot_acf() և plot_pacf() ֆունկցիաները, որոնք օգտագործվում են ACF և PACF սյուժեները որոշակի ժամանակային շարքի համար: Ինչպես այս հոդվածի մյուս սյուժեները, մենք սահմանում ենք նկարի չափը և ենթահողերը (ընդհանուր x առանցքով): Այնուհետև նկարի առաջին և երկրորդ սյունակներում մենք գծագրում ենք 3 սերիայի ACF և PACF համապատասխանաբար (spx, spx_ret և spx_vol): Երկուսն էլ plot_acf()-ը և plot_pacf()-ն ընդունում են ժամանակային շարքերը, քանի որ սյուժեների հետ պետք է ներկայացվեն որպես իրենց փաստարկը: Բացի այդ,plot_acf() (կամ plot_pacf()) ֆունկցիան ընդունում է lags պարամետրը, որը ցույց է տալիս, թե քանի ուշացումով ֆունկցիան պետք է հաշվարկի ACF-ը (կամ PACF): Այս դեպքում lags=40-ը ցույց է տալիս, որ ֆունկցիան պետք է հաշվարկի ACF-ը (կամ PACF) մինչև պատմության մեջ 40 հետաձգում: zero պարամետրը plot_acf()-ում (կամ plot_pacf()) բուլյան պարամետր է, որը ցույց է տալիս, թե արդյոք շարքի ACF-ը (կամ PACF) պետք է հաշվարկվի իր ոչ հետաձգված տարբերակով: Մաթեմատիկորեն սա միշտ կլինի 1, քանի որ ցանկացած շարք հիանալի փոխկապակցված է իր հետ: Այսպիսով, դրա գծագրումը որպես այդպիսին որևէ լրացուցիչ տեղեկատվություն չի տրամադրում:

Նշում. Ոչ մի զրոյական արժեք չպետք է առկա լինի այն շարքում, որոնք փոխանցվում են որպես plot_acf() և plot_pacf() ֆունկցիաների մուտքեր:

Հողամասում x-առանցքի մոտ գտնվող կապույտ շերտերը ցույց են տալիս նշանակության մակարդակները: Այս շղթայից բարձր ուշացումները համարվում են նշանակալի: Այս սյուժեները պատկերացում են տալիս, թե ինչպես են տվյալները կախված իրենց հետաձգված տարբերակներից: Այս տեղեկատվությունը շատ կարևոր կլինի այս շարքերի համար մոդելներ կառուցելիս:

Ստացիոնարության ստուգում

Ըստ Ռոբ Ջի Հայնդմանի և Ջորջ Աթանասոպուլոսի Կանխատեսում. սկզբունքներ և պրակտիկա գրքի,

Անշարժ ժամանակային շարք է համարվում այն, որի հատկությունները կախված չեն այն ժամանակից, երբ դիտվում է շարքը: Այսպիսով, միտումներով կամ սեզոնայնությամբ ժամանակային շարքերը անշարժ չեն. միտումը և սեզոնայնությունը կազդեն ժամանակային շարքերի արժեքի վրա տարբեր ժամանակներում: Մյուս կողմից, սպիտակ աղմուկի շարքը անշարժ է. կարևոր չէ, թե երբ եք դիտում այն, այն պետք է շատ նույն տեսքը ունենա ժամանակի ցանկացած պահի:

Այստեղհատկություններընշանակում են վիճակագրական հատկություններ, ինչպիսիք են միջինը, շեղումը և այլն: Տվյալ ժամանակային շարքը կանխատեսելու համար վիճակագրական մոդելներ կառուցելիս կարևոր է ապահովել, որ որպես մուտքագրված շարքը անշարժ է: Դա պայմանավորված է նրանով, որ միայն անշարժ շարքի դեպքում մենք կարող ենք վստահ լինել, որ տվյալների հիմքում ընկած բաշխումը ապագայում չի փոխվի: Այնուամենայնիվ, եթե մենք օգտագործում ենք ոչ ստացիոնար շարք, մենք երբեք չենք կարող վստահ լինել հիմքում ընկած բաշխման մասին: Հետևաբար, մոդելը կենթադրի, որ տվյալների բաշխումը կմնա հաստատուն կանխատեսման ժամանակաշրջանի համար, և քանի որ ոչ կայուն շարքի դեպքում դրա համար երաշխիք չկա, այս դեպքում կանխատեսումները, հավանաբար, վատ կլինեն:

Կան մի շարք եղանակներ՝ ստուգելու տվյալ շարքը կայունության համար: Այս հոդվածում մենք նայում ենք հետևյալ 3-ին.

  • Տեսողական ստուգում. Մենք գծագրում ենք սերիան և ստուգում, թե արդյոք սերիալն ունի ակնհայտ միտում կամ սեզոնային ցիկլեր:
  • Ամփոփ վիճակագրության գծագրում. Մենք գծագրում ենք տվյալների ամփոփ վիճակագրությունը (միջին և շեղում) ժամանակի տարբեր ժամանակահատվածներում:
  • Վիճակագրական թեստեր. Վերոնշյալ 2 մեթոդներից ստացված եզրակացությունները որակական են, քան քանակական: Այսպիսով, ավելի հուսալի քանակական գնահատական ​​ստանալու համար օգտագործվում է հզոր վիճակագրական թեստ, որը կոչվում է ADF (Augmented-Dickey Fuller) թեստ:

Տեսողական զննում.Դրա համար մենք օգտագործում ենք նախնական սյուժեները, որոնք պատրաստել ենք այս հոդվածի սկզբում այստեղ:

Կոդի բացատրությունը տրված է սույն հոդվածի Նախնական գծերի հողամասեր բաժնում: Արդյունքից պարզ է դառնում, որ S&P 500 գները ոչ ստացիոնար են: Դա պայմանավորված է նրանով, որ spx սերիան ունի շատ հստակ միտում, որը ժամանակի մեծ մասում վեր է բարձրանում (բացառությամբ 2004 և 2008 թվականների շուրջ): Մյուս կողմից, S&P 500 Returns-ը և Volatility-ը կարծես թե որևէ ուժեղ աճի կամ նվազման միտում չունեն: spx_ret-ը և spx_vol-ը պարունակում են որոշ սուր հասկեր, բայց դրանք չեն հայտնվում պարբերական ցիկլերում: Նրանց կայունությունը որոշելու համար օգտագործենք մեկ այլ մոտեցում:

Ամփոփ վիճակագրության գծագրում.Այս մեթոդով մենք կբաժանենք 3 շարքերը՝ spx, spx_ret և spx_vol տարվա կտրվածքով և գծագրենք դրանք՝ տեսնելու, թե արդյոք ամփոփ վիճակագրությունը փոխվում է տարիների ընթացքում:

groupby() ֆունկցիան օգտագործվում է train_df-ի վրա՝ տարվա վրա հիմնված 3 շարքը խմբավորելու համար: Տարին train_df-ի ինդեքսից հանելու համար մենք պարզապես օգտագործում ենք train_df.index.year-ը և այն փոխանցում groupby() ֆունկցիայի by արգումենտին: mean() և var() ֆունկցիաները օգտագործվում են groupby()-ի ելքի վրա՝ յուրաքանչյուր տարվա համար 3 ​​շարքի միջինը և շեղումը պարունակող տվյալների շրջանակները ստանալու համար: Այնուհետև մենք գծագրում ենք միջին և շեղումների գծերի գծապատկերները 3 շարքերի համար՝ spx, spx_ret և spx_vol՝ նախ սահմանելով նկարի չափը, այնուհետև սահմանելով ենթահողերի քանակը (և որ նրանք կիսում են x առանցքը՝ օգտագործելով sharex = True), այնուհետև: լրացնելով յուրաքանչյուր ենթահողամաս համապատասխան շարքի սյուժեով:

Ինչպես նախկինում, S&P 500 Prices-ի տարեկան միջոցները ցույց են տալիս ուժեղ միտումներ: S&P 500 Returns-ի և Volatility-ի տարեկան միջին ցուցանիշները ցույց են տալիս որոշ աճեր, բայց այդ հասկերի մեծությունը շատ փոքր է բուն սերիայի համեմատ: Այսպիսով, դրանք կարելի է համարել հաստատուն: S&P 500 գների տարեկան շեղումները հաստատուն չեն և, հետևաբար, spx-ը ոչ ստացիոնար շարք է: Եվ տարեկան միջինների նման, S&P 500 Returns-ի և Volatility-ի տարեկան տատանումները ցույց են տալիս բարձրացումներ, բայց ցածր մեծությամբ, հետևաբար այս 2 շարքերը՝ spx_ret և spx_vol, կարծես թե անշարժ են: Այնուամենայնիվ, կայունության ավելի կոնկրետ (կամ ավելի քանակական) ապացույց ստանալու համար սովորաբար օգտագործվում են վիճակագրական թեստեր:

Վիճակագրական թեստեր (ADF).Այստեղ մենք օգտագործում ենք հանրահայտ Augmented-Dickey Fuller (ADF) թեստը` ստուգելու շարքի կայունությունը: Թեստն ունի հետևյալ 2 վարկածը.

  • Զեղծ հիպոթեզ (H0). Շարքն ունի միավոր արմատ կամ այն ​​անշարժ չէ:
  • Այլընտրանքային վարկած (H1). շարքը չունի միավոր արմատ կամ այն ​​անշարժ է:

Միավոր արմատ հասկացությունը շատ լավ բացատրված է Analytics Vidhya-ի այս բլոգի գրառման մեջ: ADF թեստը թողարկում է թեստի վիճակագրությունը վիճակագրության p արժեքի հետ միասին: Եթե ​​վիճակագրության p-արժեքը վստահության մակարդակներից փոքր է. 1% (0.01), 5% (0.05) կամ 10% (0.10)), ապա մենք կարող ենք մերժել զրո հիպոթեզը և շարքը անվանել անշարժ:

Եկեք ստուգենք 3 շարքի կայունությունը՝ օգտագործելով ADF թեստը:

Նախ ներմուծում ենք adfuller() ֆունկցիան statsmodels.tsa.stattools փաթեթից: Այնուհետև մենք անցնում ենք այն շարքը, որի վրա ADF-ի փորձարկումը պետք է կատարվի որպես մուտքագրման պարամետր adfuller() թեստին: Վերոնշյալ բջիջում մենք անցնում ենք train_df[“spx”] շարքը որպես մուտքագրում: Վերևի ելքը ցույց է տալիս spx շարքի վրա ADF թեստի արդյունքները: Առաջին արժեքը փորձարկման վիճակագրությունն է, երկրորդը` p-արժեքը: Հաջորդ 2-ը օգտագործված ուշացումների և օգտագործված դիտարկումների քանակն է: Հաջորդ բառարանը վիճակագրական արժեքներն են 3 վստահության մակարդակներում: Ինչպես երևում է այս դեպքում, վիճակագրության p-արժեքը (~0.8 կամ 80%) ավելի մեծ է, քան բոլոր 3 վստահության միջակայքերը: Հետևաբար մենք չենք կարող մերժել զրոյական վարկածը: Հետևաբար, spx շարքը անշարժ է:

Այս թեստը մյուս 2 սերիաների վրա կատարելու համար վերևի կոդի բջիջի համապատասխան տողերը մեկնաբանեք: Նկատի ունեցեք, որ adfuller() ֆունկցիայի մուտքագրված շարքը պետք է զերծ լինի զրոյական արժեքներից: Հետևաբար, spx_ret-ի և spx_vol-ի համար մենք բացառում ենք առաջին դիտարկումը մինչև շարք անցնելը: Ստորև բերված 2 պատկերները ցույց են տալիս ADF փորձարկման արդյունքները S&P 500 Returns-ի և Volatility-ի վրա համապատասխանաբար:

Այս երկու շարքերի համար էլ p-արժեքը (2-րդ արժեքը համապատասխան պատկերներում) շատ մոտ է զրոյին և շատ ավելի քիչ, քան նշված 3 վստահության մակարդակը: Այսպիսով, այս 2 շարքերի համար մենք կարող ենք մերժել զրո վարկածը: Հետևաբար, ըստ ADF թեստի, S&P 500 Returns և S&P 500 Volatility երկուսն էլ անշարժ են:

Եզրակացություններ

3 շարքի (spx, spx_ret և spx_vol) համապարփակ ուսումնասիրությունը բացահայտեց տվյալների որոշ կարևոր բնութագրեր: Հետևյալ կետերը ամփոփում են այս հոդվածում ստացված հիմնական պատկերացումները.

  • Միտում. spx-ն ունի ընդհանուր աճի միտում, բացառությամբ 2004 և 2008 2 ժամանակահատվածների: Մյուս կողմից, spx_ret-ը և spx_vol-ն ունեն մշտական ​​միտում:
  • Սեզոնայնություն. Տվյալների տարրալուծման և հարաբերակցության ֆունկցիաները գծագրելիս թվում է, որ տվյալները կարող են ունենալ 5 շրջանի սեզոնայնություն: Սա նաև իմաստ ունի ընդհանուր ինտուիցիայի համաձայն, որ ֆոնդային շուկայի տվյալները դիտվում են աշխատանքային օրերին: (այսինքն շաբաթվա 5 օր): Այսինքն՝ մեր տվյալների մեջ կարող է լինել շաբաթական սեզոնայնություն։ Սա պետք է ուսումնասիրվի վիճակագրական մոդելներ կառուցելիս:
  • Ստացիոնություն.spx շարքը ստացիոնար չէ: Սա նշանակում է, որ անհրաժեշտ է կատարել լրացուցիչ նախամշակում, նախքան սերիան կարող է օգտագործվել մոդելի կառուցման և հետագա կանխատեսման համար: spx_ret և spx_vol երկուսն էլ անշարժ են և, հետևաբար, դրանք կարող են օգտագործվել ուղղակիորեն մոդելավորման համար:

Այս շարքի հաջորդ մասերում կկառուցվեն տարբեր վիճակագրական մոդելներ՝ 3-րդ շարքը կանխատեսելու համար:

Այս շարքի այլ մասերի հղումներ

Հղումներ

[1] 365DataScience դասընթաց ժամանակային շարքերի վերլուծության վերաբերյալ

[2] մեքենայական ուսուցման վարպետություն բլոգներ ժամանակային շարքերի վերլուծության վերաբերյալ

[3] Վիքիպեդիա հոդված Box Plots-ի մասին

[4] Ներածական ժամանակային շարք R-ով

[5] Թամարա Լուի. Վիճակագրական մոդելավորման և մեքենայական ուսուցման կիրառում ժամանակային շարքերի կանխատեսում կատարելու համար

[6] Կանխատեսում. սկզբունքներ և պրակտիկա՝ Ռոբ Ջ Հինդմանի և Ջորջ Աթանասոպուլոսի կողմից

[7] Նուրբ ներածություն Python-ում ոչ անշարժ ժամանակային շարքի հետ աշխատելու համար Analytics Vidhya-ից