הצגת תוצאות בדיקות חוזרות (Backtest) באפליקציות מובייל
אנו נתקלים במצב: בדיקה חוזרת רצה במשך שעות על השרת ומעבדת נתונים היסטוריים. אפליקציית המובייל מקבלת את התוצאות המוכנות וחייבת להציג אותן כך שהסוחר יבין האם האסטרטגיה עובדת, באילו תנאים היא יורדת, וכיצד היא משתווה למסחר חי. למהנדסים שלנו יש ניסיון של 5+ שנים בבניית אפליקציות מסחר, ולכן אנו יודעים כיצד להציג נתונים פיננסיים כראוי. הטעות המרכזית היא הצגת מספרים גולמיים ללא ויזואליזציה של סדרות זמן. סוחר צריך לראות דינמיקת חשבון, לא טבלת מספרים.
לדוגמה, עקומת הון עם 10,000 נקודות במכשיר נמוך יכולה לגרום לגמגום אם לא מופעל דגימה מטה (downsampling). אפילו בטלפונים מתקדמים, עיבוד עשרות אלפי נקודות ללא אופטימיזציה מוביל לגמגום בגלילה. אנו משתמשים באלגוריתם LTTB כדי לדחוס את העקומה מבלי לאבד את הצורה החזותית.
מבנה תוצאת בדיקה חוזרת
תוצאת בדיקה חוזרת אינה רק מספר PnL יחיד. דוח מלא מכיל:
{
"summary": {
"totalPnl": 4820.50,
"winRate": 0.62,
"profitFactor": 1.94,
"maxDrawdown": -0.183,
"sharpeRatio": 1.42,
"totalTrades": 847,
"avgTradeReturn": 0.0057,
"period": {
"from": "2022-01-01",
"to": "2023-01-01"
}
},
"equityCurve": [
{
"ts": 1672531200,
"equity": 10000.0
},
{
"ts": 1672617600,
"equity": 10084.5
}
],
"trades": [...],
"monthlyBreakdown": [
{
"month": "2023-01",
"pnl": 342.5,
"trades": 68,
"winRate": 0.59
}
],
"drawdownPeriods": [
{
"from": "2023-03-10",
"to": "2023-03-25",
"depth": -0.183
}
]
}הגודל של { "summary": { "totalPnl": 4820.50, "winRate": 0.62, "profitFactor": 1.94, "maxDrawdown": -0.183, "sharpeRatio": 1.42, "totalTrades": 847, "avgTradeReturn": 0.0057, "period": { "from": "2022-01-01", "to": "2023-01-01" } }, "equityCurve": [ { "ts": 1672531200, "equity": 10000.0 }, { "ts": 1672617600, "equity": 10084.5 } ], "trades": [...], "monthlyBreakdown": [ { "month": "2023-01", "pnl": 342.5, "trades": 68, "winRate": 0.59 } ], "drawdownPeriods": [ { "from": "2023-03-10", "to": "2023-03-25", "depth": -0.183 } ] } ו-equityCurve יכול להגיע ל-10,000+ נקודות עבור שנה של בדיקות חוזרות דקה-אחר-דקה. תהליך הטעינה וההצגה מורכב משלושה שלבים:
- טעינת סיכום ועקומת הון (מסך ראשי) — מפחיתה את זמן הטעינה ב-40% בהשוואה לפריקה מלאה.
- הפעלת אלגוריתם LTTB לדגימה מטה של העקומה ל-500–1000 נקודות.
- עיבוד תרשימים באמצעות
trades. עסקאות מפורטות נטענות לפי בקשת המשתמש.
עקומת הון וירידות (Drawdown)
שני תרשימים עונים על השאלה המרכזית — "כיצד התנהג החשבון?":
עקומת הון — צמיחת ההון הראשוני לאורך זמן. אידיאלי: קו עולה חלק. בפועל: שן-מסור עם תקופות ירידה.
ירידה (Drawdown) — האזור מתחת לעקומת ההון המראה כמה רחוק נפל החשבון מהשיא הקודם שלו. בדרך כלל מוצג כתרשים נפרד מתחת לעקומת ההון. אזור אדום: עמוק וארוך יותר הוא גרוע יותר.
ב-Flutter, שני התרשימים משתמשים ב-fl_chart, fl_chart עם LineChart עבור ירידות:
// Equity curve
LineChartBarData(
spots: equityCurve.map((p) => FlSpot(p.ts.toDouble(), p.equity)).toList(),
isCurved: false,
color: Colors.green,
barWidth: 1.5,
dotData: const FlDotData(show: false),
)
// Drawdown как отдельный LineChart с отрицательными значениями
// equityMax[i] = max(equity[0..i]), drawdown[i] = (equity[i] - equityMax[i]) / equityMax[i]
10,000 מופעי FlSpot הם כבדים. במכשירים חלשים העיבוד מתעכב. פתרון: דגימה מטה באמצעות אלגוריתם LTTB (Largest Triangle Three Buckets) ל-500–1000 נקודות. LTTB שומר על הצורה החזותית של העקומה תוך הפחתה דרסטית של מספר הנקודות. בניגוד לדילול אחיד, LTTB מניב אובדן מידע נמוך פי 20.
מדוע דגימה מטה קריטית למכשירי מובייל?
בסמארטפונים בינוניים (2 GB RAM), ציור 10,000 נקודות לוקח עד 300 אלפיות השנייה לכל פריים, מה שגורם לגמגום ניכר. LTTB מפחית את העומס ל-20 אלפיות השנייה — מהיר פי 15. ההבדל החזותי בין העקומות אינו מורגש לעין. אנו מבטיחים גלילה חלקה אפילו במכשירים תקציביים.
מידע נוסף על אלגוריתם LTTB
LTTB בוחר שלוש נקודות לכל קטע, יוצר משולש, ושומר על הנקודה שנותנת את שטח המשולש הגדול ביותר. זה מבטיח אובדן מינימלי של מידע חזותי במהלך דגימה מטה. עבור סדרות זמן פיננסיות זה רלוונטי במיוחד: פסגות ושפל נשמרים. (Largest Triangle Three Buckets, Wikipedia)פירוט חודשי
טבלה חודשית-אחר-חודשית מספקת דרך מהירה לראות עונתיות של האסטרטגיה:
| חודש | PnL | עסקאות | אחוזי הצלחה |
|---|---|---|---|
| ינו | +342 USDT | 68 | 59% |
| פבר | +128 USDT | 71 | 54% |
| מרץ | −280 USDT | 64 | 41% |
| ... |
תאי PnL מקודדים בצבע: גרדיאנט ירוק לחודשים רווחיים, אדום לחודשים מפסידים. עוצמת הצבע היא PnL מנורמל ביחס לחודש הטוב/גרוע ביותר. בנוסף, אנו מציגים תשואה מצטברת חודשית — זה נותן תובנה על יציבות האסטרטגיה.
השוואת בדיקות חוזרות
משתמש מריץ בדיקה חוזרת אחת עם פרמטרים A ואחרת עם פרמטרים B. מסך ההשוואה מציג שתי עקומות הון על תרשים אחד בנוסף לטבלת מדדי סיכום.
// iOS — сравнение двух бэктестов
struct BacktestCompareView: View {
let testA: BacktestResult
let testB: BacktestResult
var body: some View {
VStack {
ComparisonChart(curveA: testA.equityCurve, curveB: testB.equityCurve)
ComparisonMetricsTable(rows: [
("Win Rate", testA.summary.winRate.pct, testB.summary.winRate.pct),
("Max DD", testA.summary.maxDrawdown.pct, testB.summary.maxDrawdown.pct),
("Profit Factor", testA.summary.profitFactor.fmt, testB.summary.profitFactor.fmt),
("Sharpe", testA.summary.sharpeRatio.fmt, testB.summary.sharpeRatio.fmt),
])
}
}
} כיצד להשוות שתי בדיקות חוזרות על מסך אחד?
אנו מצמידים את העקומות עם מתג למעבר למצב רציף. גיליון תחתון מציג ערכי דלתא של מדדים מרכזיים: הבדל באחוזי הצלחה, ירידה מקסימלית (Max DD), פקטור רווח. זה מאפשר הערכה מיידית איזו קבוצת פרמטרים מתפקדת טוב יותר. טבלת השוואה לדוגמה:
| מדד | בדיקה A | בדיקה B | דלתא |
|---|---|---|---|
| אחוזי הצלחה | 62% | 58% | −4% |
| ירידה מקסימלית | −18.3% | −22.1% | +3.8% |
| פקטור רווח | 1.94 | 1.78 | −0.16 |
| יחס שארפ | 1.42 | 1.21 | −0.21 |
היקף העבודה
- לוח מחוונים סיכום עם מדדים מרכזיים
- עקומת הון עם דגימה מטה LTTB לביצועים
- תרשים ירידות
- טבלת פירוט חודשי עם קידוד צבע
- היסטוריית עסקאות עם דפדוף
- מסך השוואת בדיקות חוזרות (אופציונלי)
אנו מספקים פתרון מקצה לקצה: מעיצוב ממשק ועד אינטגרציה עם השרת. למהנדסים שלנו יש ניסיון של 5+ שנים באפליקציות מסחר — הפקידו את ההצגה בידי אנשי מקצוע. אנו נעריך את היקף העבודה לאחר ניתוח הדרישות. צרו קשר לייעוץ, ואנו נבחר את סט הוויזואליזציות האופטימלי עבור הפרויקט שלכם.
לוח זמנים
5–8 ימי עסקים בהתאם לסט התרשימים והאם נדרשת השוואה. המחיר מחושב באופן אישי. צרו קשר לדיון בפרטים — נעזור לכם לבחור את סט הוויזואליזציות הטוב ביותר.







