Architecture View: Data Pipeline (ตัวเก่า)

*NOTE: กลไกตัวนี้เลิกใช้แล้ว เนื่องจากเวอร์ชั่นปัจจุบันได้แยกโมเดล ML/DL/RL ออกไป โดยมี REST API มาครอบ เพื่อความสะดวกในการจัดการโมเดล ML/DL/RL มากขึ้น แต่บทความนี้ผมไม่ได้ลบ เนื่องจากเก็บไว้ให้ศึกษา และเผื่อนำบางส่วนมาใช้หรือพัฒนาต่อยอดได้ในอนาคต

นั่งออกแบบที่ร้าน FU.5 ในตำนานของเรา

กลไกส่วน distributed data pipeline using asynchronous messaging, dataset mapping และสรุป use case ของการใช้ data คร่าวๆ ทั้งส่วน price, indicators, features, trade dataกลไกนี้สามารถรันแบบ local บนเครื่องเดียวกับ frontend robot (MT4/5, cTrader, Amibroker) และ backend robot (Python) ได้ หรือจะแบ่งส่วนกระจายรันหลายเครื่องก็ได้

ลำดับคร่าวๆ ของ data flow (ขอยกตัวอย่างเป็น FOREX):

  1. เราออกแบบโมเดล เซ็ตกราฟ เลือกอินดิเคเตอร์ คิด rule ต่างๆ
  2. ใช้เว็บ auto feature engineering (ที่เหน่งทำ) โดยเลือกอินดิเคเตอร์ และฟีจเจอร์ที่ชอบๆ แล้ว save ระบบจะ generate ไฟล์โค้ด python ส่วน build feature และนำไปรันเพื่อสร้างไฟล์ dataset เพื่อเอาไปเทรนโมเดลต่อไป
  3. เมื่อเทรนและทดสอบโมเดลเสร็จ ก็นำไฟล์โมเดล (DNN/XGBoost/…) และไฟล์โค้ด python ส่วน build feature ไปเก็บไว้ใน path ของระบบเพื่อใช้ตอนรันตอนเทรดจริง
  4. เมื่อเริ่มรันเทรดจริง ส่วน frontend robot (MT4/5, cTrader) จะขียนข้อมูลราคาทุก symbol ที่ต้องการเทรดลงไฟล์ CSV เมื่อชาร์ตขึ้นบาร์ใหม่ (1 บาร์ เขียนไฟล์ราคา 1 ครั้ง)
  5. data pool gateway ที่เป็น python จะรันทุก N นาที สัมพันธ์กับทุกบาร์บนชาร์ต เมื่อเริ่มรันตามรอบการทำงาน จะอ่านไฟล์ราคาทุก symbol ที่เกี่ยวข้อง แล้วแปลง data type เป็นชนิด DataFrame
  6. data pool gateway จะไปเรียก data pool endpoint แล้ว data pool endpoint จะรับ DataFrame ราคามา แล้วอ่านไฟล์ config ที่เก็บค่า setting เพื่อดูว่ามี dataset mapping อะไรบ้าง ใช้โมเดลอะไรบ้าง แต่ละโมเดลใช้ dataset อะไรบ้าง ใช้ symbol อะไร ใช้ timeframe อะไร
  7. จะ by pass ราคาไปเก็บลงไฟล์หรือลง database
  8. ระหว่างนั้นจะมี dataset interceptor มาแทรกการทำงาน dataset interceptor 1 instance จะทำงานเทียบเท่า 1 thread ดังนั้นหากมีใช้ dataset N ตัว ก็จะมี dataset interceptor จำนวนเท่ากัน ณ ขณะรัน (run time)
  9. dataset interceptor จะส่ง DataFrame ราคาไปให้กับ dataset builder แล้วไปเรียกโค้ด build feature ที่ได้จากตอนทำในขั้นตอนที่ 2 เพื่อเอาราคาไปคำนวณสร้างฟีจเจอร์เสร็จแล้วได้ dataset
  10. จะ save ไฟล์ dataset ลง path ที่กำหนดไว้ เพื่อรอให้ส่วน strategy & trading robot process มาอ่านข้อมูลไปใช้
  11. จังหวะที่ strategy & trading robot process มาอ่านข้อมูลจะเรียกใช้ dataset router ซึ่งทำหน้าที่ตรวจสอบว่าจะดึงข้อมูล dataset ผ่านทางช่องทางไหนดีระหว่างไฟล์กับ database
  12. จากนั้นก็นำ dataset ส่งต่อไปให้ ML model เพื่อ predict

*กรณีที่มี dataset มากกว่า 1 ตัว ใช้ราคาจาก symbol เดียวกัน และ timeframe เดียวกัน ระบบจะใช้การ copy DataFrame ราคา ก่อนเริ่ม build feature เพื่อลด concurrently access ไปยังข้อมูลราคาเดียวกันพร้อมกัน เนื่องจาก dataset interceptor แต่ละตัวรันเป็น thread และโดยปกติ dataset แต่ละตัวมักใช้อินดิเคเตอร์และฟีจเจอร์ไม่เหมือนกันอยู่แล้ว

Design Rationale 😊 :

รองรับทั้งการเทรด หุ้น, TFEX, FOREX, cryptocurrency ฯลฯความยากและความท้าทายคือ การ normalize & generalize data pipeline และโครงสร้างการทำงานทั้งหมด ให้รองรับการเทรดหลายชนิดสินค้าและหลายตลาดได้ และต้อง platform/library/framework/tool independence เหนือกาลเวลา มี wrapper เพียบ ยอมช้านิดนึงเพื่อแลกความยืดหยุ่น เป็น “trade-off but less sensitivity and low risk from technology impact”

ช่วยให้ทำ trading model & predictive model ได้ง่าย สะดวก ไม่ต้องเตรียม manual เองเยอะ และการทำงานและโครงสร้างประสานและ transparent ทั้งส่วนทำ dataset เพื่อเอาไปสร้างโมเดล, ส่วนรันเทรดจริง และ ส่วน backtest

และอีกความท้าทายคือ การกำหนด System Boundary ให้แชร์ resource ในจุดจำเป็นเท่านั้น ลดการ centralize ที่ไม่จำเป็น และรองรับ partial failure ถ้ามีส่วนไหนพังหรือหยุดการทำงาน ต้องไม่ฉุดชุดโรบอทในสินค้าอื่นหรือตลาดอื่น และต้องรองรับการ scale ได้และยังช่วยให้การติดตั้ง circuit breaker service, health check service สะดวกและคุมง่าย

ในอนาคตเมื่อทำ auto asset allocation, distributed portfolio และการกระจายกระเป๋าตังค์ ก็จะสะดวกเพราะในชุด docker 1 ตัวมีความเป็น modularity สูง คุม coupling เข้มงวด และคุมทิศทางของ call เข้มงวด.ผมเปลี่ยนสถาปัตยกรรมระบบหลายจุด เพื่อให้นำไปรันบนเครื่องพีซีธรรมดาเครื่องเดียวก็ได้ ไม่ต้องคลัสต้งคลัสเตอร์เว่อร์วังก็ได้ แต่ถ้าปรารถนาก็รองรับ

แบ่ง Level of Abstraction ของการอิมพลีเม้นต์ เพื่อให้ผู้ใช้นำไปใช้และพัฒนาส่วนต่างๆ ไว้หลาย levelโดยไล่ตั้งแต่ระดับง่ายสุด แค่ปรับค่า strategy setting ยากขึ้นอีกก็นิดก็ทำ dataset, trading model, predictive model เอง ไปจนส่วนยากสุด (ผู้ใช้ปรับแต่งทุกส่วนได้เองตามชอบ)

ในส่วน backend จับยัดใส่ docker หมด เพื่อผู้ใช้จะได้ไม่ต้องไปลงและเซ็ตเองให้เมื่อยตุ้มไปโฟกัสการทำ trading model & predictive model เต็มที่ไปเลย

predictive model จะใช้ rule base หรือ machine learning ก็ได้ตามชอบ รองรับ Deep Learning ได้นะเออ 😊

แนวทางที่ผมมักใช้ออกแบบระบบบ่อยๆ เช่น

  • Business Driven Design
  • Risk Driven Design
  • Attribute Driven Design
  • Domain Driven Design
  • Constraint Driven Design
  • OO Design
  • Functional Design

Leave a Reply

Discover more from

Subscribe now to keep reading and get access to the full archive.

Continue reading