十面埋伏分析.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. const logger = require("./utils/logger");
  2. const NumKit = require('./utils/num-kit')
  3. const fs = require('fs').promises;
  4. async function readData() {
  5. let data = await fs.readFile('./data/k_lines.json', 'utf8')
  6. return JSON.parse(data)
  7. }
  8. function getRealDragonMap(kLinesMap, FIRST_FEW_DAYS, BUY_LIMIT_RATE) {
  9. let realDragonMap = {}
  10. for (let symbol in kLinesMap) {
  11. let kLines = kLinesMap[symbol]
  12. let index = kLines.length - (FIRST_FEW_DAYS + 1)
  13. let kLine = kLines[index]
  14. let prevKline = kLines[index - 1]
  15. // 开盘第一天不计算
  16. if (!kLine || !prevKline) continue
  17. let rate = 100 * (kLine.Close - kLine.Open) / kLine.Open
  18. if (rate > BUY_LIMIT_RATE) {
  19. kLine.Rate = rate
  20. kLine.Profit = rate - BUY_LIMIT_RATE
  21. realDragonMap[symbol] = kLine
  22. }
  23. }
  24. return realDragonMap
  25. }
  26. function getFakeDragonMap(kLinesMap, FIRST_FEW_DAYS, BUY_LIMIT_RATE) {
  27. let fakeDragonMap = {}
  28. for (let symbol in kLinesMap) {
  29. let kLines = kLinesMap[symbol]
  30. let index = kLines.length - (FIRST_FEW_DAYS + 1)
  31. let kLine = kLines[index]
  32. let prevKline = kLines[index - 1]
  33. // 开盘第一天不计算
  34. if (!kLine || (!prevKline)) continue
  35. let rate = 100 * (kLine.Close - kLine.Open) / kLine.Open
  36. let maxRate = 100 * (kLine.High - kLine.Open) / kLine.Open
  37. if (maxRate > BUY_LIMIT_RATE && rate < BUY_LIMIT_RATE) {
  38. kLine.Rate = rate
  39. kLine.MaxRate = maxRate
  40. kLine.Profit = rate > 0 ? rate - BUY_LIMIT_RATE : -BUY_LIMIT_RATE
  41. fakeDragonMap[symbol] = kLine
  42. }
  43. }
  44. return fakeDragonMap
  45. }
  46. async function main() {
  47. let kLinesMap = await readData()
  48. const FIRST_FEW_DAYS = 0 // 第几天的数据,0表示今天,1表示昨天,2表示前天,以此类推
  49. const BUY_LIMIT_RATE = 5 // 从什么比例入场
  50. let totalProfit = 0
  51. for (let i = FIRST_FEW_DAYS; i <= kLinesMap['BTC_USDT'].length - 2; i++) {
  52. // 真龙榜
  53. let realDragonProfit = 0
  54. let realDragonMap = getRealDragonMap(kLinesMap, i, BUY_LIMIT_RATE)
  55. for (let symbol in realDragonMap) {
  56. realDragonProfit += realDragonMap[symbol].Profit
  57. // logger.info(realDragonMap[symbol].Symbol, realDragonMap[symbol].Profit, realDragonMap[symbol].Rate)
  58. }
  59. // 假龙榜
  60. let fakeDragonProfit = 0
  61. let fakeDragonMap = getFakeDragonMap(kLinesMap, i, BUY_LIMIT_RATE)
  62. for (let symbol in fakeDragonMap) {
  63. fakeDragonProfit += fakeDragonMap[symbol].Profit
  64. // logger.info(fakeDragonMap[symbol].Symbol, fakeDragonMap[symbol].Profit, fakeDragonMap[symbol].MaxRate, fakeDragonMap[symbol].Rate)
  65. }
  66. realDragonProfit = NumKit.getSubFloat(realDragonProfit, 2)
  67. fakeDragonProfit = NumKit.getSubFloat(fakeDragonProfit, 2)
  68. let realLength = Object.keys(realDragonMap).length
  69. let fakeLength = Object.keys(fakeDragonMap).length
  70. let realRate = NumKit.getSubFloat(realLength / (realLength + fakeLength), 2)
  71. let fakeRate = NumKit.getSubFloat(1 - realRate, 2)
  72. let expRealProfit = NumKit.getSubFloat(realRate * realDragonProfit, 2)
  73. let expFakeProfit = NumKit.getSubFloat(fakeRate * fakeDragonProfit, 2)
  74. let synProfit = NumKit.getSubFloat(expFakeProfit + expRealProfit, 2)
  75. logger.info(`${i}日,真龙榜(${realLength}只)利润${realDragonProfit}%`
  76. + `,假龙榜(${fakeLength}只)利润${fakeDragonProfit}%`
  77. + `,真龙期望利润${expRealProfit}%,假龙期望利润${expFakeProfit}%,综合利润${synProfit}%`
  78. )
  79. totalProfit += synProfit
  80. totalProfit = NumKit.getSubFloat(totalProfit, 2)
  81. }
  82. logger.info(`利润期望值总和:${totalProfit}%。`)
  83. }
  84. main().catch((error) => {
  85. logger.error(error.stack);
  86. process.exitCode = 1;
  87. })