基于YOLO的蜡烛图买卖决策

在这篇文章中,我将指导你如何使用YOLO目标识别算法在Binance蜡烛图上实现一个交易模型,从而进行买卖决策

基于YOLO的蜡烛图买卖决策
一键发币: SUI | SOL | BNB | ETH | BASE | ARB | OP | POLYGON | AVAX | FTM | OK

金融预测一直是投资者和AI研究人员都非常感兴趣的研究领域。利用深度学习技术来分析图表提供了一种新的视角,使自主决策购买和出售金融资产成为可能。

在这篇文章中,我将指导你如何使用YOLO目标识别算法在Binance蜡烛图上实现一个交易模型,从而进行买卖决策。我们将从获取蜡烛图数据到预处理、训练模型,再到最终使用C#做出决策,整个过程都会详细讲解。

让我们开始吧!

1、概述

在这个项目中,我们将实现一个基于YOLO(You Only Look Once)目标识别算法的交易决策模型,该模型可以检测蜡烛图上的“买入”和“卖出”模式。这个模型可以通过视觉蜡烛图自主建议何时买入或卖出资产,而不是依赖时间序列分析。

以下是涉及的关键步骤:

  1. 从Binance获取蜡烛图数据。
  2. 将数据可视化为图表形式。
  3. 预处理数据以供YOLO模型推理。
  4. 在数据上运行YOLO推理。
  5. 分析结果以做出“买入”或“卖出”的决定。

2、获取Binance蜡烛图数据

我们首先从Binance获取历史数据。下面是改进后的原始代码版本,它包括输入验证、适当的错误处理和数据解析。

获取Binance数据的代码

using System;  
using System.Net.Http;  
using System.Threading.Tasks;  
using Newtonsoft.Json.Linq;  

class BinanceDataFetcher  
{  
    private static readonly HttpClient client = new HttpClient();  

    public static async Task<JArray> GetKlines(string symbol, string interval, int limit)  
    {  
        if (string.IsNullOrEmpty(symbol) || string.IsNullOrEmpty(interval) || limit <= 0)  
        {  
            throw new ArgumentException("提供的参数无效,请检查符号、间隔和限制值。");  
        }  

        string url = $"https://api.binance.com/api/v3/klines?symbol={symbol.ToUpper()}&interval={interval}&limit={limit}";  

        try  
        {  
            var response = await client.GetStringAsync(url);  
            return JArray.Parse(response);  
        }  
        catch (HttpRequestException e)  
        {  
            Console.WriteLine($"从Binance获取数据时出错:{e.Message}");  
            throw;  
        }  
    }  
}

解释:这段代码从Binance获取蜡烛图数据,并将其作为JSON数组返回。它还包括适当的输入验证、错误处理(使用try-catch),并在必要时抛出异常,使代码更加健壮。

3、使用ScottPlot生成蜡烛图

我们使用ScottPlot将Binance蜡烛图数据可视化为图表。这种可视化有助于我们更清楚地理解模式。

生成蜡烛图的代码

using ScottPlot;  
using System.Linq;  
using Newtonsoft.Json.Linq;  

// 获取数据  
var klines = await BinanceDataFetcher.GetKlines("BTCUSDT", "1d", 100);  

// 提取OHLC数据(索引:1=开盘价,2=最高价,3=最低价,4=收盘价)  
double[] opens = klines.Select(k => k[1].Value<double>()).ToArray();  
double[] highs = klines.Select(k => k[2].Value<double>()).ToArray();  
double[] lows = klines.Select(k => k[3].Value<double>()).ToArray();  
double[] closes = klines.Select(k => k[4].Value<double>()).ToArray();  
double[] xs = DataGen.Consecutive(opens.Length);  

// 创建新图表  
var plt = new Plot(800, 600);  

// 添加蜡烛图  
plt.AddCandlesticks(xs, opens, highs, lows, closes);  

// 将图表保存为图像  
plt.SaveFig("btc_usdt_candlestick.png");

解释:我们从Binance数据中提取开盘价、最高价、最低价和收盘价(OHLC),并使用ScottPlot生成蜡烛图。提取的数据被绘制并保存为图像,以便进一步处理。

4、为YOLO预处理图像

下一步是预处理蜡烛图图像,使其能够被YOLO模型用于推理。

图像预处理代码

Tensor<float> PreprocessImage(Image<Rgb24> image)  
{  
    const int targetWidth = 640;  
    const int targetHeight = 640;  

    // 调整图像大小  
    image.Mutate(x => x.Resize(new ResizeOptions  
    {  
        Size = new Size(targetWidth, targetHeight),  
        Mode = ResizeMode.Stretch  
    }));  

    var input = new DenseTensor<float>(new[] { 1, 3, targetHeight, targetWidth });  
    var mean = new[] { 0.485f, 0.456f, 0.406f };  
    var std = new[] { 0.229f, 0.224f, 0.225f };  

    image.ProcessPixelRows(accessor =>  
    {  
        for (int y = 0; y < targetHeight; y++)  
        {  
            var pixelSpan = accessor.GetRowSpan(y);  
            for (int x = 0; x < targetWidth; x++)  
            {  
                input[0, 0, y, x] = (pixelSpan[x].R / 255f - mean[0]) / std[0];  
                input[0, 1, y, x] = (pixelSpan[x].G / 255f - mean[1]) / std[1];  
                input[0, 2, y, x] = (pixelSpan[x].B / 255f - mean[2]) / std[2];  
            }  
        }  
    });  

    return input;  
}

解释:图像被调整为所需的尺寸,并用均值和标准差进行归一化处理。这种预处理确保了数据符合YOLO的输入要求。

5、使用ONNX Runtime进行YOLO推理

我们使用ONNX Runtime在预处理的蜡烛图图像上运行YOLO推理。

YOLO推理代码

using System;  
using Microsoft.ML.OnnxRuntime;  
using Microsoft.ML.OnnxRuntime.Tensors;  

// 初始化推理会话  
using var session = new InferenceSession("best.onnx");  

// 运行推理  
var inputTensor = PreprocessImage(image);  
var inputs = new List<NamedOnnxValue> { NamedOnnxValue.CreateFromTensor("input", inputTensor) };  
using IDisposableReadOnlyCollection<DisposableNamedOnnxValue> results = session.Run(inputs);

解释:推理会话使用YOLO模型(best.onnx)初始化。我们使用预处理的图像运行推理并收集结果。using语句确保资源的正确释放。

6、解析YOLO输出

最后一步是从YOLO模型的输出中解析“买入”或“卖出”信号。

后处理代码

List<Detection> PostprocessOutput(IDisposableReadOnlyCollection<DisposableNamedOnnxValue> results)  
{  
    if (results == null || !results.Any())  
    {  
        throw new ArgumentException("来自模型推理的结果无效。");  
    }  

    try  
    {  
        // 提取输出张量  
        var output = results.First().AsEnumerable<float>().ToArray();  

        // 解析检测结果  
        var detections = ParseDetections(output);  

        // 应用非极大值抑制(NMS)  
        var finalDetections = ApplyNms(detections, 0.5f, 0.45f);  

        return finalDetections;  
    }  
    finally  
    {  
        // 释放结果  
        foreach (var result in results)  
        {  
            result.Dispose();  
        }  
    }  
}

解释:此代码解析YOLO模型的输出,提取潜在的“买入”和“卖出”信号,并应用非极大值抑制(NMS)以去除冗余检测。适当的资源释放确保没有内存泄漏。

7、结束语

我们已经成功实现了一个模型,该模型利用YOLO算法根据蜡烛图分析预测“买入”和“卖出”信号。我们使用Binance获取数据,使用ScottPlot进行可视化,并使用ONNX Runtime运行YOLO模型的推理。

这个模型可以扩展和优化,以支持更全面的交易策略,例如结合其他技术指标或将实时分析集成。通过深度学习技术,我们可以创建更直观、视觉化和有效的交易决策工具。


原文链接:Implementing YOLO-Based Buy-Sell Decision Model on Binance Candlestick Charts with C#

DefiPlot翻译整理,转载请标明出处

免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。
通过 NowPayments 打赏