DEV Community

Cover image for การทำนายราคา Bitcoin ด้วย Linear Regression
taoyngwie
taoyngwie

Posted on • Updated on

การทำนายราคา Bitcoin ด้วย Linear Regression

ประวัติความเป็นมาและหลักการทำงานของ 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

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

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

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

Image description

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)
Enter fullscreen mode Exit fullscreen mode

2. Read Data

data = pd.read_csv('btcusd_dataset.csv')  # โหลดข้อมูลจากไฟล์ CSV
data  # แสดงข้อมูล
Enter fullscreen mode Exit fullscreen mode

Image description

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

3. Clean Data

data.info()
# no NaN 
Enter fullscreen mode Exit fullscreen mode

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) 

Enter fullscreen mode Exit fullscreen mode

5.AI Model Creation

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

Image description

7. Prediction

y_pred_train = reg.predict(X_train)  # ทำนายผลโดยใช้ชุดข้อมูลฝึก
y_pred_test = reg.predict(X_test)  # ทำนายผลโดยใช้ชุดข้อมูลทดสอบ
Enter fullscreen mode Exit fullscreen mode

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')
Enter fullscreen mode Exit fullscreen mode
> 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

Enter fullscreen mode Exit fullscreen mode

9. Save Model

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

--สรุปผล--

*ในส่วน 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://www.youtube.com/watch?v=fiuYepIQg3A

Top comments (0)