محدودیتها:
+ **زمان:** ۱ ثانیه
+ **حافظه:** ۲۵۶ مگابایت
**در این مسابقه (بجز سوال 9 و 10) امکان استفاده از توابع آماده Numpy و Pandas وجود ندارد.**
# خواندن دادههای کندلاستیک
## مقدمه
شما به عنوان تحلیلگر مالی در یک شرکت سرمایهگذاری معتبر مشغول به کار هستید. مدیر شما فایلی شامل دادههای تاریخی سهام شرکت **TechX** را ارسال کرده است. این فایل شامل اطلاعاتی درباره **تاریخ، قیمت باز، قیمت بالا، قیمت پایین و قیمت بسته** است. وظیفه شما خواندن این دادهها و نمایش اطلاعات در قالب مشخص است.
## توضیح کندلاستیک
**نمودار کندلاستیک** یکی از ابزارهای اصلی **تحلیل تکنیکال** در بازارهای مالی است. هر کندل نشاندهنده یک بازه زمانی (مثلاً یک روز) بوده و شامل اطلاعات زیر است:
+ **قیمت باز (Open):** اولین قیمت معامله در ابتدای بازه زمانی.
+ **قیمت بسته (Close):** آخرین قیمت معامله در پایان بازه زمانی.
+ اگر **قیمت بسته** بالاتر از **قیمت باز** باشد، کندل **صعودی** است.
+ اگر **قیمت بسته** پایینتر از **قیمت باز** باشد، کندل **نزولی** است.
+ اگر **قیمت بسته** برابر با **قیمت باز** باشد، کندل **خنثی** است.
+ **بالاترین قیمت (High):** بیشترین قیمتی که در طول بازه زمانی ثبت شده است.
+ **پایینترین قیمت (Low):** کمترین قیمتی که در طول بازه زمانی ثبت شده است.
این اطلاعات به تحلیلگران کمک میکند تا روند بازار را بهتر درک کنند.
## وظیفه
برنامهای بنویسید که **ورودی دادهها** را بخواند و اطلاعات هر سطر را به **فرمت مشخصشده** چاپ کند:
```
تاریخ: <Date>, باز: <Open>, بالا: <High>, پایین: <Low>, بسته: <Close>
```
## فرمت ورودی
ورودی شامل چندین خط است که هر خط دارای **۵ مقدار** به ترتیب زیر میباشد:
```
Date, Open Price, High Price, Low Price, Close Price
```
مثال:
```
2025-01-01,100,110,90,105
```
## فرمت خروجی
برای هر **سطر داده** یک خط خروجی به **فرمت زیر** چاپ کنید:
```
Date: <Date>, Open: <Open>, High: <High>, Low: <Low>, Close: <Close>
```
## مثالها
### **ورودی نمونه ۱**
```
2025-01-01,100,110,90,105
```
### **خروجی نمونه ۱**
```
Date: 2025-01-01, Open: 100, High: 110, Low: 90, Close: 105
```
### **ورودی نمونه ۲**
```
2025-01-02,105,115,95,100
```
### **خروجی نمونه ۲**
```
Date: 2025-01-02, Open: 105, High: 115, Low: 95, Close: 100
```
### **ورودی نمونه ۳**
```
2025-01-03,100,105,95,100
```
### **خروجی نمونه ۳**
```
Date: 2025-01-03, Open: 100, High: 105, Low: 95, Close: 100
```
سوال یک
محدودیتها:
زمان: ۱ ثانیه
حافظه: ۲۵۶ مگابایت
در این مسابقه (بجز سوال 9 و 10) امکان استفاده از توابع آماده Numpy و Pandas وجود ندارد.
شما به عنوان تحلیلگر مالی در یک شرکت سرمایهگذاری معتبر مشغول به کار هستید. مدیر شما فایلی شامل دادههای تاریخی سهام شرکت TechX را ارسال کرده است. این فایل شامل اطلاعاتی درباره تاریخ، قیمت باز، قیمت بالا، قیمت پایین و قیمت بسته است. وظیفه شما خواندن این دادهها و نمایش اطلاعات در قالب مشخص است.
نمودار کندلاستیک یکی از ابزارهای اصلی تحلیل تکنیکال در بازارهای مالی است. هر کندل نشاندهنده یک بازه زمانی (مثلاً یک روز) بوده و شامل اطلاعات زیر است:
قیمت باز (Open): اولین قیمت معامله در ابتدای بازه زمانی.
قیمت بسته (Close): آخرین قیمت معامله در پایان بازه زمانی.
اگر قیمت بسته بالاتر از قیمت باز باشد، کندل صعودی است.
اگر قیمت بسته پایینتر از قیمت باز باشد، کندل نزولی است.
اگر قیمت بسته برابر با قیمت باز باشد، کندل خنثی است.
بالاترین قیمت (High): بیشترین قیمتی که در طول بازه زمانی ثبت شده است.
پایینترین قیمت (Low): کمترین قیمتی که در طول بازه زمانی ثبت شده است.
این اطلاعات به تحلیلگران کمک میکند تا روند بازار را بهتر درک کنند.
**سوال ۲: پیشپردازش دادهها (Preprocessing)**
## داستان
تیم شما وارد مرحلهای جدید شده است! پس از تحلیل اولیه دادههای کندلاستیک سهام **TechX**، متوجه شدهاید که دادههای دریافتی بهطور کامل منظم و پاک نیستند. ممکن است برخی سطرها شامل مقادیر خالی (Null) باشند، یا ستونهایی دارای دادههای ناسازگار و یا فرمتهای نادرست بهویژه در ستون تاریخ باشند. این مشکل میتواند روند تحلیلهای بعدی و مدلهای پیشبینی شما را تحتالشعاع قرار دهد.
برای حل این مسئله، تیم شما تصمیم گرفته که دادهها را پیشپردازش کند؛ یعنی:
+ سطرهایی که شامل مقادیر خالی در ستونهای ضروری (Date, Open, High, Low, Close) هستند حذف شوند.
+ تاریخها به فرمت صحیح (DateTime) تبدیل شوند.
+ دادهها بر اساس تاریخ مرتب شوند تا روند تغییرات بهدرستی قابل بررسی باشد.
وظیفه شما کمک به تیم است تا دادهها را تمیز کرده و در قالبی منظم برای تحلیلهای پیشرفتهتر آماده کند.
## فرمت ورودی
ورودی شامل چندین سطر است که هر سطر دارای **۵ فیلد** به ترتیب زیر است:
```
Date, Open, High, Low, Close
```
ممکن است برخی از فیلدها خالی (یا حاوی رشتهای خالی) باشند.
در ابتدا از کاربر درخواست میشود که تعداد سطرهایی که میخواهد وارد کند را اعلام نماید. سپس به تعداد همان سطر از کاربر داده گرفته میشود.
## فرمت خروجی
خروجی باید شامل سطر عنوان (header) و سپس تمامی سطرهای پاکشده و مرتب شده (بر اساس تاریخ به صورت صعودی) باشد.
هر سطر بهصورت یک خط چاپ شود.
## مثالها
### **ورودی نمونه**
در ابتدا از کاربر خواسته میشود که تعداد سطرها را وارد کند:
```
4
```
سپس ۴ سطر داده به شکل زیر وارد میشود:
```
2025-01-03,100,105,95,100
2025-01-01,100,110,90,105
2025-01-02,105,115,,100
2025-01-04,110,120,100,115
```
### **خروجی نمونه**
```
2025-01-01,100,110,90,105
2025-01-03,100,105,95,100
2025-01-04,110,120,100,115
```
### **توضیح**
سطر سوم (با تاریخ 2025-01-02) به دلیل داشتن مقدار خالی در ستون **Low** حذف شده است.
سطرهای باقیمانده بر اساس تاریخ به ترتیب صعودی (2025-01-01، 2025-01-03، 2025-01-04) مرتب شدهاند.
## نکات
+ **مقادیر خالی** در هر ستون ضروری مانند تاریخ، قیمت باز، قیمت بالا، قیمت پایین و قیمت بسته باید حذف شوند.
+ فرمت تاریخ باید به **فرمت صحیح DateTime** تبدیل شود.
+ دادهها باید بر اساس **تاریخ به صورت صعودی** مرتب شوند.
تیم شما وارد مرحلهای جدید شده است! پس از تحلیل اولیه دادههای کندلاستیک سهام TechX، متوجه شدهاید که دادههای دریافتی بهطور کامل منظم و پاک نیستند. ممکن است برخی سطرها شامل مقادیر خالی (Null) باشند، یا ستونهایی دارای دادههای ناسازگار و یا فرمتهای نادرست بهویژه در ستون تاریخ باشند. این مشکل میتواند روند تحلیلهای بعدی و مدلهای پیشبینی شما را تحتالشعاع قرار دهد.
برای حل این مسئله، تیم شما تصمیم گرفته که دادهها را پیشپردازش کند؛ یعنی:
سطرهایی که شامل مقادیر خالی در ستونهای ضروری (Date, Open, High, Low, Close) هستند حذف شوند.
تاریخها به فرمت صحیح (DateTime) تبدیل شوند.
دادهها بر اساس تاریخ مرتب شوند تا روند تغییرات بهدرستی قابل بررسی باشد.
وظیفه شما کمک به تیم است تا دادهها را تمیز کرده و در قالبی منظم برای تحلیلهای پیشرفتهتر آماده کند.
ورودی شامل چندین سطر است که هر سطر دارای ۵ فیلد به ترتیب زیر است:
Date, Open, High, Low, Close
Plain text
ممکن است برخی از فیلدها خالی (یا حاوی رشتهای خالی) باشند.
در ابتدا از کاربر درخواست میشود که تعداد سطرهایی که میخواهد وارد کند را اعلام نماید. سپس به تعداد همان سطر از کاربر داده گرفته میشود.
سطر سوم (با تاریخ 2025-01-02) به دلیل داشتن مقدار خالی در ستون Low حذف شده است.
سطرهای باقیمانده بر اساس تاریخ به ترتیب صعودی (2025-01-01، 2025-01-03، 2025-01-04) مرتب شدهاند.
مقادیر خالی در هر ستون ضروری مانند تاریخ، قیمت باز، قیمت بالا، قیمت پایین و قیمت بسته باید حذف شوند.
فرمت تاریخ باید به فرمت صحیح DateTime تبدیل شود.
دادهها باید بر اساس تاریخ به صورت صعودی مرتب شوند.
**سوال ۳: شمارش کندلهای صعودی، نزولی و خنثی**
## داستان و آموزش
پس از بررسی اولیه دادههای سهام **TechX**، مدیر تحلیل مالی از شما خواسته است تا روند کلی بازار را با استفاده از دادههای کندلاستیک بررسی کنید. او میخواهد بدانید در طول یک دوره زمانی مشخص، چند روز بازار دارای روند **صعودی، نزولی** یا **بدون تغییر** (خنثی) بوده است.
### قوانین طبقهبندی کندلها
+ **کندل صعودی:** اگر قیمت بسته (Close) بالاتر از قیمت باز (Open) باشد.
+ **کندل نزولی:** اگر قیمت بسته کمتر از قیمت باز باشد.
+ **کندل خنثی:** اگر قیمت بسته برابر با قیمت باز باشد.
## وظیفه
برنامهای بنویسید که دادههای کندلاستیک را از **STDIN** بخواند و تعداد کندلهای صعودی، نزولی و خنثی را به ترتیب زیر چاپ کند:
1. خط اول: تعداد کندلهای صعودی
2. خط دوم: تعداد کندلهای نزولی
3. خط سوم: تعداد کندلهای خنثی
## فرمت ورودی
ورودی شامل چندین سطر است که هر سطر دارای ۵ فیلد به ترتیب زیر است:
```
Date, Open, High, Low, Close
```
## فرمت خروجی
خروجی شامل ۳ خط است:
1. خط اول: تعداد کندلهای صعودی
2. خط دوم: تعداد کندلهای نزولی
3. خط سوم: تعداد کندلهای خنثی
## مثالها
### **ورودی نمونه**
در ابتدا از کاربر خواسته میشود که تعداد سطرها را وارد کند:
```
3
```
سپس ۳ سطر داده به شکل زیر وارد میشود:
```
2025-01-01,100,110,90,105
2025-01-02,105,115,95,100
2025-01-03,100,105,95,100
```
### **خروجی نمونه**
```
1
1
1
```
### **توضیح**
+ در تاریخ **2025-01-01**، قیمت بسته (105) بالاتر از قیمت باز (100) است، بنابراین کندل **صعودی** است.
+ در تاریخ **2025-01-02**، قیمت بسته (100) پایینتر از قیمت باز (105) است، بنابراین کندل **نزولی** است.
+ در تاریخ **2025-01-03**، قیمت بسته (100) برابر با قیمت باز (100) است، بنابراین کندل **خنثی** است.
## نکات
+ برای تعیین نوع کندل باید مقایسهای بین **قیمت باز** و **قیمت بسته** انجام شود.
+ نتیجهگیری باید به ترتیب **کندلهای صعودی، نزولی و خنثی** در سه خط جداگانه چاپ شود.
پس از بررسی اولیه دادههای سهام TechX، مدیر تحلیل مالی از شما خواسته است تا روند کلی بازار را با استفاده از دادههای کندلاستیک بررسی کنید. او میخواهد بدانید در طول یک دوره زمانی مشخص، چند روز بازار دارای روند صعودی، نزولی یا بدون تغییر (خنثی) بوده است.
برای تعیین نوع کندل باید مقایسهای بین قیمت باز و قیمت بسته انجام شود.
نتیجهگیری باید به ترتیب کندلهای صعودی، نزولی و خنثی در سه خط جداگانه چاپ شود.
**سؤال ۴: پردازش ساده بر روی دادهها (Simple Data Processing)**
پس از اتمام موفقیتآمیز مراحل **پیشپردازش** و **تمیز کردن دادههای** سهام **TechX**، تیم شما اکنون آماده است تا تحلیلهای اولیه و سریع بر روی دادهها را انجام دهد.
مدیر تیم اعلام کرده که نوبت به **استخراج شاخصهای کلیدی بازار** رسیده است تا بتواند روند تغییرات قیمت را بهتر درک کند و **تصمیمات بهتری برای معاملات آینده** بگیرد.
شما و تیمتان تصمیم گرفتهاید **دو شاخص مهم** را محاسبه کنید:
1. **میانگین متحرک ۵ روزه (5-SMA)**: میانگین قیمت **بسته شدن (Close)** در ۵ روز متوالی که نوسانات را کاهش داده و روند کلی قیمتها را نشان میدهد.
2. **درصد تغییرات روزانه (Daily Change)**: میزان تغییر **قیمت بسته (Close)** هر روز نسبت به روز قبل، برحسب درصد. این شاخص شدت تغییرات بازار را نشان میدهد.
با این تحلیل، تیم شما قادر خواهد بود **روند بازار** را بهتر مشاهده کرده و بهترین استراتژیها را برای **معاملات روزانه** تدوین کند.
## **وظیفه**
برنامهای بنویسید که دادههای سهام **TechX** را دریافت کرده و **دو شاخص زیر** را محاسبه کند:
+ **5-SMA**: میانگین متحرک **۵ روزه** قیمت **بستهشدن (Close)**
+ **Daily Change**: درصد تغییرات روزانه **قیمت بستهشدن** نسبت به روز قبل
سپس، دادههای پردازششده را در قالب یک جدول **بهروز شده** نمایش دهد.
+ **برای اولین روز، مقدار Daily Change برابر "N/A" است.**
+ **برای روزهایی که کمتر از ۵ مقدار برای محاسبه 5-SMA موجود است، مقدار "N/A" ثبت شود.**
## **فرمت ورودی**
ورودی شامل چندین خط است که هر سطر دارای **۵ مقدار** به ترتیب زیر میباشد:
```
Date, Open, High, Low, Close
```
+ دادهها از ورودی **STDIN** خوانده میشوند.
+ فرمت تاریخ به صورت `YYYY-MM-DD` است.
## **فرمت خروجی**
خروجی شامل جدولی است که دارای **۷ مقدار** زیر میباشد:
```
Date, Open, High, Low, Close, 5-SMA, Daily Change
```
+ مقدار **5-SMA** برای **چهار روز اول** برابر **"N/A"** است.
+ مقدار **Daily Change** برای **روز اول** برابر **"N/A"** است.
## **مثالها**
### **ورودی نمونه**
در ابتدا از کاربر خواسته میشود که تعداد سطرها را وارد کند:
```
6
```
سپس 6 سطر داده به شکل زیر وارد میشود:
```
2025-01-01,100,110,90,105
2025-01-02,105,115,95,110
2025-01-03,110,120,100,115
2025-01-04,115,125,105,120
2025-01-05,120,130,110,125
2025-01-06,125,135,115,130
```
### **خروجی نمونه**
```
2025-01-01,100,110,90,105,N/A,N/A
2025-01-02,105,115,95,110,N/A,4.76
2025-01-03,110,120,100,115,N/A,4.55
2025-01-04,115,125,105,120,N/A,4.35
2025-01-05,120,130,110,125,115.00,4.17
2025-01-06,125,135,115,130,120.00,4.00
```
### **توضیح محاسبات**
#### **1. Daily Change (درصد تغییر روزانه)**
**فرمول:**
+ برای **روز دوم:**
+ برای **روز سوم:**
+ برای **روز چهارم:**
+ برای **روز پنجم:**
+ برای **روز ششم:**
#### **2. 5-SMA (میانگین متحرک ۵ روزه)**
**فرمول:**
+ مقدار 5-SMA برای اولین **۴ روز** وجود ندارد (`N/A`)، زیرا تعداد داده کافی نیست.
+ **برای روز پنجم:**
+ **برای روز ششم:**
## **نکات مهم**
✔ **اولین روز مقدار Daily Change ندارد، پس مقدار "N/A" است.**
✔ **قبل از روز پنجم مقدار 5-SMA محاسبه نمیشود، پس مقدار "N/A" است.**
✔ **خروجی باید دقیقاً مطابق با فرمت خواسته شده باشد.**
سوال چهار
سؤال ۴: پردازش ساده بر روی دادهها (Simple Data Processing)
پس از اتمام موفقیتآمیز مراحل پیشپردازش و تمیز کردن دادههای سهام TechX، تیم شما اکنون آماده است تا تحلیلهای اولیه و سریع بر روی دادهها را انجام دهد.
مدیر تیم اعلام کرده که نوبت به استخراج شاخصهای کلیدی بازار رسیده است تا بتواند روند تغییرات قیمت را بهتر درک کند و تصمیمات بهتری برای معاملات آینده بگیرد.
شما و تیمتان تصمیم گرفتهاید دو شاخص مهم را محاسبه کنید:
میانگین متحرک ۵ روزه (5-SMA): میانگین قیمت بسته شدن (Close) در ۵ روز متوالی که نوسانات را کاهش داده و روند کلی قیمتها را نشان میدهد.
درصد تغییرات روزانه (Daily Change): میزان تغییر قیمت بسته (Close) هر روز نسبت به روز قبل، برحسب درصد. این شاخص شدت تغییرات بازار را نشان میدهد.
با این تحلیل، تیم شما قادر خواهد بود روند بازار را بهتر مشاهده کرده و بهترین استراتژیها را برای معاملات روزانه تدوین کند.
✔ اولین روز مقدار Daily Change ندارد، پس مقدار "N/A" است.
✔ قبل از روز پنجم مقدار 5-SMA محاسبه نمیشود، پس مقدار "N/A" است.
✔ خروجی باید دقیقاً مطابق با فرمت خواسته شده باشد.
### محدودیتها
+ **محدودیت زمان:** ۱ ثانیه
+ **محدودیت حافظه:** ۲۵۶ مگابایت
# شبیهسازی استراتژی معاملاتی مبتنی بر میانگین متحرک
مدیر تیم تحلیل مالی تصمیم گرفته است تا یک **استراتژی معاملاتی مبتنی بر میانگین متحرک** را بر روی دادههای سهام **TechX** شبیهسازی کند. این استراتژی بر اساس دو شاخص میانگین متحرک پیادهسازی میشود:
+ **میانگین متحرک کوتاهمدت (۵ روزه - 5-SMA):**
این شاخص با محاسبه میانگین قیمت بسته طی **۵ روز متوالی**، نوسانات کوتاهمدت را نشان میدهد.
+ **میانگین متحرک بلندمدت (۲۰ روزه - 20-SMA):**
این شاخص روند کلی قیمتها را در یک بازه زمانی **طولانیتر** مشخص میکند.
## قوانین استراتژی
۱. **سیگنال خرید:**
اگر در یک روز، میانگین متحرک ۵ روزه از **پایین به بالای** میانگین متحرک ۲۰ روزه عبور کند، **سیگنال خرید** صادر میشود.
یعنی:
۲. **سیگنال فروش:**
اگر در یک روز، میانگین متحرک ۵ روزه از **بالای میانگین متحرک ۲۰ روزه به زیر آن** برگردد، **سیگنال فروش** صادر میشود.
یعنی:
## جزئیات شبیهسازی
+ سرمایه اولیه: **۱۰,۰۰۰ دلار**
+ هنگام دریافت **سیگنال خرید** (و اگر موقعیتی باز نباشد)، کل سرمایه به قیمت بستهی همان روز **خریداری** میشود.
+ هنگام دریافت **سیگنال فروش** (و اگر موقعیتی باز باشد)، تمام سهمها به قیمت بسته همان روز **فروخته** میشوند.
+ در پایان دوره، اگر هنوز موقعیتی باز باقی مانده باشد، **سهمهای باقیمانده با آخرین قیمت بسته نقد میشوند**.
+ خروجی نهایی، **ارزش نهایی پرتفوی** است که باید **با دقت دو رقم اعشار** نمایش داده شود.
## فرمت ورودی
ورودی از طریق **`STDIN`** دریافت میشود.
+ خط اول شامل **عنوان (header)** دادههای CSV است.
+ هر خط بعدی شامل **پنج فیلد** به ترتیب زیر است:
| ستون | توضیح |
| ------- | ------------------------ |
| `Date` | تاریخ (فرمت: YYYY-MM-DD) |
| `Open` | قیمت باز شدن |
| `High` | بیشترین قیمت روز |
| `Low` | کمترین قیمت روز |
| `Close` | قیمت بسته شدن |
## فرمت خروجی
خروجی شامل **یک عدد** است که نشاندهنده **ارزش نهایی پرتفوی (به دلار)** است. این مقدار باید **با دقت دو رقم اعشار** نمایش داده شود.
## مثال
### **ورودی نمونه**
در ابتدا از کاربر خواسته میشود که تعداد سطرها را وارد کند:
```
21
```
سپس 21 سطر داده به شکل زیر وارد میشود:
```
2025-01-01,55,55,55,55
2025-01-02,55,55,55,55
2025-01-03,55,55,55,55
2025-01-04,55,55,55,55
2025-01-05,55,55,55,55
2025-01-06,55,55,55,55
2025-01-07,55,55,55,55
2025-01-08,55,55,55,55
2025-01-09,55,55,55,55
2025-01-10,55,55,55,55
2025-01-11,55,55,55,55
2025-01-12,55,55,55,55
2025-01-13,55,55,55,55
2025-01-14,55,55,55,55
2025-01-15,45,45,45,45
2025-01-16,45,45,45,45
2025-01-17,45,45,45,45
2025-01-18,45,45,45,45
2025-01-19,45,45,45,45
2025-01-20,100,100,100,100
2025-01-21,30,30,30,30
```
### **توضیح نمونه**
#### **محاسبه میانگین متحرک**
##### **روز ۱۹ (۲۰۲۵-۰۱-۱۹)**
+ 5-SMA = **(45+45+45+45+45) / 5 = 45**
+ 20-SMA ≈ **52.37**
+ چون **5-SMA < 20-SMA** → **هیچ سیگنال خریدی صادر نمیشود**.
##### **روز ۲۰ (۲۰۲۵-۰۱-۲۰)**
+ 5-SMA = **(45+45+45+45+100) / 5 = 56**
+ 20-SMA = **54.75**
+ چون **5-SMA** از **20-SMA** **عبور کرده است** → **سیگنال خرید** صادر میشود.
+ با ۱۰,۰۰۰ دلار و قیمت بسته ۱۰۰ دلار، تعداد سهم خریداری شده:
```
10,000 / 100 = 100 سهم
```
##### **روز ۲۱ (۲۰۲۵-۰۱-۲۱)**
+ 5-SMA = **(45+45+45+100+30) / 5 = 53**
+ 20-SMA ≈ **53.57**
+ چون **5-SMA < 20-SMA** → **سیگنال فروش** صادر میشود.
+ با فروش ۱۰۰ سهم به قیمت بسته ۳۰ دلار، سرمایه نهایی:
```
100 × 30 = 3,000 دلار
```
### **خروجی نمونه**
```
3000.00
```
شبیهسازی استراتژی معاملاتی مبتنی بر میانگین متحرک🔗
مدیر تیم تحلیل مالی تصمیم گرفته است تا یک استراتژی معاملاتی مبتنی بر میانگین متحرک را بر روی دادههای سهام TechX شبیهسازی کند. این استراتژی بر اساس دو شاخص میانگین متحرک پیادهسازی میشود:
میانگین متحرک کوتاهمدت (۵ روزه - 5-SMA):
این شاخص با محاسبه میانگین قیمت بسته طی ۵ روز متوالی، نوسانات کوتاهمدت را نشان میدهد.
میانگین متحرک بلندمدت (۲۰ روزه - 20-SMA):
این شاخص روند کلی قیمتها را در یک بازه زمانی طولانیتر مشخص میکند.
### **سوال ۶: شبیهسازی استراتژی معاملاتی پیشرفته**
برای شبیهسازی استراتژی معاملاتی پیشرفته که شامل استفاده از **میانگین متحرک ساده (SMA20)** و **شاخص قدرت نسبی (RSI)** میشود، میتوانیم برنامهای بنویسیم که دادههای سهام را پردازش کرده و طبق قوانین ارائه شده، اقدام به خرید و فروش سهام کند. در اینجا مراحل و توضیحات لازم برای پیادهسازی این استراتژی آورده شده است.
### **قوانین استراتژی:**
1. **سیگنال خرید**:
+ زمانی که **هیچ موقعیتی باز نباشد**، سیگنال خرید به شرح زیر است:
+ **RSI (با دوره ۱۴ روزه) کمتر از ۳۰** باشد (اشباع فروش).
+ **قیمت بسته (Close)** بالاتر از **میانگین متحرک ۲۰ روزه (SMA20)** باشد.
+ در این صورت، **تمام سرمایه موجود به قیمت بسته خریداری میشود**.
2. **سیگنال فروش**:
+ زمانی که **موقعیتی باز باشد**، دو حالت برای فروش وجود دارد:
+ **فروش به دلیل تغییر روند**:
+ اگر **RSI بیشتر از ۷۰** باشد (اشباع خرید) و **قیمت بسته کمتر از SMA20** باشد.
+ **فروش به دلیل استاپلاس**:
+ اگر **قیمت بسته کمتر از ۹۵٪ از قیمت خرید** شود.
+ در هر دو حالت، **تمام سهمهای خریداریشده به قیمت بسته روز جاری فروخته میشود**.
3. **پایان دوره معاملاتی**:
+ در پایان، اگر **هنوز موقعیتی باز باشد**، تمام سهام با **آخرین قیمت بسته** فروخته میشود.
### **وظیفه شما:**
شبیهسازی استراتژی معاملاتی بالا به این صورت است که ابتدا باید دادهها شامل قیمتهای باز، بالا، پایین و بسته روزانه سهام وارد شوند. سپس باید شاخصهای **SMA20** و **RSI (14)** محاسبه شوند و طبق قوانین بالا استراتژی خرید و فروش اجرا گردد.
### **ورودی دادهها:**
ورودی شامل تعداد روزهای معاملاتی و برای هر روز شامل ۵ مقدار: تاریخ، قیمت باز، قیمت بالا، قیمت پایین، قیمت بسته است.
### **فرمت ورودی:**
```
تعداد روزهای معاملاتی تاریخ,باز,بالا,پایین,بسته
```
### **فرمت خروجی:**
خروجی یک عدد اعشاری است که نشاندهنده ارزش نهایی پرتفوی بعد از اجرای استراتژی است.
### **نمونه ورودی:**
در ابتدا از کاربر خواسته میشود که تعداد سطرها را وارد کند:
در ابتدا از کاربر خواسته میشود که تعداد سطرها را وارد کند:
```
22
```
سپس ۲۲ سطر داده به شکل زیر وارد میشود:
```
2025-01-01,100,100,100,100
2025-01-02,99,99,99,99
2025-01-03,98,98,98,98
2025-01-04,97,97,97,97
2025-01-05,96,96,96,96
2025-01-06,95,95,95,95
2025-01-07,94,94,94,94
2025-01-08,93,93,93,93
2025-01-09,92,92,92,92
2025-01-10,91,91,91,91
2025-01-11,90,90,90,90
2025-01-12,89,89,89,89
2025-01-13,88,88,88,88
2025-01-14,87,87,87,87
2025-01-15,87,87,87,87
2025-01-16,88,88,88,88
2025-01-17,89,89,89,89
2025-01-18,90,90,90,90
2025-01-19,91,91,91,91
2025-01-20,92,92,92,92
2025-01-21,93,93,93,93
2025-01-22,85,85,85,85
```
### **نمونه خروجی:**
```
9144.48
```
### **توضیحات نمونه:**
1. در ابتدا **SMA20** و **RSI** برای هر روز محاسبه میشود.
2. فرض کنید در **روز ۲۱** (۲۰۲۵-۰۱-۲۱) شرایط خرید برقرار است، زیرا:
+ **RSI کمتر از ۳۰** است (اشباع فروش).
+ **قیمت بسته (۹۳)** بالاتر از **SMA20** است.
3. در **روز ۲۲** (۲۰۲۵-۰۱-۲۲)، قیمت به **۸۵** کاهش مییابد که کمتر از **۹۵٪ قیمت خرید** (۸۸.۳۵) است، پس استاپلاس فعال شده و تمام سهام فروخته میشود.
4. نتیجه نهایی مقدار پرتفوی به **9144.48 دلار** خواهد بود.
برای شبیهسازی استراتژی معاملاتی پیشرفته که شامل استفاده از میانگین متحرک ساده (SMA20) و شاخص قدرت نسبی (RSI) میشود، میتوانیم برنامهای بنویسیم که دادههای سهام را پردازش کرده و طبق قوانین ارائه شده، اقدام به خرید و فروش سهام کند. در اینجا مراحل و توضیحات لازم برای پیادهسازی این استراتژی آورده شده است.
شبیهسازی استراتژی معاملاتی بالا به این صورت است که ابتدا باید دادهها شامل قیمتهای باز، بالا، پایین و بسته روزانه سهام وارد شوند. سپس باید شاخصهای SMA20 و RSI (14) محاسبه شوند و طبق قوانین بالا استراتژی خرید و فروش اجرا گردد.
فرض کنید در روز ۲۱ (۲۰۲۵-۰۱-۲۱) شرایط خرید برقرار است، زیرا:
RSI کمتر از ۳۰ است (اشباع فروش).
قیمت بسته (۹۳) بالاتر از SMA20 است.
در روز ۲۲ (۲۰۲۵-۰۱-۲۲)، قیمت به ۸۵ کاهش مییابد که کمتر از ۹۵٪ قیمت خرید (۸۸.۳۵) است، پس استاپلاس فعال شده و تمام سهام فروخته میشود.
نتیجه نهایی مقدار پرتفوی به 9144.48 دلار خواهد بود.
## محدودیتها
+ **محدودیت زمان:** ۱ ثانیه
+ **محدودیت حافظه:** ۲۵۶ مگابایت
## صورتمسئله
تیم شما تصمیم گرفته است که برای کاهش **ریسک** و افزایش **تنوع سبد سرمایهگذاری**، داراییهایی را انتخاب کند که بازدههای روزانه آنها با یکدیگر همبستگی زیادی نداشته باشند.
### ورودی
دادههای تاریخی چند دارایی مختلف ارائه شده است که شامل موارد زیر است:
+ ستون اول: تاریخ (با فرمت YYYY-MM-DD)
+ ستونهای بعدی: قیمت بستهشدن روزانه هر دارایی (مانند `Asset1`، `Asset2`، ...)
### وظایف
1. محاسبه **بازده روزانه** (درصد تغییرات) هر دارایی
2. محاسبه **میانگین بازده** روزانه هر دارایی
3. محاسبه **ماتریس همبستگی** بازدههای روزانه
4. انتخاب داراییها بر اساس **یک الگوریتم حریصانه (Greedy)**:
+ داراییها را به ترتیب نزولی میانگین بازده مرتب کنید.
+ هر دارایی را **در صورتی که همبستگی آن با تمام داراییهای انتخابشده تا آن لحظه کمتر از ۰.۵ باشد، به سبد اضافه کنید.**
5. شبیهسازی استراتژی **خرید و نگهداری (Buy and Hold)** با سرمایه اولیه ۱۰,۰۰۰ دلار:
+ سرمایه بهطور مساوی بین داراییهای انتخابشده توزیع شود.
+ برای هر دارایی، تعداد سهمهای خریداریشده و ارزش نهایی محاسبه شود.
6. چاپ **تعداد داراییهای انتخابشده** و **ارزش نهایی سبد سرمایهگذاری** (گرد شده به دو رقم اعشار).
## قالب ورودی
ورودی شامل چندین خط است:
+ خط اول: عنوان ستونها
+ خطهای بعدی: قیمتهای بستهشدن روزانه داراییها
### نمونه ورودی
در ابتدا از کاربر خواسته میشود که تعداد سطرها را وارد کند:
```
5
```
سپس 5 سطر داده به شکل زیر وارد میشود:
```
2025-01-01 100 200 300
2025-01-02 102 198 310
2025-01-03 104 202 320
2025-01-04 106 204 315
2025-01-05 108 206 330
```
## قالب خروجی
خروجی شامل دو خط است:
1. **تعداد داراییهای انتخابشده** (عدد صحیح)
2. **ارزش نهایی سبد سرمایهگذاری** (گرد شده به دو رقم اعشار)
### نمونه خروجی
```
2
10900.00
```
## توضیح نمونه
### محاسبه بازده روزانه
فرمول بازده روزانه:
\text{بازده} =
$$
\frac{\text{قیمت روز جاری} - \text{قیمت روز قبل}}{\text{قیمت روز قبل}}
$$
**برای `Asset1`:**
روز ۲: $$ \frac{102 - 100}{100} = 0.02 $$
روز ۳: $$ \frac{104 - 102}{102} \approx 0.0196 $$
روز ۴: $$ \frac{106 - 104}{104} \approx 0.0192 $$
روز ۵: $$ \frac{108 - 106}{106} \approx 0.0189 $$
**میانگین بازده:**
$$
\frac{0.02 + 0.0196 + 0.0192 + 0.0189}{4} \approx 0.0194
$$
همین روند برای `Asset2` و `Asset3` تکرار میشود.
### انتخاب داراییها
1. دارایی با **بیشترین میانگین بازده** (مثلاً `Asset3`) انتخاب میشود.
2. سپس `Asset1` بررسی میشود:
+ **اگر همبستگی آن با `Asset3` کمتر از ۰.۵ باشد، انتخاب میشود.**
### شبیهسازی خرید و نگهداری
+ سرمایه اولیه = **۱۰,۰۰۰ دلار**
+ بین دو دارایی **مساوی تقسیم میشود**: هر کدام **۵,۰۰۰ دلار**
+ **محاسبه تعداد سهمهای خریداریشده** و **ارزش نهایی**:
| دارایی | قیمت روز اول | قیمت روز آخر | تعداد سهم خریدهشده | ارزش نهایی |
| ------ | ------------ | ------------ | ------------------- | --------------------- |
| Asset3 | 300 | 330 | 5000 / 300 ≈ 16.67 | 16.67 × 330 = 5500.00 |
| Asset1 | 100 | 108 | 5000 / 100 = 50 | 50 × 108 = 5400.00 |
**ارزش نهایی سبد:**
$$
5500.00 + 5400.00 = 10900.00
$$
تیم شما تصمیم گرفته است که برای کاهش ریسک و افزایش تنوع سبد سرمایهگذاری، داراییهایی را انتخاب کند که بازدههای روزانه آنها با یکدیگر همبستگی زیادی نداشته باشند.
بین دو دارایی مساوی تقسیم میشود: هر کدام ۵,۰۰۰ دلار
محاسبه تعداد سهمهای خریداریشده و ارزش نهایی:
دارایی
قیمت روز اول
قیمت روز آخر
تعداد سهم خریدهشده
ارزش نهایی
Asset3
300
330
5000 / 300 ≈ 16.67
16.67 × 330 = 5500.00
Asset1
100
108
5000 / 100 = 50
50 × 108 = 5400.00
ارزش نهایی سبد:
5500.00+5400.00=10900.00
+ **محدودیت زمان:** ۱ ثانیه
+ **محدودیت حافظه:** ۲۵۶ مگابایت
# سوال ۸: شبیهسازی استراتژی معاملاتی جامع با هزینههای تراکنش، لغزش قیمت و مدیریت ریسک پویا
**داستان:**
در این مرحله، تیم شما به بالاترین سطح چالش در دنیای معاملات الگوریتمی رسیده است. مدیر ارشد سرمایهگذاری خواسته است که استراتژی معاملاتیای طراحی شود که تمامی شرایط واقعی بازار را در نظر بگیرد. در این استراتژی پیشرفته، علاوه بر استفاده از شاخصهای فنی مانند میانگین متحرک ۱۰ روزه (SMA10) و شاخص قدرت نسبتی ۱۴ روزه (RSI)، هزینههای تراکنش، لغزش قیمت و مدیریت ریسک پویا نیز مد نظر قرار میگیرند.
**قوانین استراتژی:**
+ **سیگنال خرید:**
در صورتی که هیچ موقعیتی باز نباشد و شرایط زیر برقرار باشد:
+ شاخص RSI کمتر از ۳۰
+ قیمت بسته روز جاری بالاتر از SMA10 باشد
+ **مدیریت ریسک:**
+ ریسک هر معامله حداکثر ۲٪ از سرمایه اولیه (۱۰,۰۰۰ دلار) محسوب میشود.
+ سطح استاپلاس برابر با ۹۵٪ از قیمت خرید (با احتساب لغزش) در نظر گرفته میشود.
+ تعداد سهم خریداریشده بهگونهای تعیین میشود که ضرر احتمالی (تفاوت بین قیمت خرید و استاپلاس به ازای هر سهم) برابر با ۲٪ از سرمایه اولیه باشد.
+ **لغزش و هزینه تراکنش:**
+ در زمان خرید، قیمت خرید با لغزش ۰.۲٪ افزایش مییابد.
+ هزینه تراکنش برابر با ۰.۱٪ از ارزش معامله از سرمایه کسر میشود.
+ **سیگنال فروش:**
اگر موقعیتی باز باشد، دو حالت خروج وجود دارد:
+ **فروش به دلیل تغییر روند:** در صورتی که شاخص RSI بیش از ۷۰ شود.
+ **فروش به دلیل استاپلاس:** اگر قیمت بسته روز جاری کمتر از ۹۵٪ از قیمت خرید (ثبتشده پس از لغزش خرید) شود.
در زمان فروش (به جز فروش نهایی در پایان دوره)، قیمت فروش با لغزش ۰.۲٪ کاهش مییابد و هزینه تراکنش ۰.۱٪ از ارزش فروش کسر میشود.
+ **پایان دوره معاملاتی:**
اگر موقعیتی باز باقی مانده باشد، آن را با آخرین قیمت بسته (بدون لغزش، اما با اعمال هزینه تراکنش) میفروشید.
هدف نهایی شبیهسازی، محاسبه ارزش نهایی پرتفوی (سرمایه نقدی نهایی) پس از اجرای تمام معاملات است. مقدار نهایی باید به دو رقم اعشار گرد شود.
# فرمت ورودی
ورودی از طریق **STDIN** دریافت میشود.
سطر اول شامل عنوان (header) است و هر سطر بعدی شامل ۵ فیلد به ترتیب زیر میباشد:
```
Date,Open,High,Low,Close
```
+ **فرمت تاریخ:** YYYY-MM-DD
+ **توجه:** کاربر باید دادهها را دقیقاً به همان فرمت ارائه دهد که در نمونه ورودی نشان داده شده است.
# فرمت خروجی
خروجی شامل یک عدد (ارزش نهایی پرتفوی به دلار) است که به دو رقم اعشار گرد شده باشد.
# نمونه ورودی
در ابتدا از کاربر خواسته میشود که تعداد سطرها را وارد کند:
```
20
```
سپس ۲۰ سطر داده به شکل زیر وارد میشود:
```
2025-01-01,100,105,95,102
2025-01-02,102,108,101,107
2025-01-03,107,110,105,106
2025-01-04,106,112,105,111
2025-01-05,111,115,110,114
2025-01-06,114,118,113,117
2025-01-07,117,120,115,116
2025-01-08,116,119,115,118
2025-01-09,118,122,117,121
2025-01-10,121,125,120,123
2025-01-11,123,127,122,126
2025-01-12,126,130,125,128
2025-01-13,128,133,127,131
2025-01-14,131,135,130,134
2025-01-15,134,138,133,137
2025-01-16,137,140,136,139
2025-01-17,139,142,138,141
2025-01-18,141,145,140,144
2025-01-19,144,148,143,147
2025-01-20,147,150,146,149
```
# نمونه خروجی
```
10519.42
```
_توجه:_
این نمونه ورودی صرفاً جهت نشان دادن فرمت داده است. در شرایط واقعی، ممکن است تعداد روزها بیشتر بوده و شرایط معاملاتی پیچیدهتری ایجاد شود. مقدار نهایی نمونه است؛ مقدار نهایی بسته به دادههای واقعی و سیگنالهای معاملاتی ممکن است متفاوت باشد.
سوال هشت
محدودیت زمان: ۱ ثانیه
محدودیت حافظه: ۲۵۶ مگابایت
سوال ۸: شبیهسازی استراتژی معاملاتی جامع با هزینههای تراکنش، لغزش قیمت و مدیریت ریسک پویا🔗
داستان:
در این مرحله، تیم شما به بالاترین سطح چالش در دنیای معاملات الگوریتمی رسیده است. مدیر ارشد سرمایهگذاری خواسته است که استراتژی معاملاتیای طراحی شود که تمامی شرایط واقعی بازار را در نظر بگیرد. در این استراتژی پیشرفته، علاوه بر استفاده از شاخصهای فنی مانند میانگین متحرک ۱۰ روزه (SMA10) و شاخص قدرت نسبتی ۱۴ روزه (RSI)، هزینههای تراکنش، لغزش قیمت و مدیریت ریسک پویا نیز مد نظر قرار میگیرند.
قوانین استراتژی:
سیگنال خرید:
در صورتی که هیچ موقعیتی باز نباشد و شرایط زیر برقرار باشد:
شاخص RSI کمتر از ۳۰
قیمت بسته روز جاری بالاتر از SMA10 باشد
مدیریت ریسک:
ریسک هر معامله حداکثر ۲٪ از سرمایه اولیه (۱۰,۰۰۰ دلار) محسوب میشود.
سطح استاپلاس برابر با ۹۵٪ از قیمت خرید (با احتساب لغزش) در نظر گرفته میشود.
تعداد سهم خریداریشده بهگونهای تعیین میشود که ضرر احتمالی (تفاوت بین قیمت خرید و استاپلاس به ازای هر سهم) برابر با ۲٪ از سرمایه اولیه باشد.
لغزش و هزینه تراکنش:
در زمان خرید، قیمت خرید با لغزش ۰.۲٪ افزایش مییابد.
هزینه تراکنش برابر با ۰.۱٪ از ارزش معامله از سرمایه کسر میشود.
سیگنال فروش:
اگر موقعیتی باز باشد، دو حالت خروج وجود دارد:
فروش به دلیل تغییر روند: در صورتی که شاخص RSI بیش از ۷۰ شود.
فروش به دلیل استاپلاس: اگر قیمت بسته روز جاری کمتر از ۹۵٪ از قیمت خرید (ثبتشده پس از لغزش خرید) شود.
در زمان فروش (به جز فروش نهایی در پایان دوره)، قیمت فروش با لغزش ۰.۲٪ کاهش مییابد و هزینه تراکنش ۰.۱٪ از ارزش فروش کسر میشود.
پایان دوره معاملاتی:
اگر موقعیتی باز باقی مانده باشد، آن را با آخرین قیمت بسته (بدون لغزش، اما با اعمال هزینه تراکنش) میفروشید.
هدف نهایی شبیهسازی، محاسبه ارزش نهایی پرتفوی (سرمایه نقدی نهایی) پس از اجرای تمام معاملات است. مقدار نهایی باید به دو رقم اعشار گرد شود.
توجه:
این نمونه ورودی صرفاً جهت نشان دادن فرمت داده است. در شرایط واقعی، ممکن است تعداد روزها بیشتر بوده و شرایط معاملاتی پیچیدهتری ایجاد شود. مقدار نهایی نمونه است؛ مقدار نهایی بسته به دادههای واقعی و سیگنالهای معاملاتی ممکن است متفاوت باشد.
**محدودیتها:**
+ **محدودیت زمان:** ۲ ثانیه
+ **محدودیت حافظه:** ۲۵۶ مگابایت
# پیشبینی قیمت بسته با استفاده از یادگیری ماشین
## توضیح مسئله
تیم شما در راستای بهبود روندهای معاملاتی، تصمیم گرفته است از تکنیکهای یادگیری ماشین برای پیشبینی قیمت بستهی سهام استفاده کند. در این مرحله، شما به عنوان تحلیلگر دادهها باید یک مدل رگرسیون خطی آموزش دهید که با استفاده از دادههای تاریخی یک روز (شامل قیمتهای **Open**، **High**، **Low** و **Close**) بتواند قیمت بستهی روز بعد را پیشبینی کند.
برای این کار، دادههای تاریخی در قالب یک فایل CSV دریافت میشود. سپس با استفاده از تکنیک **انتقال (lag)** داده، ویژگیهای ورودی از ردیف قبلی استخراج شده و مقدار **قیمت بسته** روز بعد به عنوان **هدف (target)** در نظر گرفته میشود. پس از آموزش مدل، با استفاده از ویژگیهای روز آخر، قیمت بستهی روز آینده پیشبینی شده و چاپ میشود.
## وظیفه
برنامهای بنویسید که فایل **CSV** شامل دادههای تاریخی سهام را از **STDIN** بخواند و مراحل زیر را انجام دهد:
1. دادهها را بر اساس تاریخ (با فرمت `YYYY-MM-DD`) مرتب کند.
2. برای هر سطر (به جز آخرین سطر)، ویژگیهای ورودی را از ستونهای **Open**، **High**، **Low** و **Close** استخراج کرده و به عنوان نمونههای آموزشی در نظر بگیرد. مقدار **هدف (target)** مربوط به هر نمونه، مقدار **Close** در ردیف بعدی خواهد بود.
3. یک **مدل رگرسیون خطی** با استفاده از `scikit-learn` آموزش دهد.
4. با استفاده از ویژگیهای روز آخر، قیمت بستهی روز بعد را پیشبینی کند.
5. مقدار پیشبینیشده را **به دو رقم اعشار گرد کرده و چاپ کند**.
## ورودی
+ ورودی از **STDIN** دریافت میشود.
+ اولین خط شامل **هدر (header)** فایل **CSV** است.
+ هر خط بعدی شامل پنج مقدار به ترتیب زیر است:
```
Date,Open,High,Low,Close
```
+ فرمت تاریخ به صورت `YYYY-MM-DD` میباشد.
### محدودیتها
## خروجی
خروجی شامل **یک عدد اعشاری** است که قیمت بستهی پیشبینیشده برای روز بعد را نشان میدهد. مقدار خروجی باید **به دو رقم اعشار گرد شود**.
## مثالها
دریافت دیتا ست جهت [استفاده](https://drive.google.com/file/d/1YU8efzpL0JUJKDTec75ALCueEdRuPsZ3/view?usp=sharing)
### ورودی نمونه ۱
```
Date,Open,High,Low,Close
2025-01-01,100,110,90,105
2025-01-02,105,115,95,110
2025-01-03,110,120,100,115
2025-01-04,115,125,105,120
2025-01-05,120,130,110,125
```
### خروجی نمونه ۱
```
130.00
```
### توضیح
در این نمونه، با استفاده از دادههای ردیفهای **۱ تا ۴** به عنوان نمونههای آموزشی، مدل رگرسیون خطی به گونهای آموزش میبیند که رابطهای مشابه **«قیمت بسته روز بعد = قیمت بسته روز قبل + ۵»** را یاد بگیرد. سپس با استفاده از ویژگیهای روز پنجم (**که قیمت بستهی آن ۱۲۵ است**) قیمت بستهی روز بعد پیشبینی میشود که برابر **۱۳۰.۰۰ دلار** خواهد بود.
### نحوه ارسال
شما باید کد یادگاری ماشین خود را پیاده سازی کنید و پس از چاپ خروجی آن را پرینت کنید سپس بقیه کد را کامنت کنید. دقت کنید داده ورودی شما همان فایل csv است که آن را دریافت کردید.
برای مثال اگر خروجی شما ۱۳۴.۳۰ باشد:
...
# import numpy as np
# import matplotlib.pyplot as plt
# from sklearn.linear_model import LinearRegression
# from sklearn.model_selection import train_test_split
# from sklearn.metrics import mean_squared_error
# # دادههای نمونهای
# X = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).reshape(-1, 1)
# y = np.array([2.2, 2.8, 3.6, 4.5, 5.1, 5.9, 6.8, 7.4, 8.9, 9.2])
# # تقسیم دادهها به دو مجموعهی آموزش و آزمون
# X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# # ایجاد مدل رگرسیون خطی
# model = LinearRegression()
# # آموزش مدل
# model.fit(X_train, y_train)
# # پیشبینی مقادیر خروجی
# y_pred = model.predict(X_test)
# # ارزیابی مدل
# mse = mean_squared_error(y_test, y_pred)
# print(f'Mean Squared Error: {mse}')
# # نمایش نمودار
# plt.scatter(X, y, color='blue', label='Actual Data')
# plt.plot(X, model.predict(X), color='red', label='Regression Line')
# plt.xlabel('X')
# plt.ylabel('y')
# plt.legend()
# plt.show()
print(134.30) ...
`
تیم شما در راستای بهبود روندهای معاملاتی، تصمیم گرفته است از تکنیکهای یادگیری ماشین برای پیشبینی قیمت بستهی سهام استفاده کند. در این مرحله، شما به عنوان تحلیلگر دادهها باید یک مدل رگرسیون خطی آموزش دهید که با استفاده از دادههای تاریخی یک روز (شامل قیمتهای Open، High، Low و Close) بتواند قیمت بستهی روز بعد را پیشبینی کند.
برای این کار، دادههای تاریخی در قالب یک فایل CSV دریافت میشود. سپس با استفاده از تکنیک انتقال (lag) داده، ویژگیهای ورودی از ردیف قبلی استخراج شده و مقدار قیمت بسته روز بعد به عنوان هدف (target) در نظر گرفته میشود. پس از آموزش مدل، با استفاده از ویژگیهای روز آخر، قیمت بستهی روز آینده پیشبینی شده و چاپ میشود.
برنامهای بنویسید که فایل CSV شامل دادههای تاریخی سهام را از STDIN بخواند و مراحل زیر را انجام دهد:
دادهها را بر اساس تاریخ (با فرمت YYYY-MM-DD) مرتب کند.
برای هر سطر (به جز آخرین سطر)، ویژگیهای ورودی را از ستونهای Open، High، Low و Close استخراج کرده و به عنوان نمونههای آموزشی در نظر بگیرد. مقدار هدف (target) مربوط به هر نمونه، مقدار Close در ردیف بعدی خواهد بود.
یک مدل رگرسیون خطی با استفاده از scikit-learn آموزش دهد.
با استفاده از ویژگیهای روز آخر، قیمت بستهی روز بعد را پیشبینی کند.
مقدار پیشبینیشده را به دو رقم اعشار گرد کرده و چاپ کند.
در این نمونه، با استفاده از دادههای ردیفهای ۱ تا ۴ به عنوان نمونههای آموزشی، مدل رگرسیون خطی به گونهای آموزش میبیند که رابطهای مشابه «قیمت بسته روز بعد = قیمت بسته روز قبل + ۵» را یاد بگیرد. سپس با استفاده از ویژگیهای روز پنجم (که قیمت بستهی آن ۱۲۵ است) قیمت بستهی روز بعد پیشبینی میشود که برابر ۱۳۰.۰۰ دلار خواهد بود.
شما باید کد یادگاری ماشین خود را پیاده سازی کنید و پس از چاپ خروجی آن را پرینت کنید سپس بقیه کد را کامنت کنید. دقت کنید داده ورودی شما همان فایل csv است که آن را دریافت کردید.
برای مثال اگر خروجی شما ۱۳۴.۳۰ باشد:
...
# import numpy as np
# import matplotlib.pyplot as plt
# from sklearn.linear_model import LinearRegression
# from sklearn.model_selection import train_test_split
# from sklearn.metrics import mean_squared_error
# # دادههای نمونهای
# X = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).reshape(-1, 1)
# y = np.array([2.2, 2.8, 3.6, 4.5, 5.1, 5.9, 6.8, 7.4, 8.9, 9.2])
# # تقسیم دادهها به دو مجموعهی آموزش و آزمون
# X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# # ایجاد مدل رگرسیون خطی
# model = LinearRegression()
# # آموزش مدل
# model.fit(X_train, y_train)
# # پیشبینی مقادیر خروجی
# y_pred = model.predict(X_test)
# # ارزیابی مدل
# mse = mean_squared_error(y_test, y_pred)
# print(f'Mean Squared Error: {mse}')
# # نمایش نمودار
# plt.scatter(X, y, color='blue', label='Actual Data')
# plt.plot(X, model.predict(X), color='red', label='Regression Line')
# plt.xlabel('X')
# plt.ylabel('y')
# plt.legend()
# plt.show()
print(134.30) ...
Plain text
`
+ محدودیت زمان: ۱ ثانیه
+ محدودیت حافظه: ۲۵۶ مگابایت
# پیشبینی Close با استفاده از مدل Random Forest و استخراج ویژگیهای پیشرفته
تیم تحلیل دادههای شما به دنبال ارتقای مدلهای پیشبینی قیمت است. پس از استفاده از مدلهای ساده مانند رگرسیون خطی، اکنون میخواهند با بهرهگیری از تکنیکهای پیشرفته یادگیری ماشین، عملکرد بهتری به دست آورند. مدیر تیم پیشنهاد داده است که به جای استفاده از تنها ویژگیهای اولیه (Open، High، Low، Close)، ابتدا ویژگیهای تکنیکال زیر را استخراج کنید:
+ **SMA3**: میانگین متحرک ۳ روزه Close
+ **SMA5**: میانگین متحرک ۵ روزه Close
+ **RSI**: شاخص قدرت نسبی با دوره ۳ روز (برای سادگی در نمونههای کوچک)
سپس با استفاده از این ویژگیهای استخراج شده به همراه مقادیر اصلی (Open، High، Low و Close)، یک مدل **Random Forest Regressor** آموزش دهید تا بتوانید مقدار **Close روز بعد** را پیشبینی کنید. برای هر نمونه آموزشی، ویژگیهای روز $i$ (شامل ۷ ویژگی فوق) به عنوان **ورودی** و مقدار **Close روز $i+1$** به عنوان **هدف (Target)** در نظر گرفته میشود. پس از آموزش مدل با دادههای موجود (به جز سطر آخر)، با استفاده از ویژگیهای سطر آخر، مقدار **Close روز بعد** پیشبینی شده و چاپ میشود.
## ورودی
ورودی از طریق **STDIN** دریافت میشود.
+ اولین خط شامل سطر عنوان (**Header**) فایل CSV است.
+ هر خط بعدی شامل پنج فیلد به ترتیب زیر است:
```
Date,Open,High,Low,Close
```
+ **Date**: فرمت YYYY-MM-DD
+ **Open**: قیمت باز شدن
+ **High**: بیشترین قیمت
+ **Low**: کمترین قیمت
+ **Close**: قیمت بسته شدن
## خروجی
خروجی شامل یک عدد است که مقدار پیشبینیشدهی **Close روز بعد** را نشان میدهد. این عدد باید **به دو رقم اعشار** گرد شود.
## مثالها
دریافت دیتا ست جهت [استفاده](https://drive.google.com/file/d/19TIXh1snPhK2qZSutW2n0MIHWmT9NTvX/view?usp=sharing)
### ورودی نمونه ۱
```
Date,Open,High,Low,Close
2025-01-01,100,110,90,105
2025-01-02,105,115,95,110
2025-01-03,110,120,100,115
2025-01-04,115,125,105,120
2025-01-05,120,130,110,125
2025-01-06,125,135,115,130
2025-01-07,130,140,120,135
2025-01-08,135,145,125,140
```
### خروجی نمونه ۱
```
145.00
```
## توضیح نمونه
در این نمونه، با استفاده از دادههای موجود (پس از محاسبه ویژگیهای **SMA3**، **SMA5** و **RSI** با دوره ۳)، نمونههای آموزشی از ردیفهایی که دارای همه ویژگیها هستند (مثلاً از سطر ۴ به بعد) تشکیل میشوند. مدل **Random Forest** با استفاده از دادههای **ردیف ۱ تا ۷** (به عنوان نمونههای آموزشی با هدف **Close روز بعد**) آموزش مییابد و سپس با استفاده از ویژگیهای **ردیف ۸**، مقدار **Close روز بعد** پیشبینی میشود.
> **توجه**: مقدار خروجی نمونه صرفاً جهت نمایش فرمت است؛ مقدار واقعی برحسب دادههای آموزشی و مدل ممکن است متفاوت باشد.
### نحوه ارسال
شما باید کد یادگاری ماشین خود را پیاده سازی کنید و پس از چاپ خروجی آن را پرینت کنید سپس بقیه کد را کامنت کنید. دقت کنید داده ورودی شما همان فایل csv است که آن را دریافت کردید.
برای مثال اگر خروجی شما ۱۳۴.۳۰ باشد:
...
# import numpy as np
# import matplotlib.pyplot as plt
# from sklearn.linear_model import LinearRegression
# from sklearn.model_selection import train_test_split
# from sklearn.metrics import mean_squared_error
# # دادههای نمونهای
# X = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).reshape(-1, 1)
# y = np.array([2.2, 2.8, 3.6, 4.5, 5.1, 5.9, 6.8, 7.4, 8.9, 9.2])
# # تقسیم دادهها به دو مجموعهی آموزش و آزمون
# X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# # ایجاد مدل رگرسیون خطی
# model = LinearRegression()
# # آموزش مدل
# model.fit(X_train, y_train)
# # پیشبینی مقادیر خروجی
# y_pred = model.predict(X_test)
# # ارزیابی مدل
# mse = mean_squared_error(y_test, y_pred)
# print(f'Mean Squared Error: {mse}')
# # نمایش نمودار
# plt.scatter(X, y, color='blue', label='Actual Data')
# plt.plot(X, model.predict(X), color='red', label='Regression Line')
# plt.xlabel('X')
# plt.ylabel('y')
# plt.legend()
# plt.show()
print(134.30) ...
`
سوال دهم
محدودیت زمان: ۱ ثانیه
محدودیت حافظه: ۲۵۶ مگابایت
پیشبینی Close با استفاده از مدل Random Forest و استخراج ویژگیهای پیشرفته🔗
تیم تحلیل دادههای شما به دنبال ارتقای مدلهای پیشبینی قیمت است. پس از استفاده از مدلهای ساده مانند رگرسیون خطی، اکنون میخواهند با بهرهگیری از تکنیکهای پیشرفته یادگیری ماشین، عملکرد بهتری به دست آورند. مدیر تیم پیشنهاد داده است که به جای استفاده از تنها ویژگیهای اولیه (Open، High، Low، Close)، ابتدا ویژگیهای تکنیکال زیر را استخراج کنید:
SMA3: میانگین متحرک ۳ روزه Close
SMA5: میانگین متحرک ۵ روزه Close
RSI: شاخص قدرت نسبی با دوره ۳ روز (برای سادگی در نمونههای کوچک)
سپس با استفاده از این ویژگیهای استخراج شده به همراه مقادیر اصلی (Open، High، Low و Close)، یک مدل Random Forest Regressor آموزش دهید تا بتوانید مقدار Close روز بعد را پیشبینی کنید. برای هر نمونه آموزشی، ویژگیهای روز i (شامل ۷ ویژگی فوق) به عنوان ورودی و مقدار Close روز i+1 به عنوان هدف (Target) در نظر گرفته میشود. پس از آموزش مدل با دادههای موجود (به جز سطر آخر)، با استفاده از ویژگیهای سطر آخر، مقدار Close روز بعد پیشبینی شده و چاپ میشود.
در این نمونه، با استفاده از دادههای موجود (پس از محاسبه ویژگیهای SMA3، SMA5 و RSI با دوره ۳)، نمونههای آموزشی از ردیفهایی که دارای همه ویژگیها هستند (مثلاً از سطر ۴ به بعد) تشکیل میشوند. مدل Random Forest با استفاده از دادههای ردیف ۱ تا ۷ (به عنوان نمونههای آموزشی با هدف Close روز بعد) آموزش مییابد و سپس با استفاده از ویژگیهای ردیف ۸، مقدار Close روز بعد پیشبینی میشود.
توجه: مقدار خروجی نمونه صرفاً جهت نمایش فرمت است؛ مقدار واقعی برحسب دادههای آموزشی و مدل ممکن است متفاوت باشد.
شما باید کد یادگاری ماشین خود را پیاده سازی کنید و پس از چاپ خروجی آن را پرینت کنید سپس بقیه کد را کامنت کنید. دقت کنید داده ورودی شما همان فایل csv است که آن را دریافت کردید.
برای مثال اگر خروجی شما ۱۳۴.۳۰ باشد:
...
# import numpy as np
# import matplotlib.pyplot as plt
# from sklearn.linear_model import LinearRegression
# from sklearn.model_selection import train_test_split
# from sklearn.metrics import mean_squared_error
# # دادههای نمونهای
# X = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).reshape(-1, 1)
# y = np.array([2.2, 2.8, 3.6, 4.5, 5.1, 5.9, 6.8, 7.4, 8.9, 9.2])
# # تقسیم دادهها به دو مجموعهی آموزش و آزمون
# X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# # ایجاد مدل رگرسیون خطی
# model = LinearRegression()
# # آموزش مدل
# model.fit(X_train, y_train)
# # پیشبینی مقادیر خروجی
# y_pred = model.predict(X_test)
# # ارزیابی مدل
# mse = mean_squared_error(y_test, y_pred)
# print(f'Mean Squared Error: {mse}')
# # نمایش نمودار
# plt.scatter(X, y, color='blue', label='Actual Data')
# plt.plot(X, model.predict(X), color='red', label='Regression Line')
# plt.xlabel('X')
# plt.ylabel('y')
# plt.legend()
# plt.show()
print(134.30) ...