การใช้การเรียนรู้แบบมีผู้สอนเพื่อปรับปรุงกลยุทธ์ครอสโอเวอร์ค่าเฉลี่ยเคลื่อนที่โดยการคาดการณ์การเปลี่ยนแปลงในราคาปิดของ Ethereum ด้วยการจำแนกประเภทไบนารี
ในโลกของการซื้อขาย ตัวชี้วัดประสิทธิภาพที่ดีที่สุดสำหรับโมเดลการเรียนรู้ของเครื่องคือว่าโมเดลนี้มีส่วนช่วยในการสร้างผลกำไรมากน้อยเพียงใด เป็นไปได้ที่จะปรับให้เหมาะสมเพื่อความเสถียรของกลยุทธ์ อัตราการชนะ การขาดทุนที่ลดลง แต่ % ผลตอบแทนจะต้องเป็นบวก ดังนั้นในโพสต์นี้ เราจะสร้างโมเดลการเรียนรู้ของเครื่องพื้นฐานที่สร้างรายได้ระหว่างการทดสอบย้อนหลัง และมีศักยภาพที่จะปรับปรุงด้วยข้อมูลเพิ่มเติม
1. นำเข้าไลบรารีและรับข้อมูล
from yfinance import Ticker import pandas as pd from xgboost import XGBClassifier from sklearn.model_selection import train_test_split
เราใช้ yfinance เพื่อดาวน์โหลดข้อมูล ใช้ pandas สำหรับการประมวลผลข้อมูล และ sklearn เพื่อแยกข้อมูลสำหรับการฝึกอบรมและการทดสอบ การแยกจะเป็นขั้นตอนสำคัญที่นี่เพราะเราต้องแน่ใจว่าทุกอย่างยังคงได้ผลจากตัวอย่าง XGBoost ถูกนำมาใช้เนื่องจากประสิทธิภาพที่โดดเด่นเมื่อแกะกล่อง และไม่มีข้อกำหนดสำหรับการปรับขนาดคุณสมบัติ
ฟังก์ชันนี้จะดาวน์โหลดราคาเปิด สูง ต่ำ และราคาปิดสำหรับคู่เงินดิจิทัลและกรอบเวลาที่กำหนด มีขีดจำกัด เช่น ใช้ได้เพียง 60 วันในช่วงเวลา 5 นาที นั่นทำให้เรามีแถวประมาณ 17,000 แถวซึ่งยังคงเป็นขนาดตัวอย่างที่เหมาะสมสำหรับการทดสอบอย่างรวดเร็ว
2. ค้นหาสิ่งที่จะทำนาย
สิ่งที่ง่ายที่สุดในการทำนายคือราคาของแท่งถัดไปจะขึ้นหรือลง เช่น. จากข้อมูลก่อนหน้านี้ ราคาปิดของแท่งถัดไปจะสูงกว่าราคาเปิดหรือไม่ ในการดำเนินการนี้ เราเพียงแต่ทำให้ข้อมูลล่าช้าตามเป้าหมาย
เป้าหมาย:
df[‘target’] = df[‘Close’] > df[‘Open’]
ตอนนี้คอลัมน์เป้าหมายในดาต้าเฟรมเป็น True หรือ False ขึ้นอยู่กับว่าราคาปิดมากกว่าราคาเปิดหรือไม่
df['target'] = df['target'].shift(-1) df.dropna(inplace=True)
โค้ดด้านบนเลื่อนคอลัมน์ตัวแปรเป้าหมายทั้งหมดขึ้นหนึ่งแถบจากจุดสิ้นสุด สิ่งนี้จะสร้างแถวว่าง 1 แถวที่ส่วนท้ายของชุดข้อมูลที่เราจะทิ้ง ตอนนี้เรากำลังคาดการณ์ว่าราคาปิดของวันนี้จะสูงกว่าราคาเปิดโดยพิจารณาจากข้อมูลในอดีตหรือไม่
ขณะนี้ เรามีข้อมูลราคา OHLC จากแถบ 5 นาทีก่อนหน้าเท่านั้น ดังนั้นเรามาเพิ่มคุณสมบัติที่กำหนดเอง 2 รายการกัน
3. สร้างคุณสมบัติบางอย่าง
ฉันชอบให้ชุดคุณสมบัติมีขนาดเล็กสำหรับรุ่นพื้นฐาน ดังนั้นสำหรับรุ่นนี้ ฉันจึงสร้างคุณสมบัติเพียงสองอย่างเท่านั้น นอกจากราคาดิบแล้ว เรายังเพิ่ม % การเปลี่ยนแปลงในราคาปิดและราคาเปิดจากแถบก่อนหน้า
df['pct_change1'] = df['Close'].pct_change() df['pct_change2'] = df['Open'].pct_change()
ตอนนี้ถึงเวลาที่จะดูว่าแบบจำลองมีความแม่นยำเพียงใดในการทำนายว่าแถบถัดไปจะปิดเป็นสีเขียวหรือไม่
4. สร้างแบบจำลอง
ตอนนี้เรามีคุณสมบัติบางอย่างแล้ว มาดูกันว่าเราสามารถทำนายคลาสเป้าหมายได้ดีเพียงใด
X = df.drop(columns='target') y = df['target'] X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=6,test_size=.50,shuffle=False) model = XGBClassifier() model.fit(X_train, y_train) model.score(X_test, y_test)
สังเกต shuffle=False
ในตัวแยกประเภท นี่เป็นสิ่งสำคัญเนื่องจากเราต้องการดูว่าอัลกอริทึมทำงานอย่างไรกับข้อมูลในอนาคต หากเราสับเปลี่ยนข้อมูล จะไม่สามารถทำการทดสอบย้อนหลังและการทดสอบล่วงหน้าได้อย่างถูกต้อง เนื่องจากวันที่จะหายไป
โมเดลทำงานอย่างไร
(1) แบบจำลองจะสังเกตจากแท่งก่อนหน้า (2) คาดการณ์ว่าราคาปิดจะสูงกว่าราคาเปิดสำหรับแท่งถัดไปหรือไม่ มันรู้สิ่งนี้เพราะเราบอกให้มองหารูปแบบประเภทนี้ในชุดข้อมูลของเราซึ่งประกอบด้วยการสังเกต OHLC ประมาณ 17,000 ครั้งใน 5 นาทีสำหรับ Ethereum (3) เมื่อรู้ว่าแถบถัดไปจะปิดเป็นสีเขียว เราสามารถวางคำสั่งซื้อที่ราคาเปิดของแถบถัดไปและขายเมื่อเป้าหมายถูกคาดการณ์ไว้ที่ 0
อย่างไรก็ตาม การกระจายตัวของตัวแปรเป้าหมายมีความสมดุล (~50/50) และคะแนนความแม่นยำของตัวแยกประเภทนี้คือ 0.53 ซึ่งหมายความว่าคาดการณ์ 53% ของป้ายกำกับได้อย่างถูกต้อง ซึ่งดีกว่าตัวแยกประเภท null เล็กน้อยซึ่งเป็นการกระจายของตัวแปรเป้าหมาย ดังนั้นเรามาดูกันว่าเรามีโมเดลที่ใช้งานได้หรือไม่
5. ทดสอบโมเดลย้อนหลัง
เราได้ฝึกโมเดลกับชุดข้อมูล 50% และเหลืออีก 50% สำหรับการทดสอบนอกตัวอย่าง ตามหลักการแล้ว คุณควรมีชุดข้อมูลอีกชุดที่ไม่ได้ใช้โดยสิ้นเชิงซึ่งสามารถดำเนินการ Backtest ได้ ฉันได้ละเว้นขั้นตอนนี้เนื่องจากเราไม่มีข้อมูลมากนัก อย่างไรก็ตาม หากคุณแบ่งชุดข้อมูลออกเป็นเศษส่วนการฝึก/การทดสอบที่แตกต่างกัน คุณจะสังเกตเห็นว่าความแม่นยำของตัวแยกประเภทไม่เปลี่ยนแปลงมากนักจากการแยก 50/50
เราสร้างดาต้าเฟรมแยกต่างหากที่รวมเฉพาะข้อมูลที่ไม่ได้ฝึกโมเดล: ชุดการทดสอบ จากนั้น เราส่งข้อมูลนั้นไปยังแบบจำลองของเรา เพื่อให้คาดการณ์ 1 หรือ 0 สำหรับคอลัมน์เป้าหมาย
backtest_df = X_test.copy() backtest_df['target'] = model.predict(X_test)
ตอนนี้ไปที่การทดสอบย้อนกลับ เราต้องการดูก่อนว่ากลยุทธ์ครอสโอเวอร์ค่าเฉลี่ยเคลื่อนที่มาตรฐานทำงานอย่างไร
นี่คือผลลัพธ์ของการทดสอบย้อนหลังที่ปรับให้เหมาะสมสำหรับ 10 สกุลเงินดิจิทัล ฉันเลือกรายการยอดนิยมสองสามรายการ นอกเหนือจากรายการที่มีประสิทธิภาพไม่ดีนัก
แผนภูมิด้านซ้าย (รูปที่ 1) เปรียบเทียบสามกลยุทธ์:
- MAStrategy — ครอสโอเวอร์ค่าเฉลี่ยเคลื่อนที่มาตรฐาน เราซื้อเมื่อ MA ระยะสั้นข้ามเหนือระยะยาวและขายเมื่อเกิดสิ่งที่ตรงกันข้าม
- MLStrategy — นอกเหนือจากครอสโอเวอร์ค่าเฉลี่ยเคลื่อนที่แล้ว เรายังใช้โมเดล ML ของเราเพื่อการเข้าและออกที่ดีขึ้น
- Buy & Hold — การซื้อสินทรัพย์เมื่อต้นงวดและขายเมื่อสิ้นงวด (29 วัน)
ผลการทดสอบย้อนหลังที่ได้รับการปรับปรุงให้เหมาะสมแสดงให้เห็นว่ากลยุทธ์ ML มีประสิทธิภาพเหนือกว่ากลยุทธ์ค่าเฉลี่ยเคลื่อนที่แบบธรรมดาสำหรับสกุลเงินดิจิตอลทุกตัวที่เราทดสอบ
รูปที่ 1 ยังแสดงให้เห็นว่าการซื้อและการถือครองมีประสิทธิภาพเหนือกว่ากลยุทธ์ ML โดยมีอัตรากำไรที่เล็กน้อยในบางกรณี
หมายเหตุ: กลยุทธ์นี้ไม่สร้างผลตอบแทนติดลบในคู่การซื้อขายใดๆ ในช่วง 29 วัน
นอกจากผลตอบแทนที่สูงขึ้นแล้ว กลยุทธ์ที่ปรับปรุงด้วย ML ยังสร้างอัตราการชนะที่สูงขึ้นอีกด้วย
รหัสสำหรับกลยุทธ์ ML ที่ใช้ในการสร้างผลลัพธ์เหล่านี้:
ลองอ่าน บทความก่อนหน้า ของฉันหรือเอกสารประกอบใน backesting.py หากคุณต้องการทราบวิธีเสียบคลาสนี้เข้ากับ backtester คำแนะนำ: กลยุทธ์นี้จะเข้าสู่ฟังก์ชันการเพิ่มประสิทธิภาพ backtester พร้อมกับคลาส MAStrategy มาตรฐาน กรอบเวลา MA ระยะสั้นและระยะยาวได้รับการปรับให้เหมาะสมในขั้นตอนที่ 5 โดยมีช่วงที่ยาวพอสมควร
6. ปรับใช้หรือไม่?
อันดับแรก เราควรจะทำ backtest เพิ่มเติมอีก 2-3 ครั้งโดยให้มีข้อมูลมากขึ้นแต่อย่ามากเกินไป เราไม่ต้องการเพิ่มประสิทธิภาพมากเกินไป ขีดจำกัดข้อมูลสำหรับ yfinance คือ 60 วันสำหรับแท่งละ 5 นาที แต่อาจเอาชนะได้ด้วยการดึงข้อมูลเป็นชิ้นๆ ซ้ำๆ โดยใช้ตั้งแต่รหัส นอกจากนี้เรายังสร้างคุณสมบัติเพียง 2 อย่างเท่านั้น และด้วยความมหัศจรรย์ของการเรียนรู้ของเครื่องที่ทำให้เกิดกลยุทธ์การซื้อขายที่ทำกำไรได้
การทดสอบจริงจะเกิดขึ้นเมื่อมีการปรับใช้และซื้อขายโมเดลในโลกแห่งความเป็นจริง เพียงไม่กี่ดอลลาร์ในบัญชีก็เพียงพอที่จะดูว่าประสิทธิภาพในการทดสอบย้อนหลังสามารถตรงกับโลกแห่งความเป็นจริงได้หรือไม่ 10–40% ต่อเดือนคงไม่แย่เลยถ้ามันเกิดขึ้นได้
แต่นี่เป็นพื้นฐาน และเราไม่ควรปรับใช้เพียงกลยุทธ์พื้นฐานเท่านั้น เพราะจะต้องมีประสิทธิภาพเหนือกว่า การปรับใช้จะเกิดขึ้นหลังจากการทดสอบเพิ่มเติม ขนาดตัวอย่างที่ใหญ่ขึ้น คุณสมบัติเพิ่มเติมอีกสองสามอย่าง และผลการทดสอบย้อนหลังที่คล้ายกันหรือดีกว่า
ขอขอบคุณที่อ่านและแจ้งให้เราทราบหากคุณมีข้อเสนอแนะ
ด้านที่ต้องปรับปรุง:
- ทำสิ่งใหม่
- เพิ่มคุณสมบัติเพิ่มเติม: ปริมาณ ข้อมูลจากสกุลเงินดิจิทัลอื่น ๆ สำหรับแท่งเดียวกัน ข้อมูลราคาที่ล่าช้าเพิ่มเติม ตัวชี้วัดทางเทคนิค
- ใช้ข้อมูลจากการแลกเปลี่ยนเดียวกันกับที่เราทำการซื้อขาย
- รับการวินิจฉัยโมเดล
- ตรวจสอบประสิทธิภาพในกรอบเวลาที่ต่างกัน
- ลงจุดสถิติพร้อมประสิทธิภาพโดยเฉลี่ยในทุกโมเดล เช่น ค่าเฉลี่ย ความแปรปรวน และส่วนเบี่ยงเบนมาตรฐาน
- เพิ่มประสิทธิภาพสิ่งอื่นที่ไม่ใช่ % ผลตอบแทน เช่น หมายเลขคุณภาพระบบ (SQN) และพล็อตมัน
- สร้างโมเดลโดยไม่ต้องใช้แมชชีนเลิร์นนิงเลย ดูว่าจะเกิดอะไรขึ้นถ้าเราใช้เป้าหมายและเลื่อนไปข้างหน้า 1 แถบเพื่อคาดการณ์เป้าหมายถัดไป