Posted on April 29, 2025 by ตั้ม
Leave a Comment
ก่อนจะเริ่มรันโค้ดสำหรับทำ Portfolio Optimization ต้องทราบก่อนว่า strategy หรือบัญชีนั้นมีเทรดบอทตัวไหนบ้าง เช่น strategy_name ชื่อ ‘gw_fx_1’ เทรดบัญชีเลขที่ 123456789 ประกอบด้วยบอท Pampus_GOLD_L, JellyFish_UJ_L, JellyFish_UJ_S, Lychee_GU_L ทั้งหมด 4 ตัว ดังนั้นต้อง retrain หรือ test 4 โมเดลนี้ก่อน เพื่อทำให้เกิดไฟล์ trade history 4 ไฟล์ เพื่อจะนำไปใช้ตอนทำ Portfolio Optimization
ขั้นตอนหลักในการ retrain RL model & optimize portfolio ได้แก่
ดาวน์โหลดไฟล์ราคาล่าสุด
retrain RL model ของบอททุกตัวที่เทรดในบัญชี แล้ว qualify models (เลือกโมเดลที่ถูกใจ)
optimize portfolio (1 portfolio / 1 บัญชีเทรด)
อัพโหลดไฟล์โมเดลและ robot config ไปยังเครื่องที่รันบอท
เตรียมพร้อม: ขั้นตอนเปิดหน้าต่าง Command 2 หน้าต่าง
เปิดหน้าต่าง Command Prompt (for Windows) หรือ Terminal (for Mac) จากนี้จะเรียกว่า ‘หน้าต่าง Command ที่ 1’
เข้า virtual environment ‘deepquant_env’ (หรือชื่อที่คุณตั้งเอาไว้) ด้วยคำสั่ง conda activate deepquant_env
เข้าไปที่ path ของ RL_TEP เช่น /Users/Tum/Documents/DeepQuantProjects/labs/DQIF/RL_TEP
เปิดหน้าต่าง Command Prompt (for Windows) หรือ Terminal (for Mac) อีกหน้าต่าง เพื่อจะรัน Jupyter Notebook จากนี้จะเรียกว่า ‘หน้าต่าง Command ที่ 2’
เข้า virtual environment ‘deepquant_env’ (หรือชื่อที่คุณตั้งเอาไว้) ด้วยคำสั่ง conda activate deepquant_env
รัน Jupyter Notebook ด้วยคำสั่ง python -m notebook หรือคำสั่ง jupyter notebook
จากนั้นจะเปิดหน้าต่างเว็บเบราเซอรอัตโนมัติ
[1] ขั้นตอนการดาวน์โหลดไฟล์ราคา
เข้าไปที่ Google Drive (click me please ) หรือเปิด Google Drive ของคอร์สเรา แล้วเข้าไปที่โฟลเดอร์ /DQFiles/PriceFiles
โหลดไฟล์ราคาที่บอทใน strategy หรือที่บัญชีนี้ใช้ เช่น ถ้าเป็นราคาใน FX ก็เข้าโฟลเดอร์ FX จะเห็นมีไฟล์ราคาหลายไฟล์ เช่น XAUUSD_M5.zip, GBPUSD_M5.zip, EURUSD_M5.zip, USDJPY_M5.zip
หากดาวน์โหลดไฟล์ราคามาแล้ว อาจเก็บอยู่ในโฟลเดอร์ Downloads ให้ cut หรือ copy ไปเก็บใน DeepQuantProjects ใน path > /DeepQuantProjects/datasets/{market} เช่น หากเป็นไฟล์ในตลาด FX ก็เก็บไว้ใน /DeepQuantProjects/datasets/FX
NOTE: หากเป็นสินค้าอื่นแต่เทรดในตลาด FX เช่น BTCUSD แต่เทรดกับโบรกตลาด FX ก็ต้องเก็บไฟล์ราคาไว้ใน /DeepQuantProjects/datasets/FX นะ
extract ไฟล์ราคาที่ดาวน์โหลดมาทุกไฟล์ ไฟล์ราคามีนามสกุล .csv ซึ่งไฟล์ราคาต้องอยู่ใน /DeepQuantProjects/datasets/FX
[2.A] ขั้นตอนการ Retrain / Test แบบทำทีละโมเดล
ไปที่เว็บเบราเซอร์ เข้าไปที่ path ของ RL_TEP เช่น /Users/Tum/Documents/DeepQuantProjects/labs/DQIF/RL_TEP
ดับเบิ้ลคลิ้กเปิดไฟล์ที่มีชื่อขึ้นต้นด้วย ‘AutoModel_’ ที่ต้องการ retrain หรือ test เช่น AutoModel_FX_Pampus_GOLD_L.py แล้วเลื่อน scroll bar ลงมาล่างสุด จะเป็นส่วน setting ให้อ่านคำอธิบายแล้วเซ็ตค่าตาม หรือ ปกติผมจะแชร์ไฟล์นี้ให้ทุก 1-2 สัปดาห์ ก็ไม่ต้องแก้ไขอะไร เพราะเซ็ตค่ามาให้แล้ว ยกเว้นอยากแก้หรือฝึกทำเอง
NOTE: การเซ็ตค่าเพื่อรันไฟล์ AutoModel_Retrain.py สามารถรันได้ 3 โหมด:
Run mode 1: retrain > test > qualify models หมายถึง รัน retrain โมเดลก่อน เมื่อเสร็จแล้วระบบจะรัน test ต่อ แล้วรัน qualify models ต่อ รันโหมดนี้เมื่อต้องการ retrain โมเดลก่อน
Run mode 2: test > qualify models หมายถึง ต้องการ test แล้วรัน qualify models กับข้อมูลราคาที่อัพเดตล่าสุด เพื่อคัดเลือกโมเดลที่ดีไป replace ตัวที่รันอยู่ รันโหมดนี้เหมาะกับกรณีต้องการ optimize portfolio บ่อยๆ แต่มีสมมติฐานว่าโมเดลเดิมยังโอเคอยู่ ไม่ต้อง retrain ใหม่
Run mode 3: test หมายถึง test อย่างเดียว รันโหมดนี้เพื่อต้องการดูผล test
NOTE: ตัวอย่างเช่น run mode 1 ทุก 2 สัปดาห์ แล้ว run mode 2 ทุก 2-3 วัน
กลับไปที่หน้า Jupyter Notebook ไปที่ path ของ RL_TEP แบบข้อ 1. จากนั้นดับเบิ้ลคลิ้กไฟล์ชื่อ AutoModel_Retrain.py เช็กว่าในรายการ import มีการ import ไฟล์ AutoModel_xxx.py ของโมเดลที่กำลังจะ retrain แบบในกรอบสี่เหลี่ยมในรูปหรือไม่ หากไม่มี ให้พิมพ์เพิ่มเข้าไป โดยตรงหลังคำว่า ‘as’ ให้พิมพ์ชื่อโมเดลเป็นอักษรตัวเล็ก เช่น pampus_gold_l
จากนั้นเลื่อนลงมาเล็กน้อย แก้ไขบรรทัด model_name = ‘….’ โดยพิมพ์ชื่อโมเดลใน ‘…’ ให้ตรงกับในข้อ 6. เช่น model_name = 'pampus_gold_l' จากนั้นให้ save ไฟล์
กลับไปที่หน้าต่าง Command 1 รันไฟล์ AutoModel_Retrain.py ด้วยคำสั่ง python เช่น python AutoModel_Retrain.py หากรันโหมด 3 จะใช้เวลาไม่กี่วินาที, หากรันโหมด 2 จะใช้เวลาราว 10 นาที, หากรันโหมด 1 จะใช้เวลานานนน อาจเกินชั่วโมงเพราะมีการ retrain โมเดลด้วย
NOTE: เมื่อรันเสร็จจะเจอ error ของการรัน performance report ในบรรทัดล่างสุด ตรงนี้ไม่มีปัญหาอะไรครับ เป็น bug ของไลบรารี่ชื่อ quantstats เวอร์ชั่นที่ใช้อยู่
ทำซ้ำตั้งแต่ข้อ 1 ใหม่ กับโมเดลอื่น เช่น หากบัญชีที่เทรดอยู่ประกอบด้วยบอท 4 ตัว ก็ทำขั้นตอนที่ 1-8 ซ้ำ 4 รอบ
[2.B] ขั้นตอนการ Retrain / Test แบบทำหลายโมเดลต่อเนื่องกัน
ทำแบบในหัวข้อ [2.A] ขั้นตอนที่ 1-4 กับทุกไฟล์ AutoModel_xxx.py ที่ต้องการ retrain เพื่อเซ็ตค่าให้เรียบร้อย
ทำแบบในหัวข้อ [2.A] ขั้นตอนที่ 6 แต่ให้ดับเบิ้ลคลิ้กเพื่อเปิดไฟล์ชื่อ AutoModel_Retrain_Multi.py แทน
จากนั้นเลื่อนลงมาเล็กน้อย พิมพ์ชื่อโมเดลที่ต้องการ retrain ใส่ลิสต์เช่นในรูป เสร็จแล้วให้ save ไฟล์
ทำแบบในหัวข้อ [3.A] ขั้นตอนที่ 8 แต่ให้รันไฟล์ AutoModel_Retrain_Multi.py แทน โดยใช้คำสั่ง python AutoModel_Retrain_Multi.py หากรันโหมดที่มีการ retrain ด้วยจะใช้เวลานาน และหากเซ็ตโมเดลไว้หลายโมเดลในข้อ 3 อาจใช้เวลานานมาก เช่น สมมติโมเดลนึงทำ retrain และขั้นตอนอื่นๆ จนเสร็จใช้เวลา 1 ชั่วโมง หากเซ็ตโมเดลไว้ 10 โมเดล ก็อาจใช้เวลา 10 ชั่วโมงกว่าจะเสร็จ จริงๆ สามารถแก้ไขโค้ดให้ retrain หลายโมเดลพร้อมกันได้โดยกระจายไปรันในหลาย CPU core แต่จะใช้ RAM เยอะมาก และซีพียูอาจร้อนมาก จึงตัดสินใจออกแบบอัลกอริธึมให้ retrain ทีละโมเดลแทนครับ แต่หากเครื่องใครแรงๆ จะเอาโค้ดไปปรับแต่งต่อก็ได้เลย แนะนำให้ใช้ multiprocessing ใน Python หรือใช้ Redis Pub/Sub กรณีอยากกระจายการ retrain หลายโมเดลในหลายเครื่องพร้อมกัน
[2.C] ขั้นตอนการเลือกโมเดลที่ถูกใจ กรณีมีการทำ qualify models (2 ขั้นตอนนี้ไม่ต้องทำอะไร ระบบจะทำให้อัตโนมัติ)
เมื่อรัน qualify models เสร็จแล้ว จะ save ไฟล์ไว้ 2 ที่
/DeepQuantProjects/labs/DQIF/RL_TEP/performance จะเก็บไฟล์ qualified_models.csv เป็นตารางสรุปรายการโมเดลที่ผ่านเกณฑ์ หากไม่มีรูปแสดงว่าไม่มีโมเดลผ่านเกณฑ์ และเก็บไฟล์ best_model.csv เป็นตารางสรุปโมเดลที่ให้ผลดีที่สุด 1 โมเดล (เงื่อนไขคัดเลือกคือ โมเดลที่มี net_profit สูง และ max_dd น้อย และ longest_dd_days น้อย และ hold_bars_limit น้อย)
/DeepQuantProjects/labs/DQIF/RL_TEP/performance/images จะเก็บไฟล์รูป equity curve ของทุกโมเดลที่ผ่านเกณฑ์
ค่า steps กับ hold bars limit ของโมเดลที่ดีที่สุด ที่ระบุในไฟล์ best_model.csv จะถูกเอาไปเซ็ตค่าในไฟล์ robot config ที่เกี่ยวข้องอัตโนมัติ หลังจาก optimize portfolio เสร็จแล้ว เพื่อจะก๊อปปี้ไฟล์โมเดลและไฟล์ robot config แล้วอัพโหลดขึ้นไปบนเครื่องที่รันบอทอยู่ เพื่อ replace ไปใช้โมเดลใหม่
[3.A] ขั้นตอนการ optimize portfolio
เปิดเว็บเบราเซอร์ แล้วเข้าไปหน้า Jupyter Notebook หรือพิมพ์ http://localhost:8888 หรือ http://127.0.0.1:8888 ที่ URL ในเว็บเบราเซอร์
เข้าไปที่ path ของ DQIF เช่น /Users/Tum/Documents/DeepQuantProjects/labs/DQIF
ดับเบิ้ลคลิ้กเปิดไฟล์ชื่อ AutoModel_Config.py และ AutoModel_DQPort.py
ที่ไปหน้าต่างที่เปิดโค้ดไฟล์ AutoModel_Config.py อยู่
ระบุค่า path ของ DeepQuantProjects ให้กับตัวแปร dqprojects_path ในบรรทัดบนสุด
ระบุชื่อไฟล์ราคาที่โมเดลต่างๆ ใช้เทรด
ระบุรายละเอียดโมเดล ให้กับตัวแปร models
ระบุบอท/โมเดล และไฟล์ robot_config_xxx.py ให้กับตัวแปร portfolio_list ซึ่ง 1 strategy_name ต่อ 1 บัญชีเทรด
ระบุรายละเอียด VM (virtual machine หรือ Droplet) ให้กับตัวแปร vm_list ซึ่ง vm คือชื่อโฟลเดอร์ใน path ของชุดบอท เช่น /DeepQuantProjects/labs/execution/FX/gw_fx_1 ค่า vm ก็คือ 'gw_fx_1' และค่าใน portfolios คือ strategy_name ซึ่งต้องตรงกับที่ระบุในตัวแปร portfolio_list เช่น 'gw_fx_xm1'
กลับมาที่หน้าต่างที่เปิดไฟล์ AutoModel_DQPort.py
ระบุค่า weight ให้กับ trading performance metric ต่างๆ NOTE: การระบุค่า weight นี้มีผลต่อการ optimize portfolio ในจังหวะแรกมากๆ ลองปรับเปลี่ยนค่าไปๆ มาๆ แล้วรันหลายๆ รอบเพื่อสังเกตผลดูครับ แต่ละตัวชี้วัดให้ระบุค่าในช่วง 0 – 7 เท่านั้น ซึ่งตรงนี้แต่ละคนอาจให้น้ำหนักไม่เท่ากันได้ เช่น บางให้ซีเรียสกับ max_dd มากเช่นแบบในรูปก็เซ็ตค่า 7 เลย ไม่ได้ซีเรียสกับ win_rate นักก็เซ็ตค่า 1 ค่า longest_dd ย่อมาจากคำว่า longest drawdown days หมายถึงจำนวนวันที่เงินทุนจมลงไปจนสามารถ recover กลับมาเท่า high เดิมได้
ระบุช่วงวันของ training กับ testing สำหรับช่วง testing แนะนำให้เริ่มวันย้อนหลังแค่ไม่เกิน 1 เดือน หรือ 1-2 สัปดาห์พอ เช่น สมมติวันนี้วันที่ 2025-05-01 ก็เซ็ตค่า test_start=’2025-04-16′ ส่วน test_end ระบุค่าเกินได้
เริ่มรัน Optimize โดยกลับไปที่หน้าต่าง Command ที่ 1 ไปที่ path ของ DQIF เช่น /Users/Tum/Documents/DeepQuantProjects/labs/DQIF จากนั้นรันคำสั่ง python AutoModel_DQPort.py
หลังจากรันเสร็จแล้ว จะมีการสร้างไฟล์ .csv ชื่อไฟล์ขึ้นต้นด้วย fund_alloc_ แล้วตามด้วยชื่อ strategy_name เช่น gw_fx_xm1 (อย่าลืมว่า 1 บัญชีเทรด ต่อ 1 strategy_name ต่อ 1 portfolio) ดับเบิ้ลคลิ้กเปิดไฟล์นี้ดูได้ ไฟล์นี้เป็นการสรุปผล fund allocation และจะมีการสร้างไฟล์รูปชาร์ตต่างๆ ไว้ในโฟลเดอร์ dqport อยู่ในโฟลเดอร์ DQIF อีกที
[3.B] ขั้นตอนการเซ็ตค่า fund_allocate_size กับค่า hold_bars_limit ในไฟล์ robot_config_xxx.py (ขั้นตอนนี้ไม่ต้องทำอะไร ตอนรันไฟล์ AutoModel_DQPort.py ระบบจะทำให้อัตโนมัติ)
ระบบจะทำให้อัตโนมัติ โดยนำค่า hold_bars_limit ที่ได้หลัง retrain model และค่า fund_allocate_size หลัง optimize portfolio มาเซ็ตในไฟล์ robot_config_xxx.py ที่เกี่ยวข้องทุกไฟล์ (กรณีเป็นระบบเวอร์ชั่นใหม่ ที่จะไม่มีใช้ไฟล์ robot_config_xxx.py แล้ว ระบบจะอัพเดตค่าลงใน database ให้อัตโนมัติ )
ระบบจะก๊อปปี้ไฟล์โมเดล RL ที่ retrain ล่าสุดจากในโฟลเดอร์ /labs/DQIF/RL_xxx/models ไปใส่ในโฟลเดอร์ใน /labs/execution/{market}/{vm name}/docker_mlserve/ml_models/{market}/models ให้อัตโนมัติ
[4] ขั้นตอนการอัพโหลดไฟล์ขึ้นไปอัพเดตบนเครื่องที่รันบอท
เปิดเว็บเบราเซอร์ แล้วเข้าไปหน้า Jupyter Notebook หรือพิมพ์ http://localhost:8888 หรือ http://127.0.0.1:8888 ที่ URL ในเว็บเบราเซอร์
เข้าไปที่ path ของ execution ที่เก็บไฟล์ deploy_xxx.ipynb เช่น /Users/Tum/Documents/DeepQuantProjects/labs/execution
ดับเบิ้ลคลิ้กเปิดไฟล์ deploy_xxx.ipynb ที่เคยใช้ deploy บอท
เลื่อนหน้าจอลงมาแล้วกดปุ่ม Run ใน cell โค้ดที่ชื่อ Global Settings หากไม่มีข้อความอะไรขึ้นใต้ cell แสดงว่ารันผ่าน
เลื่อนหน้าจอลงมาแล้วกดปุ่ม Run ใน cell โค้ดที่ชื่อ Reload All resource info from cloud หากมีข้อความ error เกี่ยวกับ Docker ขึ้นใต้ cell ก็ไม่มีปัญหา ทำขั้นตอนต่อไปได้
เลื่อนหน้าจอลงมาเรื่อยๆ เกือบล่างสุด ไปที่ cell ที่มีข้อความ Upload ML model files to VM (Droplet) ตามรูป แล้วรัน cell นี้ เพื่ออัพโหลดไฟล์โมเดล RL
เลื่อนหน้าจอขึ้นมานิดนึง เกือบล่างสุด ไปที่ cell ที่มีข้อความ Upload ONLY /web files to VM (Droplet) ตามรูป แล้วรัน cell นี้ เพื่ออัพโหลดไฟล์บอท, app.py, robot_config_xxx.py ต่างๆ
Like this: Like Loading...