آپ کی تجزیاتی حکمت عملی کے ساتھ اشارے جیسے شارپ ریٹ، زیادہ سے زیادہ واپسی، واپسی کی شرح

مصنف:چھوٹا سا خواب, تخلیق: 2022-11-26 15:13:17, تازہ کاری: 2023-09-18 20:21:39

img

آپ کی تجزیاتی حکمت عملی کے ساتھ اشارے جیسے شارپ ریٹ، زیادہ سے زیادہ واپسی، واپسی کی شرح

اکثر دوست حکمت عملی کے بارے میں بات کرتے ہیں ، اور ایف ایم زیڈ کے اے پی آئی دستاویزات میں بھی ایک الگورتھم شائع کیا گیا ہے۔ لیکن اس کے بغیر کوئی تبصرہ نہیں کیا گیا ہے ، کچھ غلط فہمیاں ہیں۔ اس مضمون میں ہم آپ کو اس الگورتھم کا تجزیہ کرنے کے لئے لے جاتے ہیں ، امید ہے کہ اس مضمون کو پڑھنے کے بعد آپ کو شارپ کی شرح ، زیادہ سے زیادہ واپسی ، منافع کی شرح جیسے تصورات ، حساب کتاب اور منطق کی واضح تفہیم ہوگی۔

ہم براہ راست سورس کوڈ اپ لوڈ کرتے ہیں ، جو جاوا اسکرپٹ میں لکھا ہوا ہے۔ FMZ کا ریٹرن سسٹم بھی اس الگورتھم کا استعمال کرتا ہے تاکہ ریٹرن کارکردگی کا ڈیٹا خود بخود تیار کیا جاسکے۔

returnAnalyze فنکشن

function returnAnalyze(totalAssets, profits, ts, te, period, yearDays)

https://www.fmz.com/api#回测系统夏普算法

یہ ایک حساباتی فنکشن ہے، تو یہ یقینی طور پر ان پٹ، آؤٹ پٹ ہے.

totalAssets, profits, ts, te, period, yearDays
  • کل اثاثے یہ پیرامیٹر اسٹریٹجی شروع ہونے پر ابتدائی اثاثوں کا مجموعہ ہے۔

  • منافع یہ پیرامیٹر ایک اہم پیرامیٹر ہے کیونکہ کارکردگی کے اشارے کی ایک سیریز کا حساب اس خام ڈیٹا کے گرد کیا جاتا ہے۔ یہ پیرامیٹر ایک دو جہتی صف ہے جس کی شکل ہے جیسے:[[timestamp1, profit1], [timestamp2, profit2], [timestamp3, profit3], ....., [timestampN, profitN]]آپ دیکھ سکتے ہیں کہ اس returnAnalyze فنکشن کو ایک ایسا ڈیٹا ڈھانچہ درکار ہے جس میں ہر لمحے کے فوائد کو ریکارڈ کیا جائے گا۔ timestamp1 سے timestampN دور اور قریب سے وقت میں ترتیب میں ہے۔ ہر ٹائم پوائنٹ پر ایک منافع کی قیمت ہوتی ہے۔ مثال کے طور پر منافع ریکارڈ میں تیسرا ٹائم پوائنٹ [timestamp3، profit3] ہے۔ FMZ آن لائن ریٹرن سسٹم میں یہ profits سیٹ ڈیٹا ریٹرن اس فنکشن کو ٹیسٹنگ سسٹم کے ذریعہ فراہم کیا جاتا ہے ، یقینا if اگر آپ خود ہی منافع کے اعداد و شمار کو ریکارڈ کرتے ہیں تو ، اس طرح کی ایک صفاتی ساخت تشکیل دیتے ہیں ، اس کے نتیجے میں اس کیلکولیشن فنکشن کو بھی حساب کتاب فراہم کیا جاسکتا ہے۔

  • ts اس کے بعد ، اس نے اپنی پہلی پوسٹ میں کہا:

  • te اس کا مطلب یہ ہے کہ اس کا مطلب یہ ہے کہ اس کا مطلب یہ ہے کہ اس کا مطلب یہ ہے کہ اس کا مطلب یہ ہے کہ اس کا مطلب یہ ہے کہ اس کا مطلب یہ ہے کہ اس کا مطلب یہ ہے کہ اس کا مطلب یہ ہے.

  • مدت ایک بار جب آپ نے اس کا استعمال کیا ہے تو ، آپ کو اس کا استعمال کرنے کی ضرورت نہیں ہے۔

  • سال کے دن ایک سال کی تجارت کا دن۔

اب ہم اس فنکشن کے نتائج پر نظر ڈالتے ہیں:

return {
        totalAssets: totalAssets,
        yearDays: yearDays,
        totalReturns: totalReturns,
        annualizedReturns: annualizedReturns,
        sharpeRatio: sharpeRatio,
        volatility: volatility,
        maxDrawdown: maxDrawdown,
        maxDrawdownTime: maxDrawdownTime,
        maxAssetsTime: maxAssetsTime,
        maxDrawdownStartTime: maxDrawdownStartTime,
        winningRate: winningRate
    }
  • totalAssets: ابتدائی خالص مالیت
  • yearDays: تجارت کے دنوں کی تعداد
  • totalReturns: مجموعی منافع
  • annualizedReturns: سالانہ چینی منافع
  • sharpeRatio: شارپ تناسب
  • volatility: اتار چڑھاؤ کی شرح
  • maxDrawdown: زیادہ سے زیادہ واپسی
  • maxDrawdownTime: زیادہ سے زیادہ واپسی کا وقت
  • maxAssetsTime: زیادہ سے زیادہ خالص وقت کے لئے وقت کی حد
  • maxDrawdownStartTime: ڈرا ڈاؤن شروع ہونے کا زیادہ سے زیادہ وقت
  • winningRate: جیتنے کی شرح

img

جب آپ ان پٹ اور آؤٹ پٹ کو جانتے ہیں تو آپ کو معلوم ہوتا ہے کہ یہ فنکشن کیا کرتا ہے۔ بس اس فنکشن کو کچھ خام ریکارڈ دیں، جیسے کہ منافع کا اعدادوشمار۔ فنکشن آپ کو نتائج کا حساب دیتا ہے تاکہ آپ کو ٹیسٹ کے نتائج دکھائے جائیں۔

اس کے بعد ہم دیکھیں گے کہ کوڈ کس طرح حساب کرتا ہے:

function returnAnalyze(totalAssets, profits, ts, te, period, yearDays) {
    // force by days
    period = 86400000                  // 一天的毫秒数,即 60 * 60 * 24 * 1000
    if (profits.length == 0) {         // 如果参数profits数组长度为0,无法计算直接返回空值
        return null
    }
    var freeProfit = 0.03              // 无风险利率 ,也可以根据需求设置,例如国债年化3%
    var yearRange = yearDays * 86400000          // 一年所有累计的交易日的毫秒数
    var totalReturns = profits[profits.length - 1][1] / totalAssets      // 累计收益率
    var annualizedReturns = (totalReturns * yearRange) / (te - ts)       // 年华收益率,把收益统计的时间缩放到一年的尺度上得出的预期收益率

    // MaxDrawDown
    var maxDrawdown = 0           // 初始化最大回撤变量为0
    var maxAssets = totalAssets   // 以初始净值赋值初始化最大资产变量
    var maxAssetsTime = 0         // 初始化最大资产时刻的时间戳
    var maxDrawdownTime = 0       // 初始化最大回撤时刻的时间戳
    var maxDrawdownStartTime = 0  // 初始化最大回撤开始时刻的时间戳
    var winningRate = 0           // 初始化胜率为0
    var winningResult = 0         // 记录赢的次数
    for (var i = 0; i < profits.length; i++) {      // 遍历收益数组
        if (i == 0) {
            if (profits[i][1] > 0) {                // 如果第一个收益记录点,收益大于0,表示盈利
                winningResult++                     // 赢的次数累加1 
            }
        } else {                                    // 如果不是第一个收益记录点,只要当前的点的收益,大于前一个时刻(收益点)的收益,表示盈利,赢的次数累加1 
            if (profits[i][1] > profits[i - 1][1]) {
                winningResult++
            }
        }
        if ((profits[i][1] + totalAssets) > maxAssets) {    // 如果该时刻的收益加初始净值大于记录出现过的最大资产,就更新最大资产数值,记录这个时刻的时间戳
            maxAssets = profits[i][1] + totalAssets
            maxAssetsTime = profits[i][0]
        }
        if (maxAssets > 0) {                                // 当记录的最大资产数值大于0时,计算回撤
            var drawDown = 1 - (profits[i][1] + totalAssets) / maxAssets
            if (drawDown > maxDrawdown) {                   // 如果当前回撤大于记录过的最大回撤,更新最大回撤、最大回撤时间等
                maxDrawdown = drawDown
                maxDrawdownTime = profits[i][0]
                maxDrawdownStartTime = maxAssetsTime
            }
        }
    }
    if (profits.length > 0) {                            // 计算胜率
        winningRate = winningResult / profits.length
    }
    // trim profits
    var i = 0
    var datas = []
    var sum = 0
    var preProfit = 0
    var perRatio = 0
    var rangeEnd = te
    if ((te - ts) % period > 0) {
        rangeEnd = (parseInt(te / period) + 1) * period     // 把rangeEnd处理为period的整倍数
    }
    for (var n = ts; n < rangeEnd; n += period) {
        var dayProfit = 0.0
        var cut = n + period
        while (i < profits.length && profits[i][0] < cut) {    // 确保当时间戳不越界,数组长度也不越界
            dayProfit += (profits[i][1] - preProfit)           // 计算每天的收益
            preProfit = profits[i][1]                          // 记录昨日的收益
            i++                                                // 累加i用于访问下一个profits节点
        }
        perRatio = ((dayProfit / totalAssets) * yearRange) / period   // 计算当时年华的收益率
        sum += perRatio                                               // 累计
        datas.push(perRatio)                                          // 放入数组 datas
    }

    var sharpeRatio = 0                    // 初始夏普比率为0
    var volatility = 0                     // 初始波动率为0
    if (datas.length > 0) {
        var avg = sum / datas.length;      // 求均值
        var std = 0;
        for (i = 0; i < datas.length; i++) {
            std += Math.pow(datas[i] - avg, 2);      // std用于计算后面的方差,后面的std / datas.length就是方差,求算数平方根就是标准差
        }
        volatility = Math.sqrt(std / datas.length);  // 当按年时,波动率就是标准差
        if (volatility !== 0) {
            sharpeRatio = (annualizedReturns - freeProfit) / volatility   // 夏普计算公式计算夏普率:(年华收益率 - 无风险利率) / 标准差 
        }
    }

    return {
        totalAssets: totalAssets,
        yearDays: yearDays,
        totalReturns: totalReturns,
        annualizedReturns: annualizedReturns,
        sharpeRatio: sharpeRatio,
        volatility: volatility,
        maxDrawdown: maxDrawdown,
        maxDrawdownTime: maxDrawdownTime,
        maxAssetsTime: maxAssetsTime,
        maxDrawdownStartTime: maxDrawdownStartTime,
        winningRate: winningRate
    }
}

مجموعی طور پر ، الگورتھم پیچیدہ نہیں ہے ، اور اس میں کچھ تصورات ہوسکتے ہیں جن کو پہلے سے جاننے کی ضرورت ہے۔

  • فرق: یہ اعداد و شمار ایک مجموعہ کے طور پر سمجھا جا سکتا ہے: 1، 2، 3، 4، 5 اس نمونہ کا مجموعہ، جس کا اوسط نمبر ((1+2+3+4+5) /5) = 3 ہے، اور فرق ان اعداد و شمار میں سے ہر ایک کے درمیان فرق کے مربع کے مجموعے کا اوسط نمبر ہے: [(1-3) ^ 2 + ((2-3) ^ 2 + ((3-3) ^ 2 + ((4-3) ^ 2 + ((5-3) ^ 2) / 5 = 2 ، فرق 2 ہے۔

  • معیاری نہیں: اس کے علاوہ، اگر آپ کو اس بات کا یقین نہیں ہے کہ آپ کو اس کی ضرورت ہے تو، آپ کو اس کی ضرورت نہیں ہے.

  • شرحِ نقل و حرکت: جب حساب کی پیمائش سالانہ کی جاتی ہے تو ، اتار چڑھاؤ معیاری خرابی ہے۔

اگر آپ ان تصورات اور حساب کتاب کے فارمولوں کو سمجھتے ہیں تو آپ کو اس فنکشن میں شرف حساب کتاب کے بارے میں کچھ معلوم ہوگا۔ شارپ کا حساب لگانے کا فارمولا شارپ کی شرح کا حساب لگانا: ((سالانہ چینی منافع - خطرہ سے پاک شرح سود) / معیاری فرق

کیا آپ نے سیکھا ہے؟


متعلقہ

مزید