
گروپ کے اراکین اکثر حکمت عملی کے کچھ کارکردگی کے اشارے الگورتھم پر تبادلہ خیال کرتے ہیں، اور FMZ API دستاویزات میں الگورتھم کا بھی انکشاف کیا جاتا ہے۔ تاہم، تبصرے کے بغیر یہ سمجھنا تھوڑا مشکل ہے، میں آپ کو اس الگورتھم کا تجزیہ کرنے کے لیے لے جاؤں گا، مجھے یقین ہے کہ اس مضمون کو پڑھنے کے بعد، آپ کو شارپ ریشو، زیادہ سے زیادہ کے تصورات اور کیلکولیشن منطق کو بہتر طور پر سمجھنا چاہیے۔ ڈرا ڈاؤن، اور ریٹ آف ہر ایک کو واضح سمجھ ہے۔
ہم براہ راست سورس کوڈ پر جاتے ہیں، جو جاوا اسکرپٹ میں لکھا جاتا ہے۔ FMZ کا بیک ٹیسٹنگ سسٹم خود بخود بیک ٹیسٹنگ کارکردگی کا ڈیٹا تیار کرنے کے لیے اس الگورتھم کا استعمال کرتا ہے۔
function returnAnalyze(totalAssets, profits, ts, te, period, yearDays)
https://www.fmz.com/api#%E5%9B%9E%E6%B5%8B%E7%B3%BB%E7%BB%9F%E5%A4%8F%E6%99%AE%E7%AE%97%E6%B3%95
چونکہ یہ ایک کمپیوٹیشنل فنکشن ہے، اس لیے اس میں ان پٹ اور آؤٹ پٹ ہونا چاہیے۔ آئیے پہلے فنکشن کے ان پٹ کو دیکھتے ہیں:
totalAssets, profits, ts, te, period, yearDays
totalAssets یہ پیرامیٹر ابتدائی کل اثاثہ ہے جب حکمت عملی چلنا شروع ہوتی ہے۔
profits
یہ پیرامیٹر نسبتاً اہم پیرامیٹر ہے کیونکہ کارکردگی کے اشارے کے حسابات کا ایک سلسلہ اس خام ڈیٹا پر مبنی ہے۔ یہ پیرامیٹر دو جہتی صف ہے، فارمیٹ اس طرح ہے:[[timestamp1, profit1], [timestamp2, profit2], [timestamp3, profit3], ....., [timestampN, profitN]]، ہم دیکھ سکتے ہیں کہ returnAnalyze فنکشن کے لیے ڈیٹا سٹرکچر کی ضرورت ہوتی ہے جو ہر لمحے واپسی کے تاریخی ترتیب کو ریکارڈ کرتا ہے۔ timestamp1 سے timestampN وقت میں دور سے قریب تک ترتیب میں ہیں۔ وقت میں ہر نقطہ پر منافع کی قیمت ہوتی ہے۔ لہذا، مثال کے طور پر، آمدنی کے ریکارڈ میں تیسری بار پوائنٹ ہے[ٹائم اسٹیمپ3، منافع3]۔ FMZ لائن پر بیک ٹیسٹنگ سسٹم میں، بیک ٹیسٹنگ سسٹم کے ذریعے اس فنکشن کو منافع کا ڈیٹا فراہم کیا جاتا ہے، یقیناً، اگر آپ اس طرح کے اری ڈھانچے کو بنانے کے لیے منافع کا ڈیٹا خود ریکارڈ کرتے ہیں، تو آپ اسے اس کیلکولیشن فنکشن کو بھی فراہم کر سکتے ہیں۔ نتیجہ کا حساب لگائیں.
ts بیک ٹیسٹ کا آغاز ٹائم اسٹیمپ۔
te بیک ٹیسٹ کا اختتامی ٹائم اسٹیمپ۔
period کمپیوٹیشن سائیکل ملی سیکنڈ میں۔
yearDays ایک سال میں تجارتی دن۔
اگلا، آئیے اس فنکشن کے آؤٹ پٹ پر ایک نظر ڈالتے ہیں:
return {
totalAssets: totalAssets,
yearDays: yearDays,
totalReturns: totalReturns,
annualizedReturns: annualizedReturns,
sharpeRatio: sharpeRatio,
volatility: volatility,
maxDrawdown: maxDrawdown,
maxDrawdownTime: maxDrawdownTime,
maxAssetsTime: maxAssetsTime,
maxDrawdownStartTime: maxDrawdownStartTime,
winningRate: winningRate
}

ان پٹ اور آؤٹ پٹ کو جان کر، اب ہم سمجھتے ہیں کہ یہ فنکشن کس کے لیے استعمال ہوتا ہے۔ سیدھے الفاظ میں، اس فنکشن کو کچھ خام ریکارڈ دیں، جیسے کہ آمدنی کے اعدادوشمار کی ایک صف۔ فنکشن آپ کے لیے بہترین کارکردگی دکھانے کے لیے ایک نتیجہ کا حساب لگائے گا۔
اگلا، آئیے دیکھتے ہیں کہ کوڈ کا حساب کیسے لگایا جاتا ہے:
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 ہے .
معیاری انحراف: تغیر کا مربع جڑ لیں، جو کہ معیاری انحراف ہے۔
اتار چڑھاؤ: جب حساب کا پیمانہ سالانہ ہوتا ہے تو اتار چڑھاؤ معیاری انحراف ہوتا ہے۔
ایک بار جب آپ ان تصورات اور حساب کے فارمولوں کو سمجھ لیں گے، تو فنکشن کا تیز حساب کا حصہ ایک نظر میں واضح ہو جائے گا۔ تیز تناسب کے حساب کتاب کا فارمولا: (سالانہ واپسی - خطرے سے پاک شرح) / معیاری انحراف
کیا آپ نے یہ سیکھا ہے؟