تحلیل قیمت سهام در زبان R – راهنمای کاربردی
«تحلیل قیمت سهام» (Stock Market Analysis) از جمله موضوعات داغ روز در حوزه «دادهکاوی» (Data Mining) و «تحلیل داده» (Data Analysis) به شمار میآید. در این مطلب، تحلیل قیمت سهام با استفاده از زبان برنامهنویسی R انجام شده است. از «ماتریس واریانس-کواریانس» (Variance-Covariance Matrix) برای نشان دادن واریانس یک متغیر مشخص (قطری) استفاده میشود، در حالی که ماتریس کواریانس نشانگر کواریانس بین ترکیب کاملی از متغیرها است.
دلیل استفاده از ماتریس واریانس-کواریانس برای تحلیل قیمت سهام
«ماتریس واریانس-کواریانس» هنگامی که بحث از تحلیل «نوسان» (volatility) بین عناصر یک گروه از دادهها میشود گزینهای مفید محسوب میشود. برای مثال، هنگامی که صحبت از تحلیل «بازده پورتفولیو» (portfolio returns) میشود، ماتریس واریانس-کوواریانس دارای کاربردهای قابل توجهی است.
اگر چندین دارایی با کواریانس بالا در یک پورتفولیو قرار بگیرند، نشانگر ریسک بالا است. این امر نشان میدهد که داراییهای گوناگون با نوسان بالا همزمان تغییر میکنند و این همان چیزی است که سرمایهگذاران معمولا قصد اجتناب از آن را دارند.
از سوی دیگر، انتخاب داراییهایی که دارای کواریانس منفی هستند برای تنوع بیشتر پورتفولیو پذیرفته است زیرا نوسان داراییها به طور همزمان به وقوع نمیپیوندد.
تولید ماتریس واریانس-کواریانس در R
ابتدا، کتابخانههای مورد نیاز نصب میشوند.
1#Install Packages
2install.packages("corpcor")
3install.packages("tseries")
4install.packages("quantmod")
سپس، کتابخانههای tseries ،corpcor و quantmod در محیط بارگذاری میشوند.
1#Load libraries
2library(corpcor)
3library(tseries)
به منظور تامین اهداف این ماتریس واریانس-کواریانس، دادههای سهام با quantmod به منظور انجام تحلیل پنج سهامی که در ادامه بیان شده استریم (Stream) میشوند.
- AAPL
- CBS
- EFX
- GOOGL
- VZ
اکنون، به موارد زیر نیاز است:
- دانلود کردن قیمتهای سهام مرتبط برای ۳۰ روز گذشته
- تبدیل کردن به بازده روزانه با مشاهده سوابق و تفاوت روزانه برای هر سهام، برای محاسبه ترکیبها
1> #Quantmod
2> aapl = getSymbols("AAPL",type="xts")
3> cbs = getSymbols("CBS",type="xts")
4> efx = getSymbols("EFX",type="xts")
5> googl = getSymbols("GOOGL",type="xts")
6> vz = getSymbols("VZ",type="xts")
اکنون، این موارد درون دیتافریمها ذخیره میشوند و تفاوت سوابق را نشان میدهند.
1> #Store within dataframes
2> aapl=data.frame(tail(AAPL$AAPL.Close,30))
3> cbs=data.frame(tail(CBS$CBS.Close,30))
4> efx=data.frame(tail(EFX$EFX.Close,30))
5> googl=data.frame(tail(GOOGL$GOOGL.Close,30))
6> vz=data.frame(tail(VZ$VZ.Close,30))
7
8> #Logs and differences
9> aapl<-diff(log(aapl$AAPL.Close),1)
10> cbs<-diff(log(cbs$CBS.Close),1)
11> efx<-diff(log(efx$EFX.Close),1)
12> googl<-diff(log(googl$GOOGL.Close),1)
13> vz<-diff(log(vz$VZ.Close),1)
سپس، هر سهام در یک دیتافریم که portfolio نامیده شده ترکیب میشوند.
1> portfolio <- data.frame(aapl, cbs, efx, googl, vz)
اکنون، باید یک ماتریس کواریانس ۵×۵ ساخته شود.
1> #Range Names
2> range.names = c("AAPL", "CBS", "EFX", "GOOGL", "VZ")
3> names(portfolio) = range.names
4> covmatrix = matrix(c(cov(portfolio)),
5+ nrow=5, ncol=5)
6> dimnames(covmatrix) = list(range.names, range.names)
7>
8> #Covariance matrix
9> covmatrix
10 AAPL CBS EFX GOOGL VZ
11AAPL 5.821228e-05 -4.240955e-06 3.545054e-05 6.099968e-05 4.733450e-07
12CBS -4.240955e-06 2.778983e-04 4.656228e-05 1.597556e-05 -2.651646e-05
13EFX 3.545054e-05 4.656228e-05 2.230373e-04 2.608622e-05 2.325623e-05
14GOOGL 6.099968e-05 1.597556e-05 2.608622e-05 1.613921e-04 -7.482914e-06
15VZ 4.733450e-07 -2.651646e-05 2.325623e-05 -7.482914e-06 1.313256e-04
خروجی بالا حاکی از آن است که نوسان قیمتها همزمان به وقوع میپیوندد. برای مثال، میتوان مشاهده کرد که نوسان بین AAPL و VZ به طور قابل ملاحظهای کمتر از مقدار موجود بین AAPL و GOOGL است، زیرا دو مورد دوم هر دو سهام فناوری هستند.
برآورد انقباضی کواریانس
این مساله همیشه وجود دارد که اگر مشاهدات بسیار کمی در دادهها وجود داشته باشد (که مسلما با توجه به اینکه در اینجا از ۳۰ روز از دادهها استفاده میشود اینچنین است)، ماتریس کواریانس تخمینهای کواریانس غیر قابل اعتماد خواهد بود.
برای اصلاح این موضوع، میتوان از چیزی که «برآورد انقباضی» (shrinkage estimate) کواریانس نامیده میشود استفاده کرد. این برآوردگر با حصول اطمینان از اینکه ماتریس کواریانس مثبت قطعی است کار میکند. به عبارت دیگر، جایی که همه ویژه بردارها واقعی و مثبت هستند. هنگامی که ماتریس کواریانس منقبض میشود، خروجی زیر حاصل میشود.
1> #Shrinkage estimate of covariance
2> cov.shrink(covmatrix)
3Estimating optimal shrinkage intensity lambda.var (variance vector): 1
Estimating optimal shrinkage intensity lambda (correlation matrix): 0.8531 AAPL CBS EFX GOOGL VZ AAPL 4.388321e-09 -3.435343e-10 4.139977e-11 5.105568e-10 -2.569910e-10 CBS -3.435343e-10 4.388321e-09 1.561082e-11 -1.523166e-10 -3.626202e-10 EFX 4.139977e-11 1.561082e-11 4.388321e-09 -1.550852e-10 -5.283354e-11 GOOGL 5.105568e-10 -1.523166e-10 -1.550852e-10 4.388321e-09 -3.192974e-10 VZ -2.569910e-10 -3.626202e-10 -5.283354e-11 -3.192974e-10 4.388321e-09 attr(,"lambda") [1] 0.853093 attr(,"lambda.estimated") [1] TRUE attr(,"class") [1] "shrinkage" attr(,"lambda.var") [1] 1 attr(,"lambda.var.estimated") [1] TRUE
ماتریس همبستگی
هنگامی که اطمینان حاصل شد که ماتریس کواریانس قطعی مثبت است، میتوان آن را به ماتریس همبستگی تبدیل کرد، در واقع تعیین افزونهای برای مواردی که بازده به جای نوسانات با هم حرکت میکنند انجام میشود.
1> #Transform covariance to correlation matrix
2> cov2cor(covmatrix)
3 AAPL CBS EFX GOOGL VZ
4AAPL 1.000000000 -0.03334367 0.3111192 0.62933100 0.005413721
5CBS -0.033343673 1.00000000 0.1870262 0.07543487 -0.138802692
6EFX 0.311119193 0.18702623 1.0000000 0.13749322 0.135886379
7GOOGL 0.629331001 0.07543487 0.1374932 1.00000000 -0.051399037
8VZ 0.005413721 -0.13880269 0.1358864 -0.05139904 1.000000000
نتیجهگیری
در این راهنما، چگونگی استریم قیمتهای سهام با quantmod و ساخت یک ماتریس کواریانس با quantmod آموزش داده شد.
همچنین، چگونگی انقباض یک ماتریس برای حصول اطمینان از اینکه قطعی مثبت است و تبدیل یک ماتریس کواریانس به یک ماتریس همبستگی آموزش داده شد.
اگر نوشته بالا برای شما مفید بوده، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای آمار، احتمالات و دادهکاوی
- آموزش برنامهنویسی R و نرمافزار R Studio
- مجموعه آموزشهای برنامه نویسی پایتون (Python)
- مجموعه آموزشهای یادگیری ماشین و بازشناسی الگو
- مجموعه آموزشهای شبکههای عصبی مصنوعی
- مجموعه آموزشهای هوش محاسباتی
- مجموعه آموزشهای برنامه نویسی متلب (MATLAB)
^^