จากที่เราได้ทำโมเดล LSTM ที่ใช้สำหรับ
พยากรณ์ high และ low ของราคาทองคำ
พอลองปรับค่า input เพื่อดูการพยากรณ์
พบว่ามันตรงกับ Chart Pattern เลย
เพียงแต่ มันจะไม่ได้ตรงไปตรงมาเหมือนกับที่เรารู้
ดังภาพในสปอยล์ (จะได้ไม่รกกระทู้):
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
ยกตัวอย่าง อาทิ Bulling Flag
ไม่ได้แปลว่าเมื่อมัน Break out แล้ว
ราคาจะพุ่งขึ้นเลย เพราะ new high
และ new low จะแค่สูงขึ้นหน่อย
และเพราะว่า input ที่ใช้เป็น high กับ low แสดงว่า
open, close, volume, กราฟแท่งเทียน
ไม่น่ามีผลต่อการพยากรณ์มาก
และเนื่องจาก R² ของโมเดล มีค่าประมาณ 0.75
ฉะนั้นมันจะไม่สามารถพยากรณ์ได้ถูกต้อง 100%
แต่จะพอ Generalize ประมาณอนาคตได้ แบบภาพนี้
ถ้าจะนำไปใช้งาน ก็ให้มองว่า A.I. (LSTM) ตัวนี้
เป็นเพียงเครื่องมือช่วยวางแผนในการลงทุนหรือการเทรดก็พอ
เราทำโมเดลตัวนี้เป็น Open-source
จะเอาไปทำอะไรก็ได้ คัดลอก ดัดแปลง
ทำให้ UI ดูดีขึ้น, ฝังเข้าไปในโปรแกรมเทรด,
ทำเป็น Robot trade หรือแม้กระทั่งนำไปขาย ยังไงก็ได้ ไม่ห้าม
(ขอแค่อย่ามาหาว่า เรา Copy จากของคนอื่นมาก็พอ)
ปล. เนื่องจากโค้ดที่แสดงผลการพยากรณ์
มันมี Bug ก็คือ ตัวเลขกราฟมันจะทับกันเรื่อย ๆ
เมื่อปรับค่าใหม่ เราก็เลยแก้ไขแล้วได้โค้ดใหม่
ที่ไม่มี Bug นั้นแล้วมาให้ ได้แบบนี้:
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้import numpy as np
import matplotlib.pyplot as plt
import ipywidgets as widgets
from IPython.display import display, clear_output
slider_high1 = widgets.FloatSlider(value=1.0, min=0, max=1.0, step=0.01, description='High 1', continuous_update=False)
slider_low1 = widgets.FloatSlider(value=0.0, min=0, max=1.0, step=0.01, description='Low 1', continuous_update=False)
slider_high2 = widgets.FloatSlider(value=1.0, min=0, max=1.0, step=0.01, description='High 2', continuous_update=False)
slider_low2 = widgets.FloatSlider(value=0.0, min=0, max=1.0, step=0.01, description='Low 2', continuous_update=False)
ref_high = widgets.FloatText(value=2600, description='Actual Max')
ref_low = widgets.FloatText(value=1900, description='Actual Min')
label_high1 = widgets.Label()
label_low1 = widgets.Label()
label_high2 = widgets.Label()
label_low2 = widgets.Label()
pred_label = widgets.Label(value="📊 Predicted High & Low will appear here")
fig, ax = plt.subplots(figsize=(14, 7))
def update_plot(change=None):
global fig, ax
plt.clf()
fig, ax = plt.subplots(figsize=(14, 7))
highs = [slider_high1.value, slider_high2.value]
lows = [slider_low1.value, slider_low2.value]
actual_max = ref_high.value
actual_min = ref_low.value
def denorm(val): return val * (actual_max - actual_min) + actual_min
label_high1.value = f"→ {denorm(slider_high1.value):.2f}"
label_low1.value = f"→ {denorm(slider_low1.value):.2f}"
label_high2.value = f"→ {denorm(slider_high2.value):.2f}"
label_low2.value = f"→ {denorm(slider_low2.value):.2f}"
input_data = np.array([[highs[0], lows[0]], [highs[1], lows[1]]])
input_tensor = input_data.reshape(1, 2, 2)
prediction = model.predict(input_tensor, verbose=0)[0]
pred_high, pred_low = max(prediction[0], prediction[1]), min(prediction[0], prediction[1])
ax.fill_between([0, 1], highs, lows, color='skyblue', alpha=0.4, label="Actual Range")
ax.plot([0, 1], highs, color='blue', label="Actual High")
ax.plot([0, 1], lows, color='blue', linestyle='dotted', label="Actual Low")
ax.fill_between([1, 2], [highs[1], pred_high], [lows[1], pred_low], color='salmon', alpha=0.4, label="Predicted Range")
ax.plot([1, 2], [highs[1], pred_high], color='red', label="Predicted High")
ax.plot([1, 2], [lows[1], pred_low], color='red', linestyle='dotted', label="Predicted Low")
points = [
(0, highs[0], "High", 'blue'),
(0, lows[0], "Low", 'blue'),
(1, highs[1], "High", 'blue'),
(1, lows[1], "Low", 'blue'),
(2, pred_high,"High", 'red'),
(2, pred_low, "Low", 'red')
]
for x, y, label, color in points:
ax.text(x, y + 0.03, f"{label}: {y:.2f} → {denorm(y):.2f}", color=color, fontsize=10, ha='center', va='bottom', bbox=dict(boxstyle='round,pad=0.2', fc='white', ec=color, lw=1, alpha=0.5))
ax.set_xlim(-1, 3)
ax.set_ylim(-0.5, 1.5)
ax.set_xticks([0, 1, 2])
ax.set_xticklabels(["T-1", "T", "T+1 (Predicted)"])
ax.set_title("Gold Price Prediction")
ax.set_ylabel("Normalized Price")
ax.grid(True)
ax.legend(loc='upper left')
ax2 = ax.twinx()
ax2.set_ylim(ax.get_ylim())
yticks = np.linspace(*ax.get_ylim(), num=6)
ax2.set_yticks(yticks)
ax2.set_yticklabels([f'{denorm(y):.2f}' for y in yticks])
ax2.set_ylabel("Actual Price")
pred_label.value = f"📊 Predicted High: {denorm(pred_high):.2f} | Low: {denorm(pred_low):.2f}"
clear_output(wait=True)
display(ui, fig)
plt.close(fig)
def sync_slider_constraints(change=None):
slider_low1.max = slider_high1.value
if slider_low1.value > slider_high1.value:
slider_low1.value = slider_high1.value
slider_low2.max = slider_high2.value
if slider_low2.value > slider_high2.value:
slider_low2.value = slider_high2.value
slider_high1.observe(sync_slider_constraints, names='value')
slider_high2.observe(sync_slider_constraints, names='value')
for s in [slider_high1, slider_low1, slider_high2, slider_low2, ref_high, ref_low]:
s.observe(update_plot, names='value')
ui = widgets.VBox([
widgets.HTML("<h3>🎛️ Adjust Normalized Inputs + Reference Range</h3>"),
widgets.HBox([slider_high1, label_high1]),
widgets.HBox([slider_low1, label_low1]),
widgets.HBox([slider_high2, label_high2]),
widgets.HBox([slider_low2, label_low2]),
ref_high, ref_low,
pred_label
])
sync_slider_constraints()
display(ui)
update_plot()
# ก่อนที่จะใช้งาน เราต้องรู้ high กับ low ของราคาทองคำในเมื่อวาน (ไม่ก็วันศุกร์ที่แล้ว) และวันนี้ก่อน
# เพื่อที่เราจะได้พยากรณ์ high และ low ของราคาทองคำในวันพรุ่งนี้ (ไม่ก็วันจันทร์หน้า) ได้
# วิธีการใช้งาน:
# 1. ให้ตั้งค่า Actual Max เป็นค่า high สูงสุดของราคาทองคำที่จะใช้เพื่อนำมาพยากรณ์
# และตั้งค่า Actual Min เป็นค่า low ต่ำสุดของราคาทองคำที่จะใช้เพื่อนำมาพยากรณ์
# โดยหน่วยที่ใช้นั้น จะเป็นสกุลเงินอะไรก็ได้ เพราะว่าโมเดลพยากรณ์โดยอาศัยข้อมูลที่เป็นอัตราส่วน
# 2. ให้ปรับค่า High 1 เป็น high ของราคาทองคำในเมื่อวาน (ไม่ก็วันศุกร์ที่แล้ว)
# และปรับค่า High 2 เป็น high ของราคาทองคำในวันนี้
# อย่าเพิ่งปรับค่า Low 1 หรือ Low 2 เพราะสองค่าที่ว่า จะสัมพันธ์กับ High
# 3. ให้ปรับค่า Low 1 เป็น low ของราคาทองคำในเมื่อวาน (ไม่ก็วันศุกร์ที่แล้ว)
# และปรับค่า Low 2 เป็น low ของราคาทองคำในวันนี้
# 4. อ่านการพยากรณ์ของ high และ low ของราคาทองคำในวันพรุ่งนี้ (ไม่ก็วันจันทร์หน้า)
# เพื่อประกอบการช่วยสินใจในด้านการลงทุนหรือการเก็งกำไร
Chart Pattern มันสามารถใช้งานได้จริง แต่ไม่ได้เป็นอย่างที่คิดไว้
พยากรณ์ high และ low ของราคาทองคำ
พอลองปรับค่า input เพื่อดูการพยากรณ์
พบว่ามันตรงกับ Chart Pattern เลย
เพียงแต่ มันจะไม่ได้ตรงไปตรงมาเหมือนกับที่เรารู้
ดังภาพในสปอยล์ (จะได้ไม่รกกระทู้):
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
ยกตัวอย่าง อาทิ Bulling Flag
ไม่ได้แปลว่าเมื่อมัน Break out แล้ว
ราคาจะพุ่งขึ้นเลย เพราะ new high
และ new low จะแค่สูงขึ้นหน่อย
และเพราะว่า input ที่ใช้เป็น high กับ low แสดงว่า
open, close, volume, กราฟแท่งเทียน
ไม่น่ามีผลต่อการพยากรณ์มาก
และเนื่องจาก R² ของโมเดล มีค่าประมาณ 0.75
ฉะนั้นมันจะไม่สามารถพยากรณ์ได้ถูกต้อง 100%
แต่จะพอ Generalize ประมาณอนาคตได้ แบบภาพนี้