ストラテジー レポート

概要

StockSharp は、ストラテジーの取引結果に対するレポート生成システムを提供します。このシステムは 2 つの主要コンポーネントで構成されています。

  • IReportSource -- レポートのデータ ソース (ストラテジー パラメーター、注文、約定、ポジション、統計) を記述するインターフェイス。
  • IReportGenerator -- さまざまな形式 (CSV、JSON、XML、Excel) をサポートするレポート ジェネレーター インターフェイス。

Strategy クラスは IReportSource インターフェイスを実装しているため、ストラテジーをレポート ジェネレーターへ直接渡すことができます。

IReportSource インターフェイス

IReportSource インターフェイスは、レポート生成に必要なすべてのデータを提供します。

プロパティ 説明
Name string ストラテジー名
TotalWorkingTime TimeSpan 総稼働時間
Commission decimal? 総手数料
Position decimal 現在のポジション
PnL decimal 総損益
Slippage decimal? 総スリッページ
Latency TimeSpan? 総レイテンシ
Parameters IEnumerable<(string, object)> ストラテジー パラメーター
StatisticParameters IEnumerable<(string, object)> 統計パラメーター
Orders IEnumerable<ReportOrder> 注文
OwnTrades IEnumerable<ReportTrade> 自己約定
Positions IEnumerable<ReportPosition> ポジションのラウンドトリップ

データを読み取る前に、ソースの内部状態を同期するために Prepare() メソッドが呼び出されます。

ReportSource クラス

ReportSource は、Strategy クラスに結び付かない IReportSource の独立した実装です。レポート用のデータ ソースを手動で構築できます。

var source = new ReportSource();
source.Name = "自分の戦略";
source.PnL = 15000m;
source.TotalWorkingTime = TimeSpan.FromHours(8);

source.AddParameter("Timeframe", "5 minutes");
source.AddStatisticParameter("Sharpe Ratio", 1.85);

source.AddOrder(new ReportOrder(
    Id: 123,
    TransactionId: 456,
    SecurityId: securityId,
    Side: Sides.Buy,
    Time: DateTime.UtcNow,
    Price: 100m,
    State: OrderStates.Done,
    Balance: 0,
    Volume: 10,
    Type: OrderTypes.Limit
));

データ集計

注文や約定の数が多い場合、ReportSource はレポート サイズを小さくするためにデータを自動的に集計します。

// 自動集計しきい値 (既定値は 10000)
source.MaxOrdersBeforeAggregation = 5000;
source.MaxTradesBeforeAggregation = 5000;

// グループ化間隔 (既定値は 1 時間)
source.AggregationInterval = TimeSpan.FromMinutes(30);

// 手動集計
source.AggregateOrders(TimeSpan.FromHours(1));
source.AggregateTrades(TimeSpan.FromHours(1));

集計時には、注文と約定は時間間隔、銘柄、方向でグループ化されます。数量は合計され、価格は加重平均として計算されます。

PositionLifecycleTracker

PositionLifecycleTracker はポジションのライフサイクルを追跡し、ラウンドトリップ、つまりポジションの開始と終了の記録を生成します。

ラウンドトリップは次の場合に記録されます。

  • ポジションが完全にクローズされた (値がゼロになる)
  • ポジション反転が発生した (符号が変わる)

Strategy クラスでは、トラッカーは自動的に統合されます。完了したラウンドトリップは、RoundTripClosed イベントを通じて ReportSource に追加されます。

var tracker = new PositionLifecycleTracker();

// ラウンドトリップ クローズ時のイベント
tracker.RoundTripClosed += roundTrip =>
{
    Console.WriteLine($"ポジション終了: {roundTrip.SecurityId}, " +
        $"開始: {roundTrip.OpenTime} 価格 {roundTrip.OpenPrice}, " +
        $"終了: {roundTrip.CloseTime} 価格 {roundTrip.ClosePrice}, " +
        $"最大数量: {roundTrip.MaxPosition}");
};

// ポジション更新を処理する
tracker.ProcessPosition(position);

// ラウンドトリップ履歴へアクセスする
IReadOnlyList<ReportPosition> history = tracker.History;

レポート ジェネレーター

次のジェネレーターを利用できます。

ジェネレーター 形式 説明
CsvReportGenerator CSV 区切り文字付きのテキスト形式
JsonReportGenerator JSON 構造化 JSON
XmlReportGenerator XML XML 形式
ExcelReportGenerator Excel Excel 形式 (IExcelWorkerProvider が必要)

すべてのジェネレーターは BaseReportGenerator から継承され、含めるセクションの設定をサポートします。

var generator = new CsvReportGenerator();

// レポート セクションを設定する
generator.IncludeOrders = true;
generator.IncludeTrades = true;
generator.IncludePositions = true;
generator.Encoding = Encoding.UTF8;

ストラテジーからレポートを生成する

StrategyIReportSource を実装しているため、レポートを直接生成できます。

// ストラテジー自体がデータ ソース
var generator = new JsonReportGenerator();

using var stream = File.Create("report.json");
await generator.Generate(strategy, stream, CancellationToken.None);

別のデータ ソースを使う場合:

var source = new ReportSource();
source.Name = strategy.Name;
source.PnL = strategy.PnL;
source.TotalWorkingTime = strategy.TotalWorkingTime;

// トラッカーからポジションを追加する
source.AddPositions(tracker.History);

var generator = new CsvReportGenerator();
using var stream = File.Create("report.csv");
await generator.Generate(source, stream, CancellationToken.None);

例: 停止時にレポートを生成するストラテジー

public class ReportingStrategy : Strategy
{
    private readonly StrategyParam<DataType> _candleType;

    public DataType CandleType
    {
        get => _candleType.Value;
        set => _candleType.Value = value;
    }

    public ReportingStrategy()
    {
        _candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame());
    }

    protected override void OnStarted2(DateTime time)
    {
        base.OnStarted2(time);

        var subscription = SubscribeCandles(CandleType);

        subscription
            .Bind(ProcessCandle)
            .Start();
    }

    private void ProcessCandle(ICandleMessage candle)
    {
        if (!IsFormedAndOnlineAndAllowTrading())
            return;

        // 取引ロジック...
    }

    protected override void OnStopped()
    {
        // ストラテジー停止時にレポートを生成する
        var generator = new CsvReportGenerator();

        using var stream = File.Create($"report_{Name}_{DateTime.Now:yyyyMMdd_HHmmss}.csv");
        generator.Generate(this, stream, CancellationToken.None).AsTask().Wait();

        base.OnStopped();
    }
}

この例では、ストラテジーは停止時に CSV レポートを自動的に作成します。レポートには、ストラテジー パラメーター、統計、注文、約定、ポジションのラウンドトリップが含まれます。