การใช้การเรียนรู้แบบมีผู้สอนเพื่อปรับปรุงกลยุทธ์ครอสโอเวอร์ค่าเฉลี่ยเคลื่อนที่โดยการคาดการณ์การเปลี่ยนแปลงในราคาปิดของ 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) เปรียบเทียบสามกลยุทธ์:

  1. MAStrategy — ครอสโอเวอร์ค่าเฉลี่ยเคลื่อนที่มาตรฐาน เราซื้อเมื่อ MA ระยะสั้นข้ามเหนือระยะยาวและขายเมื่อเกิดสิ่งที่ตรงกันข้าม
  2. MLStrategy — นอกเหนือจากครอสโอเวอร์ค่าเฉลี่ยเคลื่อนที่แล้ว เรายังใช้โมเดล ML ของเราเพื่อการเข้าและออกที่ดีขึ้น
  3. 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 แถบเพื่อคาดการณ์เป้าหมายถัดไป