ขอสอบถามการคำนวณ ค่า Moving Average
กระทู้เก่าบอร์ด อ.Yeadram

 939   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

รบกวน หน่อยครับ

4 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R22413
ให้คุณเพิ่มฟิลด์ ID เป็น Autonumber โดยตารางจะเป็นแบบนี้

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 ทุกครั้งซึ่งมันจะยุ่งยาก แต่หากข้อมูลเป็นการบันทึกแบบไม่มีการลบก็ไม่มีปัญหาครับ

ปรับใช้ดูครับ
2 @R22416
เรียน คุณ TTT   ผมลองทำแล้วปรากฎว่า วันที่เรียงผิด พอผมลองแก้ DESC เป็น ASC ก็ผิดอีก ตามตัวอย่างที่คุณ TTT เรียงวันที่ไว้ถูกแล้ว (ตัวอย่างของผมผิดครับ) คือวันที่ที่ถูกต้องเรียงจากน้อยไปมาก (ตามที่ในความเห็นคุณทำไว้ถูกแล้ว) และช่องว่างใน MA_5,MA_10 ต้องอยู่ด้านบน


คือต้องขอโทษด้วยผมไม่มีความรู้ SQL    เลยอ่านตามที่คุณทำไว้ให้ไม่ค่อยเข้าใจ จึง Copy แล้วไป Paste เลย แล้วพยายามปรับแก้เอา เท่าที่จะพอทำได้
3 @R22417
ลองโหลดตัวอย่างนี้ดูครับ
Download
4 @R22418
ขอบคุณ คุณ TTT ครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3015s