σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft Academyالمسارات
Ctrl K
AO
+1.2k متعلّم
تسجيل الدخولانضم ↗
المسارات
AO
+1.2k متعلّم
تسجيل الدخول
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
مسار Python›الوحدة 11 · أنظمة الإنتاج والنماذج المتقدمة›الموضوع 11.5·~1 سخبير

تنفيذ VWAP

الموضع في المسارالوحدة 11 من 11 · الموضوع 5 من 13
11.5 تنفيذ VWAP
—درجة المختبر— / 100إجمالي XP—التتابع—

تداول حين يتداول السوق

متوسط السعر المرجّح بالحجم هو متوسط سعر كل ما جرى تداوله مع ترجيح كل صفقة بحجمها: sum(price * volume) / sum(volume). وهو أشيع مرجع في التداول المؤسسي لأنه ما دفعه مشارك متوسط في ذلك اليوم. وتحاول خوارزمية VWAP مجاراته أو التفوق عليه بالتداول *بما يتناسب مع حجم السوق*: كثيرًا حين يكون السوق نشطًا (الافتتاح والإغلاق) وقليلًا حين يهدأ (وقت الغداء). فحيث يتبع TWAP الساعة يتبع VWAP الجمهور، فيكون كل أمر منك جزءًا مماثلًا مما يفعله الآخرون ويحرك السعر أقل.

# The benchmark: each price counts as much as the volume that traded at it
def vwap(prices, volumes):
    return sum(p * v for p, v in zip(prices, volumes)) / sum(volumes)

prices = [100.0, 101.0, 102.0]
volumes = [100, 300, 600]
print(round(vwap(prices, volumes), 4))               # 101.5     most volume traded near 102, so the VWAP leans that way
print(sum(prices) / len(prices))                     # 101.0     the plain average ignores how much traded at each price

ملف حجم وجدول يتبعه

لا يمكن معرفة حجم اليوم مسبقًا، لذا تستعمل خوارزمية VWAP ملف حجم مقدَّرًا من التاريخ: الحصة المتوسطة من حجم اليوم التي جرى تداولها في كل فترة خلال آخر 20 جلسة مثلًا. وعادة يكون الحجم داخل اليوم على شكل حرف U، مرتفعًا عند الافتتاح والإغلاق. ثم يعطي الجدول كل فترة total * share سهم. ونادرًا ما تكون هذه أعدادًا صحيحة، وتقريب كل منها قد يفقد أسهمًا أو يضيفها. وطريقة الباقي الأكبر تعالج هذا: أعطِ كل فترة الجزء الصحيح ثم وزّع الأسهم المتبقية سهمًا لكل منها على الفترات ذات الأجزاء الكسرية الأكبر، فيجمع الجدول الأمر دائمًا.

# From volumes to a profile, then to whole shares by the largest remainder method
import math

def volume_profile(volumes):
    total = sum(volumes)
    return [v / total for v in volumes]

def vwap_schedule(total, profile):
    exact = [total * share for share in profile]
    shares = [math.floor(value + 1e-9) for value in exact]
    leftover = total - sum(shares)
    for index in sorted(range(len(profile)), key=lambda i: (-(exact[i] - shares[i]), i))[:leftover]:
        shares[index] += 1
    return shares

profile = volume_profile([300, 100, 100, 200, 500, 800])       # a U-shape: busy at the open and the close
print([round(p, 3) for p in profile])                # [0.15, 0.05, 0.05, 0.1, 0.25, 0.4]
print(vwap_schedule(1003, profile))                  # [151, 50, 50, 100, 251, 401]   adds up to 1003
print(sum(vwap_schedule(1003, profile)))             # 1003

حدود المشاركة وتتبع المرجع

الجدول خطة، وقد يكون السوق أهدأ مما توقع الملف. وسقف المشاركة يحدّ تداولك في كل فترة بنسبة من حجم السوق الفعلي فيها، 10% مثلًا، فلا تصير أبدًا معظم التدفق. وتُرحَّل الأسهم التي لم تستطع تداولها إلى الفترات اللاحقة، وقد يبقى بعضها غير منفذ في النهاية؛ فتقرر حينئذ أن تتحمل مخاطرة أكبر أو تمدّ النافذة أو تتوقف. وبعد اليوم قارن متوسط سعرك بـ VWAP السوق: الفرق بنقاط الأساس هو خطأ التتبع للخوارزمية. وتجاوز VWAP بالتداول متأخرًا في سوق صاعد ليس مهارة؛ احكم على الخوارزمية بانزلاقها عبر أيام كثيرة.

# A participation cap: never more than a fraction of the market's volume, carrying the rest forward
import math

def cap_participation(schedule, market_volumes, rate):
    trades, carry = [], 0
    for scheduled, volume in zip(schedule, market_volumes):
        wanted = scheduled + carry
        done = min(wanted, math.floor(rate * volume + 1e-9))
        trades.append(done)
        carry = wanted - done
    return trades, carry

print(cap_participation([100, 100, 100], [500, 1000, 1000], 0.1))      # ([50, 100, 100], 50)
print(cap_participation([100, 0, 0, 0], [500, 1000, 400, 800], 0.1))   # ([50, 50, 0, 0], 0)   the carry is traded when the market allows it
# Following the clock (TWAP) and following the volume (VWAP) give different average prices on the same day
prices = [100.0, 100.2, 100.1, 100.4, 100.3, 100.5]
volumes = [300, 100, 100, 200, 500, 800]               # busy at the open and the close

market_vwap = sum(p * v for p, v in zip(prices, volumes)) / sum(volumes)
twap_average = sum(prices) / len(prices)                # equal pieces at every time
print(round(market_vwap, 4), round(twap_average, 4))    # 100.33 100.25
print(round((twap_average - market_vwap) / market_vwap * 10000, 1))      # -8.0   a TWAP buy beat the VWAP here, by trading light when volume was heavy
VWAP مرجع لا هدفمجاراة VWAP تعني أنك تداولت كالمشارك المتوسط، وقد تكون نتيجة سيئة إن دفع أمرك السعر (فصفقاتك جزء من VWAP الذي تُقارَن به). افحص الخوارزمية بمقابل سعر الوصول أيضًا، واختبر الملف على أيام لم يُقدَّر عليها، وتوقّع أن تفشل الملفات في أيام الأخبار ونصف الأيام وإعادة موازنة المؤشرات. واحتفظ بسجل مقروء لكل أمر فرعي للتحليل لاحقًا.
  • VWAP هو sum(price * volume) / sum(volume) المرجع الشائع؛ وتتداول خوارزمية VWAP بما يتناسب مع حجم السوق.
  • قدّر ملف حجم من التاريخ ووزّع الأمر عليه بطريقة الباقي الأكبر لتجمع الأسهم الصحيحة بدقة.
  • حدّد سقفًا لمشاركتك في كل فترة ورحّل الباقي؛ واحكم على الخوارزمية بخطأ تتبعها وانزلاقها عبر أيام كثيرة.

التالي: صناعة السوق، تسعير الجانبين وإدارة المخزون الناتج.

المختبر: ما الذي يُقيَّم

  • احسب المرجع باستخدام vwap25 نقطة
  • ارسم شكل اليوم باستخدام volume_profile25 نقطة
  • وزّع الأمر باستخدام vwap_schedule25 نقطة
  • احترم السوق باستخدام cap_participation25 نقطة
المستكشف · lab-134-1
▾ lab-134-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-134-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

هل تريد إعادة ضبط هذا الموضوع؟

سيعود كل ما في lab-134-1 إلى الملفات الابتدائية وستُمسح الطرفية. ستفقد حلّك الحالي ولا يمكن التراجع عن ذلك.

سيُعاد ضبطه
  • main.py ← الشيفرة الابتدائية
  • سجل الطرفية ومخرجات الاختبارات
  • التغييرات غير المُرسلة
سيُحتفظ به
  • أفضل درجة في المختبر
  • نقاط XP والتتابع
  • تقدّم المحاضرة والملاحظات

سجّل الدخول لتشغيل الكود الخاص بك.

قراءة كل المحاضرات مجانية. أنشئ حسابًا أو سجّل الدخول لتشغيل الكود وتنفيذ الاختبارات وتسليم هذا المختبر.

  • بيئة تطوير داخل المتصفح مع طرفية bash — لا حاجة لتثبيت أي شيء
  • تصحيح فوري ونقاط خبرة ومكانك في المسار
إنشاء حسابتسجيل الدخول
أو
المتابعة عبر GitHub