|
|
@@ -9,6 +9,7 @@ async function readData() {
|
|
|
return JSON.parse(data)
|
|
|
}
|
|
|
|
|
|
+let realCountMap = {}
|
|
|
function getRealDragonMap(kLinesMap, FIRST_FEW_DAYS, BUY_LIMIT_RATE) {
|
|
|
let realDragonMap = {}
|
|
|
for (let symbol in kLinesMap) {
|
|
|
@@ -26,12 +27,19 @@ function getRealDragonMap(kLinesMap, FIRST_FEW_DAYS, BUY_LIMIT_RATE) {
|
|
|
kLine.Rate = rate
|
|
|
kLine.Profit = rate - BUY_LIMIT_RATE
|
|
|
realDragonMap[symbol] = kLine
|
|
|
+
|
|
|
+ if (!realCountMap[symbol]) {
|
|
|
+ realCountMap[symbol] = 1
|
|
|
+ } else {
|
|
|
+ realCountMap[symbol] += 1
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return realDragonMap
|
|
|
}
|
|
|
|
|
|
+let fakeCountMap = {}
|
|
|
function getFakeDragonMap(kLinesMap, FIRST_FEW_DAYS, BUY_LIMIT_RATE) {
|
|
|
let fakeDragonMap = {}
|
|
|
for (let symbol in kLinesMap) {
|
|
|
@@ -50,6 +58,12 @@ function getFakeDragonMap(kLinesMap, FIRST_FEW_DAYS, BUY_LIMIT_RATE) {
|
|
|
kLine.MaxRate = maxRate
|
|
|
kLine.Profit = rate > 0 ? rate - BUY_LIMIT_RATE : -BUY_LIMIT_RATE
|
|
|
fakeDragonMap[symbol] = kLine
|
|
|
+
|
|
|
+ if (!fakeCountMap[symbol]) {
|
|
|
+ fakeCountMap[symbol] = 1
|
|
|
+ } else {
|
|
|
+ fakeCountMap[symbol] += 1
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -59,9 +73,9 @@ function getFakeDragonMap(kLinesMap, FIRST_FEW_DAYS, BUY_LIMIT_RATE) {
|
|
|
async function main() {
|
|
|
let kLinesMap = await readData()
|
|
|
|
|
|
- const FIRST_FEW_DAYS = 0 // 第几天的数据,0表示今天,1表示昨天,2表示前天,以此类推
|
|
|
- const BUY_LIMIT_RATE = 3 // 从什么比例入场
|
|
|
- const BAKE_TEST_DAYS = 30 // 一共回测多少天
|
|
|
+ const FIRST_FEW_DAYS = 1 // 第几天的数据,0表示今天,1表示昨天,2表示前天,以此类推
|
|
|
+ const BUY_LIMIT_RATE = 2.5 // 从什么比例入场
|
|
|
+ const BAKE_TEST_DAYS = 150 // 一共回测多少天
|
|
|
|
|
|
let totalProfit = 0
|
|
|
for (let i = FIRST_FEW_DAYS; i < BAKE_TEST_DAYS; i++) {
|
|
|
@@ -72,6 +86,8 @@ async function main() {
|
|
|
realDragonProfit += realDragonMap[symbol].Profit
|
|
|
// logger.info(realDragonMap[symbol].Symbol, realDragonMap[symbol].Profit, realDragonMap[symbol].Rate)
|
|
|
}
|
|
|
+ // logger.info("----------------真龙榜数据定量分析----------------")
|
|
|
+ // dragonAnalysis(realDragonMap)
|
|
|
// 假龙榜
|
|
|
let fakeDragonProfit = 0
|
|
|
let fakeDragonMap = getFakeDragonMap(kLinesMap, i, BUY_LIMIT_RATE)
|
|
|
@@ -79,6 +95,8 @@ async function main() {
|
|
|
fakeDragonProfit += fakeDragonMap[symbol].Profit
|
|
|
// logger.info(fakeDragonMap[symbol].Symbol, fakeDragonMap[symbol].Profit, fakeDragonMap[symbol].MaxRate, fakeDragonMap[symbol].Rate)
|
|
|
}
|
|
|
+ // logger.info("----------------假龙榜数据定量分析----------------")
|
|
|
+ // dragonAnalysis(fakeDragonMap, fakeCountMap)
|
|
|
|
|
|
realDragonProfit = NumKit.getSubFloat(realDragonProfit, 2)
|
|
|
fakeDragonProfit = NumKit.getSubFloat(fakeDragonProfit, 2)
|
|
|
@@ -92,10 +110,13 @@ async function main() {
|
|
|
let avgProfit = NumKit.getSubFloat(synProfit / (realLength + fakeLength), 2)
|
|
|
|
|
|
let index = kLinesMap['BTC_USDT'].length - (i + 1)
|
|
|
- let dateStr = TimeKit.getDateByMillisecond(kLinesMap['BTC_USDT'][index].Time)
|
|
|
+ let btcK = kLinesMap['BTC_USDT'][index]
|
|
|
+ let dateStr = TimeKit.getDateByMillisecond(btcK.Time)
|
|
|
+ let btcUpRate = NumKit.getSubFloat(100 * (btcK.Close - btcK.Open) / btcK.Open, 2)
|
|
|
+
|
|
|
logger.info(`${i}日(${dateStr}, ${realLength + fakeLength}只),真龙榜(${realLength}只)利润${realDragonProfit}%`
|
|
|
+ `,假龙榜(${fakeLength}只)利润${fakeDragonProfit}%`
|
|
|
- + `,真龙期望利润${expRealProfit}%,假龙期望利润${expFakeProfit}%,综合利润${synProfit}%,平均每只利润${avgProfit}%`
|
|
|
+ + `,真龙期望利润${expRealProfit}%,假龙期望利润${expFakeProfit}%,综合利润${synProfit}%,平均每只利润${avgProfit}%,BTC涨幅${btcUpRate}%`
|
|
|
)
|
|
|
|
|
|
totalProfit += avgProfit
|
|
|
@@ -104,6 +125,9 @@ async function main() {
|
|
|
|
|
|
let dayProfit = NumKit.getSubFloat(totalProfit / BAKE_TEST_DAYS, 2)
|
|
|
logger.info(`利润期望值总和:${totalProfit}%,平均日化${dayProfit}%。`)
|
|
|
+ for (let symbol in fakeCountMap) {
|
|
|
+ logger.info(`${symbol} 真${realCountMap[symbol]},假${fakeCountMap[symbol]}`)
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
main().catch((error) => {
|