การทำนายราคา Bitcoin ด้วย Linear Regression
Published: 2024-04-13 17:55:25

**ประวัติความเป็นมาและหลักการทำงานของ Bitcoin**

## Bitcoin คืออะไร?
Bitcoin คือ สกุลเงินดิจิทัลที่ใช้แลกเปลี่ยนกันได้อย่างอิสระผ่านเครือข่ายที่เรียกว่า ‘บล็อกเชน’ ซึ่งทำงานแบบกระจายศูนย์ ไม่ต้องอาศัยคนกลางมาควบคุม แต่ผู้ใช้ทุกคนในเครือข่ายสามารถเข้าถึงและตรวจสอบทุกธุรกรรมที่เกิดขึ้นบนบล็อกเชนนั้นได้ถ้าพูดกันแบบง่ายๆ บิทคอยน์ก็เป็นเหมือนสกุลเงินที่สามารถใช้ซื้อ-ขายได้จริงผ่านอินเทอร์เน็ต เพียงแต่มันไม่มีรูปร่าง ไม่สามารถจับต้องได้ แต่เราสามารถรับรู้ทุกความเคลื่อนไหวในบิทคอยน์ของเราผ่านระบบบล็อกเชนที่มีความปลอดภัยสูง โดยจากสถิตินับตั้งแต่ที่มีบล็อกเชนเกิดขึ้นบนโลก ก็ไม่เคยพบการถูกแฮ็คหรือทำลายข้อมูลใดๆ แม้แต่ครั้งเดียว
ที่มาของบทความนี้: 
https://www.bitkub.com/th/blog/what-is-bitcoin-8e94e8b61b5e



**การทำนายราคา Bitcoin** มีความสำคัญหลายประการในทั้งด้านธุรกิจและการลงทุน เนื่องจาก Bitcoin และสกุลเงินดิจิทัลอื่นๆ มีความผันผวนสูง การทำนายการเคลื่อนไหวของราคาสามารถช่วยให้นักลงทุนและผู้จัดการการลงทุนตัดสินใจได้ดีขึ้นในด้านต่างๆ



**การวิเคราะห์ข้อมูลถดถอยพหุคูณเชิงเส้น (Multiple Linear Regression)** 
คืออะไรการวิเคราะห์ข้อมูลถดถอยพหุคูณเชิงเส้น คือการวิเคราะห์ข้อมูลเพื่อหาความสัมพันธ์ระหว่าง ตัวแปรต้นที่มีมากกว่า 1 ตัวแปร (แทนด้วย X1, X2, X3,…Xn) ที่มีต่อตัวแปรตาม (แทนด้วย y) ซึ่งมีการหาความสัมพันธ์เชิงเส้นระหว่างตัวแปรต้นและตัวแปรตาม การวิเคราะห์ถดถอยพหุคูณมีจุดประสงค์เพื่อต้องการทราบสมการถดถอยพหุคูณที่จะนำไปพัฒนาหรือตอบโจทย์ของการวิจัย 
ที่มาของบทความนี้: https://www.datainvestigatorth.com/post/what-is-linear-regression-analysis-1
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l6vje8v42buulf9vfpvx.png)



**การใช้ LinearRegression ในการทำนายราคา Bitcoin**
“การถดถอยเชิงเส้น”สมการเชิงเส้นที่ใช้ตัวแปรต้นเพื่อพยากรณ์ตัวแปรตาม

**Feature**
 Open _0 : ราคาเปิดของวัน,
Std5_Open_0  : ส่วนเบี่ยงเบนมาตรฐานราคาเปิด5วันล่าสุด,
Rsi14_Open_0 : ค่าที่บอกการแกว่งของราคาเปิด 14 วันล่าสุด,
Atr14_0  : ค่าที่บอกความผันผวนราคา 14 วันล่าสุด

**Target**
High_0  : ราคาสูงสุดของวันนั้น

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q1mhbbn025cy6j0f3ck5.png)


**1. Import Libraries**
```
import pandas as pd  # ใช้สำหรับการจัดการข้อมูล
import numpy as np  # ใช้สำหรับการคำนวณทางคณิตศาสตร์
import matplotlib.pyplot as plt  # ใช้สำหรับการวาดกราฟ
import seaborn as sns  # ใช้สำหรับการวาดกราฟที่ซับซ้อน

from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score, mean_absolute_percentage_error  # นำเข้าฟังก์ชันประเมินผลโมเดล
from sklearn.model_selection import train_test_split  # ใช้สำหรับแบ่งข้อมูลฝึกและทดสอบ
from sklearn.linear_model import LinearRegression  # ใช้สำหรับโมเดลถดถอยเชิงเส้น
from sklearn.preprocessing import OneHotEncoder, OrdinalEncoder  # ใช้สำหรับแปลงข้อมูลประเภท

# ตั้งค่า seed ให้กับ numpy เพื่อความเสถียรในผลลัพธ์
np.random.seed(54213)
```

**2. Read Data**
```
data = pd.read_csv('btcusd_dataset.csv')  # โหลดข้อมูลจากไฟล์ CSV
data  # แสดงข้อมูล
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vhsex930b64n2c1vz9g7.png)

```
data.drop(['Date', 'Low_0'], axis=1, inplace=True)  # ลบคอลัมน์ 'Date' และ 'Low_0' ออกจาก DataFrame
data  # แสดงข้อมูลหลังจากการลบคอลัมน์
```

**3. Clean Data**
```
data.info()
# no NaN 
```
**4. Split Dataset into Training & Test Sets**
```
target_name = 'High_0'  # ตั้งชื่อตัวแปรเป้าหมาย
feature_name = list(data.columns.drop(target_name))  # สร้างรายชื่อคุณลักษณะต่างๆ โดยไม่รวมเป้าหมาย
X = data[feature_name]  # กำหนดข้อมูลคุณลักษณะ
y = data[target_name]  # กำหนดข้อมูลเป้าหมาย

# แบ่งข้อมูลสำหรับการฝึกและทดสอบโดยไม่ผสม
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, shuffle=False) 
 
```


**5.AI Model Creation**
```
reg = LinearRegression()  # สร้างออบเจ็กต์โมเดลถดถอยเชิงเส้น
reg.fit(X_train, y_train)  # ฝึกสอนโมเดลด้วยข้อมูลฝึก
reg.coef_  # แสดงค่าสัมประสิทธิ์ของโมเดล
reg.intercept_  # แสดงค่าจุดตัดแกนของโมเดล
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o5ehvekyjueockc0oa04.png)

**7. Prediction**
```
y_pred_train = reg.predict(X_train)  # ทำนายผลโดยใช้ชุดข้อมูลฝึก
y_pred_test = reg.predict(X_test)  # ทำนายผลโดยใช้ชุดข้อมูลทดสอบ
```
**8. Model Evaluation**

```
> Scoring
# แสดง R2 score สำหรับข้อมูลฝึก
print('r2_score =\t\t\t', r2_score(y_train, y_pred_train))  
# แสดงค่า mean squared error สำหรับข้อมูลฝึก
print('mean_squared_error =\t\t', mean_squared_error(y_train, y_pred_train))
# แสดงค่า mean absolute error สำหรับข้อมูลฝึก
print('mean_absolute_error =\t\t', mean_absolute_error(y_train, y_pred_train))
# แสดงค่า mean absolute percentage error สำหรับข้อมูลฝึก
print('mean_absolute_percentage_error =', mean_absolute_percentage_error(y_train, y_pred_train))


> Scatter Plot between Predicted & Actual Values
# สร้างกราฟ scatter แสดงค่าทำนายและค่าจริง
plt.scatter(y_pred_train, y_train)

# เส้นสีแดงแสดงความสัมพันธ์ที่สมบูรณ์ระหว่างค่าทำนายและค่าจริง
plt.plot(y_pred_train, y_pred_train, color='red')

# ตั้งชื่อและป้ายกำกับแกนสำหรับกราฟ
plt.title('Scatter Plot between Predicted & Actual Values')
plt.xlabel('Predicted')
plt.ylabel('Actual')
```


```
> Test Set (Scoring)
# แสดงค่า R-squared ของโมเดลที่ทดสอบกับข้อมูล
print('r2_score =\t\t\t', r2_score(y_test, y_pred_test))
# แสดงค่า Mean Squared Error ของโมเดลที่ทดสอบกับข้อมูล
print('mean_squared_error =\t\t', mean_squared_error(y_test, y_pred_test))
# แสดงค่า Mean Absolute Error ของโมเดลที่ทดสอบกับข้อมูล
print('mean_absolute_error =\t\t', mean_absolute_error(y_test, y_pred_test))
# แสดงค่า Mean Absolute Percentage Error ของโมเดลที่ทดสอบกับข้อมูล
print('mean_absolute_percentage_error =', mean_absolute_percentage_error(y_test, y_pred_test))

> Scatter Plot between Predicted & Actual Values
plt.scatter(y_pred_test, y_test)  # สร้างกราฟแบบจุดเพื่อแสดงค่าทำนายกับค่าจริง

plt.plot(y_pred_test, y_pred_test, color='red')  # วาดเส้นแสดงความสัมพันธ์ที่สมบูรณ์ระหว่างค่าทำนายกับตัวเองเป็นเส้นอ้างอิง

plt.title('Scatter Plot between Predicted & Actual Values')  # ตั้งชื่อกราฟ
plt.xlabel('Predicted')  # ตั้งชื่อแกน X
plt.ylabel('Actual')  # ตั้งชื่อแกน Y

```

**9. Save Model**
```
import pickle
pickle.dump((reg, feature_name), open('BitCoinmodel.pickle', 'wb'))  # บันทึกโมเดลและชื่อคุณลักษณะลงในไฟล์
```

--สรุปผล--

**ในส่วน Training Set **
R-squared (r2_score): ค่า R-squared มีค่า 0.9969844924620879 หรือประมาณ 99.70% ซึ่งเป็นค่าที่สูงมาก แสดงว่าโมเดลมีความสามารถในการอธิบายความแปรปรวนของข้อมูลได้เกือบทั้งหมด โมเดลทำนายข้อมูลการฝึกได้เป็นอย่างดีมาก แต่ควรระวังปัญหา overfitting หรือการที่โมเดลทำนายข้อมูลที่ใช้ในการฝึกได้ดีเกินไปจนอาจไม่ทำนายข้อมูลใหม่ได้ดีเช่นกัน.

Mean Squared Error (MSE): ค่า MSE มีค่า 49108.90246100937 นี่คือเมตริกที่ใช้วัดความคลาดเคลื่อนของค่าที่ทำนายโดยโมเดลเมื่อเทียบกับค่าจริง ค่า MSE ที่ค่อนข้างสูงอาจชี้ว่าแม้โมเดลจะอธิบายข้อมูลได้ดี แต่ยังมีบางกรณีที่ความคลาดเคลื่อนของการทำนายค่อนข้างสูง.

Mean Absolute Error (MAE): ค่า MAE มีค่า 117.44078595680143 แสดงถึงค่าเฉลี่ยของความคลาดเคลื่อนแบบสัมบูรณ์ระหว่างการทำนายและค่าจริง ค่า MAE ที่ต่ำกว่า MSE ช่วยให้เข้าใจว่าข้อผิดพลาดส่วนใหญ่มีขนาดไม่ใหญ่มากนัก แต่ก็ยังมีบางกรณีที่มีข้อผิดพลาดที่ใหญ่พอสมควร.

Mean Absolute Percentage Error (MAPE): ค่า MAPE มีค่า 0.022897084081641823 หรือประมาณ 2.29% สะท้อนให้เห็นว่าโดยเฉลี่ยแล้ว ข้อผิดพลาดในการทำนายของโมเดลนี้มีขนาดเท่ากับ 2.29% ของค่าจริง ซึ่งถือว่าต่ำมากและเป็นผลลัพธ์ที่ดีมากในด้านการทำนายความแม่นยำ.

**ในส่วน Test Set **
R-squared: 99.62% ซึ่งสูงมากแสดงโมเดลอธิบายข้อมูลได้เกือบทั้งหมด, ชี้ให้เห็นไม่มี overfitting มาก.
Mean Squared Error (MSE): 1,028,992.63 สูงกว่าชุดฝึกมาก, บ่งชี้โมเดลอาจมีปัญหาในชุดทดสอบ.
Mean Absolute Error (MAE): 679.76 สูงขึ้นจากชุดฝึก, แสดงความคลาดเคลื่อนในการทำนายมากขึ้น.
Mean Absolute Percentage Error (MAPE): 1.83% ต่ำ, แสดงว่าความคลาดเคลื่อนในการทำนายเป็นสัดส่วนต่ำ.
สรุป: แม้ R-squared สูงแต่ MSE และ MAE ที่เพิ่มขึ้นในชุดทดสอบอาจบ่งบอกถึง overfitting หรือความไม่แม่นยำกับข้อมูลใหม่. ควรทบทวนและปรับปรุงโมเดลเพื่อความแม่นยำและความทนทานที่ดีขึ้น.

**สรุป**
จากการทดลองนี้ เราสามารถเห็นว่าโมเดลถดถอยเชิงเส้นมีความสามารถในการทำนายราคา Bitcoin ได้ในระดับหนึ่ง แต่ก็ต้องทำการตรวจสอบและประเมินโมเดลเพิ่มเติม เพื่อเพิ่มความแม่นยำและประสิทธิภาพในการทำนาย. การวิเคราะห์เชิงลึกเพิ่มเติมสามารถช่วยพัฒนาการทำนายหรือการเลือกคุณลักษณะที่เหมาะสมกว่าสำหรับการสร้างโมเดล.

ตัวอย่างการนำไป ทำนายค่า

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rtnfpsjongnv6pgoia2s.png)

อ้างอิง
https://www.youtube.com/watch?v=fiuYepIQg3A