Տվյալների պատկերացում
Ժամանակային շարքի տվյալների վիճակագրական մոդելավորում Մաս 2. Հետախուզական տվյալների վերլուծություն
Հոդվածների այս շարքում S&P 500 շուկայական ինդեքսը վերլուծվում է հանրաճանաչ վիճակագրական մոդելի միջոցով՝ SARIMA(Սեզոնային ավտոռեգեսիվ ինտեգրված շարժվող միջին) և GARCH(Ընդհանրացված ավտոմատ ռեգրեսիվ պայմանական հետերոսկեդաստիկություն):
Առաջին մասում այս հոդվածաշարում օգտագործված տվյալները՝ S&P 500 Prices (որը նշված է որպես spx
փոխադարձաբար), հանվել է yfinance
API-ից: Սերիան նկարագրում է յուրաքանչյուր աշխատանքային օր 1994–01–06
_________________________________________________ օրերի ընթացքում: Այն մաքրվեց և օգտագործվեց շուկան ուսումնասիրելու համար օգտագործվող երկու այլ շարքեր ստանալու համար.
Այս երկրորդ մասում նախապես մշակված ժամանակային շարքերը պատկերացվում և ուսումնասիրվում են՝ հասկանալու համար ցանկացած միտում, կրկնվող օրինաչափություններ և/կամ այլ բնութագրեր, որոնք հետագայում կարող են օգտագործվել շարքը մոդելավորելու և ապագա արժեքները կանխատեսելու համար (հետագա բաժիններում): Այս հոդվածում օգտագործված կոդը այս պահեստում գտնվող Visualization and EDA.ipynbնոթատետրից է:
Բովանդակություն
- Տվյալների ներմուծում
- Նախնական գծային հողամասեր
- Ժամանակային շարքերի տվյալների բաժանում Train-Test հավաքածուների մեջ
- Տարեկան միտումների ուսումնասիրություն՝ օգտագործելով Box Plots
- Տվյալների բաշխում
- Տվյալների տարրալուծում (հավելումային և բազմապատկիչ)
- Ժամանակային շարքերի հարթեցում (շարժվող միջիններ)
- Հարաբերակցության սխեմաներ (ACF և PACF)
- Ստացիոնարության ստուգում
- Եզրակացություն
- Այս շարքի այլ մասերի հղումներ
- Հղումներ
Տվյալների ներմուծում
Նախքան որոնումը սկսելը, նախ ներմուծենք նախապես մշակված տվյալները վերջին մասից։ Տվյալները քերծվել են 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, և
- 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
տուփերը: Այս սյուժեները կազմելու համար օգտագործվում է pandas
-ի boxplot()
ֆունկցիան: Ֆունկցիան վերցնում է սյունակը, որն օգտագործվում է 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. նախնական մշակում
- Ժամանակային շարքի տվյալների վիճակագրական մոդելավորում Մաս 2. Հետախուզական տվյալների վերլուծություն
- Ժամանակային շարքերի տվյալների վիճակագրական մոդելավորում Մաս 3. կայուն ժամանակային շարքերի կանխատեսում SARIMA-ի միջոցով
- Ժամանակային շարքի տվյալների վիճակագրական մոդելավորում Մաս 4. անկայունության կանխատեսում GARCH-ի միջոցով
- Ժամանակային շարքերի տվյալների վիճակագրական մոդելավորում Մաս 5. ARMA+GARCH մոդելը ժամանակային շարքերի կանխատեսման համար:
- Ժամանակային շարքերի տվյալների վիճակագրական մոդելավորում Մաս 6. կանխատեսում ոչ կայուն ժամանակային շարքեր՝ օգտագործելով ARMA
Հղումներ
[1] 365DataScience դասընթաց ժամանակային շարքերի վերլուծության վերաբերյալ
[2] մեքենայական ուսուցման վարպետություն բլոգներ ժամանակային շարքերի վերլուծության վերաբերյալ
[3] Վիքիպեդիա հոդված Box Plots-ի մասին
[4] Ներածական ժամանակային շարք R-ով
[6] Կանխատեսում. սկզբունքներ և պրակտիկա՝ Ռոբ Ջ Հինդմանի և Ջորջ Աթանասոպուլոսի կողմից
[7] Նուրբ ներածություն Python-ում ոչ անշարժ ժամանակային շարքի հետ աշխատելու համար Analytics Vidhya-ից