กระทู้เก่าบอร์ด อ.Yeadram
1,075 4
URL.หัวข้อ /
URL
ขอสอบถามการคำนวณ ค่า Moving Average
คือผมต้องการหาค่าเฉลี่ยเคลื่อนที่ (Moving Average) หรือ MA ของราคาหุ้นตัวหนึ่ง ตามที่ยกตัวอย่าง สมมุติใน table นี้ มี 5 field คือ ชื่อหุ้น,วันที่,ราคาปิด ณ สิ้นวัน,ค่า MA 5 วัน,ค่า MA 10 วัน
การคำนวณ MA_5 โดยการนำข้อมูลราคาปิด ณ สิ้นวัน 5 วันรวมกัน คือผลรวมราคาปิดวันที่1 ถึงวันที่ 5 แล้วหารด้วย 5 (ได้ค่า 327.2) แล้วจึงทำให้เกิดช่องว่าง 4 ช่อง
ต่อมาก็นำผลรวมราคาปิดวันที่ 2 ถึงวันที่ 6 แล้วหารด้วย 5 (ได้ค่า 327) ทำเช่นนี้เรื่อยไปจนหมดข้อมูล
และการคำนวณ MA_10 ก็ทำเช่นเดียวกัน แต่รวมข้อมูล10 วัน และหารด้วย 10
stock_name date close_price MA_5 MA_10
PTT 5/8/2016 335
PTT 4/8/2016 326
PTT 3/8/2016 320
PTT 2/8/2016 323
PTT 1/8/2016 332 327.2
PTT 29/7/2016 334 327
PTT 28/7/2016 328 327.4
PTT 27/7/2016 332 329.8
PTT 26/7/2016 338 332.8
PTT 25/7/2016 339 334.2 330.7
PTT 22/7/2016 333 334 330.5
PTT 21/7/2016 336 335.6 331.5
PTT 20/7/2016 330 335.2 332.5
PTT 15/7/2016 325 332.6 332.7
PTT 14/7/2016 315 327.8 331
PTT 13/7/2016 314 324 329
PTT 12/7/2016 311 319 327.3
รบกวน หน่อยครับ
การคำนวณ MA_5 โดยการนำข้อมูลราคาปิด ณ สิ้นวัน 5 วันรวมกัน คือผลรวมราคาปิดวันที่1 ถึงวันที่ 5 แล้วหารด้วย 5 (ได้ค่า 327.2) แล้วจึงทำให้เกิดช่องว่าง 4 ช่อง
ต่อมาก็นำผลรวมราคาปิดวันที่ 2 ถึงวันที่ 6 แล้วหารด้วย 5 (ได้ค่า 327) ทำเช่นนี้เรื่อยไปจนหมดข้อมูล
และการคำนวณ MA_10 ก็ทำเช่นเดียวกัน แต่รวมข้อมูล10 วัน และหารด้วย 10
stock_name date close_price MA_5 MA_10
PTT 5/8/2016 335
PTT 4/8/2016 326
PTT 3/8/2016 320
PTT 2/8/2016 323
PTT 1/8/2016 332 327.2
PTT 29/7/2016 334 327
PTT 28/7/2016 328 327.4
PTT 27/7/2016 332 329.8
PTT 26/7/2016 338 332.8
PTT 25/7/2016 339 334.2 330.7
PTT 22/7/2016 333 334 330.5
PTT 21/7/2016 336 335.6 331.5
PTT 20/7/2016 330 335.2 332.5
PTT 15/7/2016 325 332.6 332.7
PTT 14/7/2016 315 327.8 331
PTT 13/7/2016 314 324 329
PTT 12/7/2016 311 319 327.3
รบกวน หน่อยครับ
4 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R22416
เรียน คุณ TTT ผมลองทำแล้วปรากฎว่า วันที่เรียงผิด พอผมลองแก้ DESC เป็น ASC ก็ผิดอีก ตามตัวอย่างที่คุณ TTT เรียงวันที่ไว้ถูกแล้ว (ตัวอย่างของผมผิดครับ) คือวันที่ที่ถูกต้องเรียงจากน้อยไปมาก (ตามที่ในความเห็นคุณทำไว้ถูกแล้ว) และช่องว่างใน MA_5,MA_10 ต้องอยู่ด้านบน
คือต้องขอโทษด้วยผมไม่มีความรู้ SQL เลยอ่านตามที่คุณทำไว้ให้ไม่ค่อยเข้าใจ จึง Copy แล้วไป Paste เลย แล้วพยายามปรับแก้เอา เท่าที่จะพอทำได้
คือต้องขอโทษด้วยผมไม่มีความรู้ SQL เลยอ่านตามที่คุณทำไว้ให้ไม่ค่อยเข้าใจ จึง Copy แล้วไป Paste เลย แล้วพยายามปรับแก้เอา เท่าที่จะพอทำได้
3 @R22417
ลองโหลดตัวอย่างนี้ดูครับ
Download
Download
4 @R22418
ขอบคุณ คุณ TTT ครับ
Time: 0.5269s
ID stock_name date close_price
1 PTT 12/7/2016 311
2 PTT 13/7/2016 314
3 PTT 14/7/2016 315
4 PTT 15/7/2016 325
5 PTT 20/7/2016 330
6 PTT 21/7/2016 336
7 PTT 22/7/2016 333
8 PTT 25/7/2016 339
9 PTT 26/7/2016 338
10 PTT 27/7/2016 332
11 PTT 28/7/2016 328
12 PTT 29/7/2016 334
13 PTT 1/8/2016 332
14 PTT 2/8/2016 323
15 PTT 3/8/2016 320
16 PTT 4/8/2016 326
17 PTT 5/8/2016 335
สมมุติตารางชื่อ Table1
เขียน SQL ประมาณนี้:
SELECT t1.ID, t1.stock_name, t1.date, t1.close_price,
iif(t1.ID< DMax("ID","Table1") - 3,(SELECT Avg(t2.close_price) FROM Table1 AS t2 WHERE t2.ID >= t1.ID AND t2.ID < t1.ID + 5), Null) AS MA_5,
iif(t1.ID< DMax("ID","Table1") - 8,(SELECT Avg(t2.close_price) FROM Table1 AS t2 WHERE t2.ID >= t1.ID AND t2.ID < t1.ID + 10), Null) AS MA_10
FROM Table1 AS t1
ORDER BY t1.ID DESC;
- ข้อควรระวังคือ เลขฟิลด์ ID จะต้องรันไล่ตัวเลขไปเรื่อยๆ ห้ามข้ามเลข เช่นถ้ามีการลบเรคคอร์ดเลข ID จะข้ามไป อย่างนี้การคำนวณจะผิด ทุกครั้งที่ทำการลบเรคคอร์ดต้อง Compact and repair ทุกครั้งซึ่งมันจะยุ่งยาก แต่หากข้อมูลเป็นการบันทึกแบบไม่มีการลบก็ไม่มีปัญหาครับ
ปรับใช้ดูครับ