تحلیل و مقایسه صندوقهای ETF اهرمی معکوس با SQL Server Data Mining
این مقاله نحوه استفاده از قابلیتهای دادهکاوی در SQL Server Analysis Services (SSAS) را برای تحلیل و مقایسه عملکرد صندوقهای قابل معامله در بورس (ETF) اهرمی معکوس نشان میدهد. هدف، درک نوسانات و الگوهای این نوع ETFها در مقایسه با ETFهای مرجع و همچنین سایر ETFهای مرتبط است. این تحلیل به سرمایهگذاران کمک میکند تا تصمیمات آگاهانهتری در مورد استراتژیهای معاملاتی خود بگیرند.
برای شروع، اولین گام جمعآوری دادههای تاریخی قیمت از منابع عمومی مانند یاهو فاینانس و ذخیره آنها در فایلهای CSV است. این دادهها شامل اطلاعات روزانه مانند تاریخ، قیمتهای باز و بسته شدن، بالا و پایینترین قیمت، و حجم معاملات برای هر ETF منتخب هستند. برای فعالسازی امکان اجرای دستورات پاورشل (PowerShell) و دانلود دادهها، باید تنظیمات پیشرفته SQL Server را پیکربندی کرده و قابلیت `xp_cmdshell` را فعال کنید. این کار با اجرای کد زیر انجام میشود:
SQLCMD -E -Slocalhost -dmaster -Q"EXECUTE sp_configure 'show advanced options', 1; RECONFIGURE; EXECUTE sp_configure 'xp_cmdshell', 1; RECONFIGURE;"
پس از فعالسازی، میتوانید از دستورات پاورشل برای دانلود دادههای تاریخی استفاده کنید. به عنوان مثال، برای دانلود دادههای UVXY (صندوق Volatility ETF)، دستور زیر را در `xp_cmdshell` اجرا کنید:
DECLARE @Command VARCHAR(4000);
SET @Command = 'POWERSHELL -Command "((Invoke-WebRequest ''https://query1.finance.yahoo.com/v7/finance/download/UVXY?period1=1334649600&period2=1690070400&interval=1d&events=history&includeAdjustedClose=true'' -UseBasicParsing).Content | ConvertFrom-Csv) | Export-Csv -Path ''C:\Temp\UVXY.csv'' -NoTypeInformation -Encoding UTF8"';
EXECUTE xp_cmdshell @Command;
این فرآیند برای ETFهای دیگری مانند VXX (یک Volatility ETF دیگر)، UGL (صندوق اهرمی طلا)، GLD (صندوق طلای فیزیکی)، TVIX (صندوق Volatility Short-Term Futures)، SPXU (صندوق اهرمی معکوس S&P 500)، SPY (صندوق S&P 500)، SQQQ (صندوق اهرمی معکوس Nasdaq 100) و QQQ (صندوق Nasdaq 100) نیز تکرار میشود تا دادههای مورد نیاز برای تحلیل جمعآوری شوند.
در مرحله بعدی، یک پایگاه داده در SQL Server برای ذخیره این دادهها ایجاد میکنیم. این پایگاه داده شامل یک جدول برای نگهداری قیمتهای تاریخی با جزئیاتی مانند نماد، تاریخ، قیمتهای باز، بالا، پایین، بسته شدن، بسته شدن تعدیل شده و حجم معاملات خواهد بود. کد SQL برای ایجاد این پایگاه داده و جدول به شرح زیر است:
USE [master];
GO
CREATE DATABASE [ETFS];
GO
USE [ETFS];
GO
CREATE TABLE [dbo].[HistoricalPrices] (
[Symbol] VARCHAR(10) NOT NULL,
[Date] DATE NOT NULL,
[Open] DECIMAL(18, 4) NOT NULL,
[High] DECIMAL(18, 4) NOT NULL,
[Low] DECIMAL(18, 4) NOT NULL,
[Close] DECIMAL(18, 4) NOT NULL,
[AdjClose] DECIMAL(18, 4) NOT NULL,
[Volume] BIGINT NOT NULL,
CONSTRAINT [PK_HistoricalPrices] PRIMARY KEY CLUSTERED ([Symbol] ASC, [Date] ASC)
);
GO
پس از ایجاد جدول، دادههای ذخیره شده در فایلهای CSV را با استفاده از دستور `BULK INSERT` به جدول `[dbo].[HistoricalPrices]` وارد میکنیم. این فرآیند برای هر فایل CSV تکرار میشود. به عنوان مثال، برای وارد کردن دادههای UVXY از فایل `UVXY.csv`، دستور زیر را اجرا کنید:
BULK INSERT [dbo].[HistoricalPrices]
FROM 'C:\Temp\UVXY.csv'
WITH (
FIELDTERMINATOR = ',',
ROWTERMINATOR = '0x0a',
FIRSTROW = 2
);
این دستور برای سایر ETFها نیز با تغییر نام فایل و نماد تکرار میشود. سپس، یک پروژه SQL Server Analysis Services (SSAS) در Visual Studio ایجاد کرده و تنظیمات ردیابی تغییرات (Change Tracking) را در پایگاه داده `ETFS` فعال میکنیم تا SSAS بتواند تغییرات دادهها را تشخیص دهد:
ALTER DATABASE [ETFS] SET CHANGE_TRACKING = ON (TRACK_COLUMNS_UPDATED = ON);
در ادامه، یک Data Source View (DSV) در پروژه SSAS تعریف میکنیم. DSV یک لایه انتزاعی از دادههای منبع فراهم میکند و امکان اضافه کردن محاسبات نامگذاری شده (Named Calculations) را برای غنیسازی دادهها بدون تغییر در پایگاه داده اصلی فراهم میسازد. برای DSV، جدول `[dbo].[HistoricalPrices]` را انتخاب میکنیم. سپس، محاسبات مهمی را برای تحلیلهای بعدی تعریف میکنیم که شامل درصدهای تغییر قیمت در بازههای زمانی مختلف و معیارهای تکنیکال میشوند. در اینجا برخی از این محاسبات نامگذاری شده و فرمولهای آنها آورده شده است:
درصد تغییر قیمت بسته شدن تعدیل شده نسبت به روز قبل (LagAdjClosePercentage):
[LagAdjClosePercentage] = ([AdjClose] - [LagAdjClose]) / [LagAdjClose]
درصد تغییر قیمت بسته شدن تعدیل شده نسبت به دو روز قبل (TwoDayAdjClosePercentage):
[TwoDayAdjClosePercentage] = ([AdjClose] - [TwoDayLagAdjClose]) / [TwoDayLagAdjClose]
درصد تغییر قیمت بسته شدن تعدیل شده نسبت به سه روز قبل (ThreeDayAdjClosePercentage):
[ThreeDayAdjClosePercentage] = ([AdjClose] - [ThreeDayLagAdjClose]) / [ThreeDayLagAdjClose]
درصد تغییر قیمت بسته شدن تعدیل شده نسبت به پنج روز قبل (FiveDayAdjClosePercentage):
[FiveDayAdjClosePercentage] = ([AdjClose] - [FiveDayLagAdjClose]) / [FiveDayLagAdjClose]
درصد تغییر قیمت بسته شدن تعدیل شده نسبت به ده روز قبل (TenDayAdjClosePercentage):
[TenDayAdjClosePercentage] = ([AdjClose] - [TenDayLagAdjClose]) / [TenDayLagAdjClose]
تغییر روزانه قیمت (DailyChange):
[DailyChange] = [Close] - [Open]
دامنه نوسان روزانه (DailyRange):
[DailyRange] = [High] - [Low]
قیمت متوسط (AveragePrice):
[AveragePrice] = ([High] + [Low] + [Close]) / 3
محدوده واقعی (TrueRange) که بزرگترین اختلاف بین قیمت بالا و پایین فعلی، یا قیمت بالای فعلی و قیمت بسته شدن روز قبل، یا قیمت پایین فعلی و قیمت بسته شدن روز قبل است:
[TrueRange] = IIF([High] - [Low] > ABS([High] - [LagAdjClose]) AND [High] - [Low] > ABS([Low] - [LagAdjClose]), [High] - [Low], IIF(ABS([High] - [LagAdjClose]) > ABS([Low] - [LagAdjClose]), ABS([High] - [LagAdjClose]), ABS([Low] - [LagAdjClose])))
حجم جریان پول (MoneyFlowVolume):
[MoneyFlowVolume] = [Volume] * [AveragePrice]
سود یا زیان روزانه (DailyGainLoss) که وضعیت قیمت بسته شدن نسبت به قیمت باز شدن را نشان میدهد:
[DailyGainLoss] = IIF([Close] > [Open], 'Gain', IIF([Close] < [Open], 'Loss', 'Neutral'))
پس از تعریف DSV و محاسبات نامگذاری شده، نوبت به تعریف ساختار دادهکاوی (Mining Structure) و مدل دادهکاوی (Mining Model) میرسد. ساختار دادهکاوی شامل تمام ستونهای ورودی است که ممکن است در مدلهای دادهکاوی استفاده شوند. دو مدل دادهکاوی بر اساس این ساختار ایجاد میشود: یکی با استفاده از الگوریتم `Microsoft Time Series` برای پیشبینی روندهای آتی و دیگری با استفاده از الگوریتم `Microsoft Clustering` برای شناسایی گروههای ETF با رفتار مشابه. برای مدل Time Series، ستون `[AdjClose]` را به عنوان ستون پیشبینیشونده و `[Date]` را به عنوان ستون کلید سری زمانی تعیین میکنیم. برای مدل Clustering، ستونهایی مانند `[LagAdjClosePercentage]`, `[DailyChange]`, `[DailyRange]`, `[TrueRange]` و `[DailyGainLoss]` را به عنوان ورودی برای تحلیل خوشهای انتخاب میکنیم.
پس از پیکربندی مدلها، آنها را پردازش (Process) میکنیم. این مرحله شامل ساخت مدلها با استفاده از دادههای موجود و الگوریتمهای مشخص شده است. پس از پردازش موفقیتآمیز، میتوانیم نتایج را مرور و تفسیر کنیم.
مرور مدل خوشهای (Clustering Model) به ما اجازه میدهد ETFهایی را که در خوشههای مختلف قرار گرفتهاند مشاهده کنیم. به عنوان مثال، ممکن است ETFهای اهرمی معکوس مانند SPXU و SQQQ در یک خوشه با نوسانات بالا و ضرر کلی قرار گیرند، در حالی که SPY و QQQ (صندوقهای شاخص مرجع) در خوشههایی با رشد پایدارتر قرار میگیرند. UGL (طلای اهرمی) و GLD (طلای فیزیکی) نیز ممکن است در خوشهای مشترک با رفتاری نسبتاً پایدار و ارتباط قوی با قیمت طلا باشند. این تحلیل خوشهای به شناسایی الگوهای رفتاری مشترک بین این ابزارهای مالی کمک میکند.
برای مدل سری زمانی (Time Series)، میتوانیم پیشبینیهای آتی قیمت بسته شدن تعدیل شده را مشاهده کنیم. این مدل به خصوص برای پیشبینی حرکتهای کوتاهمدت آینده مفید است. میتوانیم پیشبینی را با استفاده از یک کوئری مانند زیر انجام دهیم:
SELECT PREDICTONEDVALUE([AdjClose]), PREDICTSTDEV([AdjClose])
FROM [Time Series]
PREDICT [AdjClose]
WITH MAX_PREDICTION_SEQUENCE = 5
این کوئری مقادیر پیشبینی شده و انحراف معیار پیشبینی را برای ۵ دوره آتی ارائه میدهد. همچنین میتوانید از افزونه دادهکاوی Excel برای SSAS استفاده کنید تا تجسم و تجزیه و تحلیل مدلها را به شیوهای کاربرپسندتر انجام دهید و به راحتی پیشبینیها و الگوهای کشف شده را درک کنید. این روش به متخصصان مالی امکان میدهد تا به سرعت بینشهای ارزشمندی از دادههای بازار به دست آورند و استراتژیهای سرمایهگذاری خود را بهینهسازی کنند.