تداول حين يتداول السوق
متوسط السعر المرجّح بالحجم هو متوسط سعر كل ما جرى تداوله مع ترجيح كل صفقة بحجمها: 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 هو
sum(price * volume) / sum(volume)المرجع الشائع؛ وتتداول خوارزمية VWAP بما يتناسب مع حجم السوق. - قدّر ملف حجم من التاريخ ووزّع الأمر عليه بطريقة الباقي الأكبر لتجمع الأسهم الصحيحة بدقة.
- حدّد سقفًا لمشاركتك في كل فترة ورحّل الباقي؛ واحكم على الخوارزمية بخطأ تتبعها وانزلاقها عبر أيام كثيرة.
التالي: صناعة السوق، تسعير الجانبين وإدارة المخزون الناتج.
المختبر: ما الذي يُقيَّم
- احسب المرجع باستخدام
vwap25 نقطة - ارسم شكل اليوم باستخدام
volume_profile25 نقطة - وزّع الأمر باستخدام
vwap_schedule25 نقطة - احترم السوق باستخدام
cap_participation25 نقطة