σμ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›الوحدة 6 · الاختبار الرجعي وتكاليف التداول›الموضوع 6.4·~45 دمتقدم

تكاليف المعاملات

الموضع في المسارالوحدة 6 من 11 · الموضوع 4 من 6
6.4 تكاليف المعاملات
—درجة المختبر— / 100إجمالي XP—التتابع—

التداول ليس مجانيًا

الاختبار الرجعي الذي يتداول مجانًا يبالغ في كل استراتيجية، وكلما تداول أكثر كذب أكثر. التكاليف الحقيقية هي عمولة الوسيط ورسوم البورصة والجهات الرقابية، وفوق ذلك كله فارق العرض والطلب الذي تعبره في كل مرة. وتُعلن عادة بـالنقاط الأساسية من القيمة المتداولة: 1 نقطة أساس تساوي 0.01%. ورحلة ذهاب وعودة بـ5 نقاط لكل اتجاه تكلف 10 نقاط، وهذا لا تنجو منه استراتيجية تربح 3 نقاط يوميًا إذا انقلبت كل يوم.

def trade_cost(notional, bps):
    return abs(notional) * bps / 10000

print(trade_cost(25000, 5))         # 12.5   buying 25,000 at 5 bps
print(trade_cost(-25000, 5))        # 12.5   selling costs the same
print(trade_cost(1_000_000, 1))     # 100.0  one basis point on a million

معدل الدوران: كم تتداول

تعتمد التكلفة على مقدار تغير المركز لا على حجمه. فإذا كان المركز جزءًا من الحساب، فإن الدوران في يوم هو التغير المطلق عن المركز السابق: abs(position[t] - position[t - 1]) بدءًا من الصفر في اليوم 0. والبقاء شراءً لا يكلف شيئًا بعد الشراء الأول؛ والانتقال من الشراء إلى البيع يتداول الحساب مرتين. ومجموع الدوران في سنة هو أول رقم يُنظر إليه في أي استراتيجية.

import numpy as np

positions = np.array([1.0, 1.0, -1.0, -1.0, 0.0])        # long, long, flip to short, short, flat
turnover = np.abs(np.diff(positions, prepend=0.0))       # day 0 starts from a flat position
print(turnover)                                          # [1. 0. 2. 0. 1.]
print(turnover.sum())                                    # 4.0  accounts traded over the five days

العوائد الصافية وتكلفة التعادل

تكلفة اليوم كجزء من الحساب هي turnover * bps / 10000، والعائد الصافي هو العائد الإجمالي ناقصها. ورقم واحد مفيد هو تكلفة التعادل: التكلفة لكل وحدة متداولة التي يصبح عندها إجمالي الربح صفرًا تمامًا، sum(gross) / sum(turnover) * 10000. قارنها بما تدفعه فعلًا. استراتيجية تعادلها 2 نقطة ميتة عمليًا، وتعادلها 40 نقطة لديها هامش.

# Gross and net returns of a rule that flips often, at 5 bps per unit traded
import numpy as np

rng = np.random.default_rng(11)
positions = np.where(rng.random(250) > 0.5, 1.0, -1.0)      # a coin-flip position, flipping often
gross = rng.normal(0.0015, 0.005, size=250)                   # a strategy with a real daily edge before costs

turnover = np.abs(np.diff(positions, prepend=0.0))
net = gross - turnover * 5 / 10000
print(round(float(gross.sum()), 4), round(float(net.sum()), 4))
print(round(float(turnover.sum()), 1), "accounts traded;", round(float(gross.sum() / turnover.sum() * 10000), 2), "bps break-even")
# The break-even cost of a small example
import numpy as np

gross = np.array([0.004, 0.002, 0.003, 0.001, 0.002])
positions = np.array([1.0, 1.0, -1.0, -1.0, 0.0])
turnover = np.abs(np.diff(positions, prepend=0.0))
breakeven = gross.sum() / turnover.sum() * 10000
print(round(float(breakeven), 2))                                           # 30.0 bps per unit traded
print(abs(round(float((gross - turnover * breakeven / 10000).sum()), 10)))       # 0.0: the whole profit is gone
التكاليف ليست العمولة وحدهارسم ثابت بالنقاط الأساسية هو أبسط نموذج. وتعتمد التكاليف الحقيقية أيضًا على الأداة ووقت اليوم وحجم الأمر: فالفارق أوسع في الأسهم الصغيرة وعند الافتتاح، والأوامر الكبيرة تحرك السعر ضدك، وهذا موضوع المواضيع التالية. وأيًّا كان النموذج فالاختبار الذي يتجاهل التكاليف متفائل، والذي يحتسبها أقل من اللازم خطير.
  • تُعلن التكاليف بالنقاط الأساسية من القيمة المتداولة: abs(notional) * bps / 10000، نفسها للشراء والبيع.
  • الدوران هو abs(تغير المركز) (الانقلاب يتداول 2)؛ العائد الصافي = الإجمالي - الدوران * bps / 10000.
  • تكلفة التعادل sum(gross) / sum(turnover) * 10000 تبين كم تتحمل الاستراتيجية من تكلفة؛ قارنها بالتكلفة الفعلية.

التالي: الانزلاق السعري، الفجوة بين السعر المتوقع والسعر الذي حصلت عليه.

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

  • سعّر صفقة واحدة باستخدام trade_cost25 نقطة
  • احسب ما جرى تداوله باستخدام turnover25 نقطة
  • اخصم الفاتورة باستخدام net_returns25 نقطة
  • اعثر على التكلفة التي تقضي عليها باستخدام breakeven_bps25 نقطة
المستكشف · lab-90-1
▾ lab-90-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-90-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

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

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

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

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

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

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