אופציות קריפטו הן השוק המורכב והפחות מובן בתחום הקריפטו. Deribit נותרת הפלטפורמה המרכזית לאופציות BTC ו-ETH. מסחר אוטומטי באופציות דורש הבנה של Greeks (דלתא, גמא, תטא, וגה) ותשתית מיוחדת לניהול פוזיציות אופציות. לצוות שלנו ניסיון של 7+ שנים בפיתוח בוטים למסחר ויישמנו 10+ פרויקטים ללקוחות מוסדיים. אנו יוצרים פתרונות סוהר: מאנליטיקה ועד תמיכה בייצור.
התפקיד הקריטי של ניהול Greeks
Greeks הם מדדים נגזרים המתארים את רגישות מחיר האופציה לגורמים שונים. ללא מעקב אוטומטי, אסטרטגיה רווחית היא בלתי אפשרית. דלתא (0.5 משמעותו: עבור עלייה של 100$ ב-BTC, מחיר האופציה משתנה ב-50$), גמא (קצב השינוי של דלתא — סיכון ליצרני שוק), תטא (ריקבון זמן — האופציה מאבדת ערך בכל יום), וגה (רגישות לתנודתיות מרומזת — IV גבוה יותר מעלה את הפרמיה). הבוט חייב לנטר ברציפות את כל ארבעת הפרמטרים ולהתאים פוזיציות. פרמיה אופיינית לאופציית OTM ב-Deribit היא כ-0.006 BTC, וחיסכון בעמלות באמצעות אוטומציה יכול להגיע ל-2,000$ לחודש עבור תיק פעיל. הבוטים שלנו מבצעים עסקאות פי 3 מהר יותר ממסחר ידני, ומפחיתים החלקה (slippage) בעד 60%.
גידור דלתא: נטרול סיכון כיווני
בעת מכירת אופציות, הסיכון הכיווני (דלתא) מנוטרל באמצעות חוזים עתידיים תמידיים (perpetual futures). אם סך הדלתא של התיק חורג מסף של 0.05 BTC, הבוט פותח אוטומטית פוזיציית גידור: מוכר חוזים עתידיים כאשר הדלתא חיובית וקונה כאשר היא שלילית. תהליך זה מתרחש בזמן אמת באמצעות חיבור WebSocket לבורסה. דוגמת יישום של מחלקת גידור מובאת להלן. Deribit עולה על OKX בשלמות ה-Greeks פי 2 — יש לנו תטא ווגה, לא רק דלתא וגמא.
יישום טכני: Deribit API ואסטרטגיית ריקבון תטא
החיבור ל-Deribit הוא דרך WebSocket (גרסת API v2). הלקוח משתמש באימות OAuth ובשיטות לשליפת מכשירים, ספרי הזמנות והצבת הזמנות. אסטרטגיית ריקבון התטא מתמקדת במכירת אופציות מחוץ לכסף (OTM) עם דלתא של ~0.15 ו-7 ימים לפקיעה. רווח ננעל ב-50% מריקבון הפרמיה, והפסד מוגבל ל-200%.
לפי תיעוד Deribit API, WebSocket מספק זמן השהיה מתחת ל-10 אלפיות השנייה.
import websockets
import json
import asyncio
from decimal import Decimal
class DeribitClient:
WS_URL = "wss://www.deribit.com/ws/api/v2"
def __init__(self, client_id: str, client_secret: str):
self.client_id = client_id
self.client_secret = client_secret
self.ws = None
self.request_id = 0
async def connect(self):
self.ws = await websockets.connect(self.WS_URL)
await self.authenticate()
async def authenticate(self):
await self.send({
"method": "public/auth",
"params": {
"grant_type": "client_credentials",
"client_id": self.client_id,
"client_secret": self.client_secret,
}
})
async def send(self, message: dict) -> dict:
self.request_id += 1
message['id'] = self.request_id
message['jsonrpc'] = '2.0'
await self.ws.send(json.dumps(message))
response = json.loads(await self.ws.recv())
return response.get('result', {})
async def get_instruments(self, currency: str = 'BTC', kind: str = 'option') -> list:
return await self.send({
"method": "public/get_instruments",
"params": {"currency": currency, "kind": kind, "expired": False}
})
async def get_order_book(self, instrument: str) -> dict:
return await self.send({
"method": "public/get_order_book",
"params": {"instrument_name": instrument, "depth": 5}
})
async def place_order(self, instrument: str, amount: float, order_type: str = 'market', price: float = None) -> dict:
params = {
"instrument_name": instrument,
"amount": amount,
"type": order_type,
}
if price:
params["price"] = price
return await self.send({
"method": "private/buy" if 'C' in instrument.split('-')[-1] or True else "private/sell",
"params": params
})
async def get_portfolio_greeks(self) -> dict:
"""Суммарные Greeks по всему портфелю"""
return await self.send({
"method": "private/get_account_summary",
"params": {"currency": "BTC", "extended": True}
})אסטרטגיית חיפוש האופציות בוחרת מכשירים עם DTE ודלתא נדרשים, ובוחרת את הטוב ביותר על בסיס מחיר אמצע. דוגמת יישום של מחלקת import websockets import json import asyncio from decimal import Decimal class DeribitClient: WS_URL = "wss://www.deribit.com/ws/api/v2" def __init__(self, client_id: str, client_secret: str): self.client_id = client_id self.client_secret = client_secret self.ws = None self.request_id = 0 async def connect(self): self.ws = await websockets.connect(self.WS_URL) await self.authenticate() async def authenticate(self): await self.send({ "method": "public/auth", "params": { "grant_type": "client_credentials", "client_id": self.client_id, "client_secret": self.client_secret, } }) async def send(self, message: dict) -> dict: self.request_id += 1 message['id'] = self.request_id message['jsonrpc'] = '2.0' await self.ws.send(json.dumps(message)) response = json.loads(await self.ws.recv()) return response.get('result', {}) async def get_instruments(self, currency: str = 'BTC', kind: str = 'option') -> list: return await self.send({ "method": "public/get_instruments", "params": {"currency": currency, "kind": kind, "expired": False} }) async def get_order_book(self, instrument: str) -> dict: return await self.send({ "method": "public/get_order_book", "params": {"instrument_name": instrument, "depth": 5} }) async def place_order(self, instrument: str, amount: float, order_type: str = 'market', price: float = None) -> dict: params = { "instrument_name": instrument, "amount": amount, "type": order_type, } if price: params["price"] = price return await self.send({ "method": "private/buy" if 'C' in instrument.split('-')[-1] or True else "private/sell", "params": params }) async def get_portfolio_greeks(self) -> dict: """Суммарные Greeks по всему портфелю""" return await self.send({ "method": "private/get_account_summary", "params": {"currency": "BTC", "extended": True} }) :
class ThetaDecayStrategy:
""" Зарабатываем на временном распаде, продавая опционы вне денег (OTM).
Стратегия: Cash-Secured Put + Covered Call = Iron Condor упрощённо.
"""
TARGET_DELTA = 0.15
TARGET_DTE = 7
PROFIT_TARGET = 0.50
MAX_LOSS = 2.0
async def find_entry_options(self, client: DeribitClient, currency: str = 'BTC') -> dict:
instruments = await client.get_instruments(currency, 'option')
current_price = await self.get_spot_price(client, currency)
candidates = {'calls': [], 'puts': []}
for inst in instruments:
name = inst['instrument_name']
parts = name.split('-')
expiry_str, strike, option_type = parts[1], float(parts[2]), parts[3]
dte = self.calculate_dte(expiry_str)
if dte < self.TARGET_DTE - 1 or dte > self.TARGET_DTE + 1:
continue
book = await client.get_order_book(name)
if not book.get('greeks'):
continue
delta = abs(float(book['greeks']['delta']))
if abs(delta - self.TARGET_DELTA) < 0.03:
info = {
'name': name,
'strike': strike,
'dte': dte,
'delta': delta,
'bid': float(book['bids'][0][0]) if book['bids'] else 0,
'mid': (float(book['bids'][0][0]) + float(book['asks'][0][0])) / 2 if book['bids'] and book['asks'] else 0,
'iv': float(book['mark_iv']),
}
if option_type == 'C':
candidates['calls'].append(info)
else:
candidates['puts'].append(info)
best_put = max(candidates['puts'], key=lambda x: x['mid']) if candidates['puts'] else None
best_call = max(candidates['calls'], key=lambda x: x['mid']) if candidates['calls'] else None
return {'put': best_put, 'call': best_call}
אילו תכונות ניהול סיכונים כולל הבוט?
לאסטרטגיות מכירת אופציות יש פרופיל א-סימטרי: רווח מוגבל (פרמיה) והפסד פוטנציאלי בלתי מוגבל (עבור אופציות call חשופות). הכללים הבאים הם קריטיים:
- גודל פוזיציה: לא יותר מ-5% מההון לכל עסקה.
- וגה מקסימלית: וגת התיק אינה חורגת מהגבול — עבור תיק של 100,000$, וגה מוגבלת ל-500$.
- מסנן IV: אין למכור אופציות כאשר IV נמוך מ-20% (יחס סיכון/תשואה גרוע).
- הגנה מפני ברבור שחור: תיק קטן של אופציות put מחוץ לכסף כביטוח — בעלות של 0.5% מההון.
השוואת פלטפורמות אופציות:
| פרמטר | Deribit | OKX |
|---|---|---|
| נזילות עבור BTC/ETH | גבוהה (נפח יומי ממוצע 500 מיליון $) | בינונית (50 מיליון $) |
| Greeks ב-API | מלא (דלתא, גמא, תטא, וגה) | רק דלתא, גמא |
| מכשירי גידור | חוזים תמידיים, חוזים עתידיים | חוזים עתידיים |
| ספר הזמנות WebSocket | עד 100 רמות | עד 200 רמות |
| עמלות יוצר/לוקח | 0.03%/0.05% | 0.02%/0.05% |
פרמטרי תצורת אסטרטגיה:
| פרמטר | ערך | הערה |
|---|---|---|
| דלתא יעד | 0.15 | אופציית OTM |
| DTE | 7 ימים | עד לפקיעה |
| יעד רווח | 50% מהפרמיה | לקיחת רווח |
| סטופ לוס | 200% מהפרמיה | הפסד מקסימלי |
| סף גידור | 0.05 BTC | סף דלתא |
תהליך העבודה האוטומטי במסחר באופציות
- ניתוח שוק: איסוף ספר הזמנות ו-Greeks עבור כל המכשירים.
- בחירת אופציות: סינון לפי דלתא, DTE, נפח.
- הצבת הזמנות: הזמנות מגבלה בספר.
- ניטור תיק: כל שנייה, חישוב Greeks נוכחיים.
- גידור: כאשר סף הדלתא נחצה, מסחר עם חוזה תמידי.
- ניהול פוזיציה: לקיחת רווח חלקית וסטופ לוס.
כיצד בדיקת backtesting מאמתת את האסטרטגיה?
בדיקת backtesting מתבצעת על נתונים היסטוריים המכסים לפחות 100 עסקאות ומספר תנאי שוק. אנו משתמשים בספריית אימות המדמה מסחר עם תמונות ספר הזמנות אמיתיות ומתחשבת בהחלקה, עמלות וזמן השהיה. האסטרטגיה חייבת להשיג יחס שארפ מעל 1.5 וירידה מקסימלית מתחת ל-20% כדי להיחשב בת-קיימא. מסחר נייר (paper trading) מאשר לאחר מכן את הביצועים בשווקים חיים לפני פריסה מלאה.
תוצרי פיתוח סוהר
-
תוצרים מפורטים:
- ניתוח דרישות ועיצוב ארכיטקטורת בוט (תיעוד).
- יישום ב-Python באמצעות asyncio ו-WebSocket.
- אינטגרציה עם Deribit API (או בורסה אחרת) — אימות, מסחר, Greeks.
- יישום אסטרטגיית ריקבון תטא עם פרמטרים הניתנים להגדרה.
- מודול ניהול סיכונים עם מגבלות וגידור אוטומטי.
- בדיקת backtesting היסטורית על 100+ עסקאות ותוצאות מסחר נייר.
- פריסה על שרת (VPS/Dedicated) עם הגדרת ניטור.
- תיעוד קוד והוראות תפעול.
- גישה למאגר Git פרטי.
- הדרכה (שעתיים) לצוות שלך.
- תמיכה למשך חודש לאחר ההשקה (תיקוני באגים, התאמות).
לוחות זמנים והערכת עלות
הפיתוח אורך בין 4 ל-8 שבועות בהתאם למורכבות. העלות מחושבת באופן אישי על פי היקף העבודה והאסטרטגיות הנדרשות. מחיר התחלתי אופייני הוא 15,000$, ולקוחות חוסכים לעיתים קרובות 2,000$/חודש בעמלות לאחר הפריסה, ומשיגים החזר השקעה תוך כ-7-8 חודשים. הערכת הפרויקט היא בחינם — צור קשר לייעוץ.
טעויות אופייניות בפיתוח בוטים לאופציות
- התעלמות מסיכון גמא: עם גמא גבוהה, דלתא יכולה להשתנות תוך שניות, והגידור עלול שלא לעמוד בקצב. אנו משתמשים בניטור גמא בזמן אמת עם רזולוציה של 50 אלפיות השנייה.
- גידור יתר: מוביל להפסדים בעמלות. האלגוריתם שלנו משתמש במאגר של 5% כדי להימנע מעסקאות תכופות, ומפחית את עלויות הגידור ב-40%.
- אי התחשבות במרווחים (spreads): מרווחי Deribit צרים (0.01-0.05% עבור אופציות נזילות), אך בשבילים אקזוטיים הם יכולים להיות רחבים (עד 1%). אנו מסננים לפי מרווח, ודוחים אופציות עם מרווח מעל 0.5%.
- חוסר בגיבוי (failover): אובדן חיבור WebSocket עלול להוביל לפוזיציה לא מגודרת. אנו מיישמים חיבור מחדש אוטומטי עם השהיה אקספוננציאלית ומתג כיבוי שסוגר פוזיציות אם החיבור נופל ליותר מ-5 שניות.
אנו מבטיחים יציבות בוט בעומס ומספקים תעודת בדיקה (כולל אימות פורמלי של האסטרטגיה). הזמינו פתרון סוהר כדי לקבל מוצר מוכן עם תיעוד ותמיכה. צרו קשר לייעוץ חינם והערכת פרויקט.







