1
2

More than 3 years have passed since last update.

QuantAnalyzerの画面を見てみよう!

Posted at

便利そうだけど結構よくわかんないのもある。
使いこなすために、書きながらお勉強。
まだ書きかけ。

実際のQuantAnalyzerのAnalyze - Overviewの画面と、

C:\QuantAnalyzer4\extend\Snippets\com\strategyquant\extend\OverviewTab\SQDefault.java
の中身とをVSCodeで見比べて推測していきます。

Javaの独自定義の関数とか変数とかさっくり推察

d2WithPlType(stats.getXXXXX(XXXXX), combination.getPLType())

表示形式(金額、pips、%)に合わせるためっぽい

d2WithPlType(stats.getXXXXX(XXXXX), SQConst.PL_IN_PCT)

表示形式を%に固定してるっぽい

d2(stats.getXXXXX(XXXXXXXXXX)

小数点以下第2位まで求めてるっぽい。

statsConst.XXXXX

これの中身を見れたらなぁ。どうやって算出された値かがわかれば、色々と組み合わせられそう。

左上の表示

image.png

TOTAL PROFIT(PROFIT IN MONEY):総損益(金額)
TOTAL PROFIT(PROFIT IN PIPS):総損益(pips)
YEARLY AVG PROFIT:年平均損益(金額)
YEARLY AVG % RETURN:年平均損益(%)
CAGR(Compound Avarage Growth Rate):年平均成長率

右上

image.png

1列目

# OF TRADES:取引回数

SQDefault.javaでは stats.getInt(StatsConst.NUMBER_OF_TRADES)

DRAWDOWN:最大ドローダウン金額

SQDefault.javaでは d2WithPlType(stats.getDouble(dd_key), combination.getPLType())

ANNUAL % / MAX DD %:

SQDefault.javaでは d2(stats.getDouble(StatsConst.AAR_DD_RATIO))

2列目

SHAREPE RATIO:シャープレシオ

SQDefault.javaでは d2(stats.getDouble(StatsConst.SHARPE_RATIO))
リスク(標準偏差)1単位当たりの超過リターン(リスクゼロでも得られるリターンを上回った超過収益)を測るもので、この数値が高いほどリスクを取ったことによって得られた超過リターンが高いこと(効率よく収益が得られたこと)を意味します。異なる投資対象を比較する際に、同じリスクならどちらのリターンが高いかを考えるときに役立ちます。
このシャープ・レシオは、リスク調整後のリターンを測るものとして、投資信託の運用実績の評価などにも利用されます。

% DRAWDOWN:最大ドローダウン金額(%)

SQDefault.javaでは d2WithPlType(stats.getDouble(StatsConst.PCT_DRAWDOWN), SQConst.PL_IN_PCT)

R EXPECTANCY:

SQDefault.javaでは d2WithPlType(stats.getDouble(StatsConst.R_EXPECTANCY), "R")
performance metrics developed by Van Tharp, it gives you the average profit value related to average risk (R) that you can expect from a system over many trades.
リスクに対して平均でどれくらい利益を得られるかってことらしい。シャープレシオとどう違うんだろ?

3列目

PROFIT FACTOR:プロフィットファクター

SQDefault.javaでは d2(stats.getDouble(StatsConst.PROFIT_FACTOR))
説明不要かな

DAILY AVG PROFIT:日平均損益

SQDefault.javaでは d2WithPlType(stats.getDouble(StatsConst.AVG_PROFIT_BY_DAY), combination.getPLType())
説明不要かな

R EXPECTANCY SCORE:

SQDefault.javaでは d2WithPlType(stats.getDouble(StatsConst.R_EXPECTANCY_SCORE), "R")
standard R-Expectancy doesn’t consider the length of testing period and number of trades produced. There is a difference when you make for example $2000 per year by making 10 trades, or by making 100 trades. R-Expectancy Score adds a score for trades frequency. It is computed as: R-Expectancy * averageTradesPerYear

4列目

RETURN / DD RATIO

SQDefault.javaでは d2(stats.getDouble(StatsConst.RETURN_DD_RATIO)

MONTHLY AVG PROFIT:月平均損益

SQDefault.javaでは d2WithPlType(stats.getDouble(StatsConst.AVG_PROFIT_BY_MONTH), combination.getPLType())

STR QUALITY NUMBER:

SQDefault.javaでは d2(stats.getDouble(StatsConst.SQN))

5列目

WINNING PERCENTAGE:勝率

SQDefault.javaでは d2(stats.getDouble(StatsConst.WINNING_PCT))
説明不要かな

AVERAGE TRADE:

SQDefault.javaでは d2WithPlType(stats.getDouble(StatsConst.AVG_TRADE), combination.getPLType())

SQN SCORE:

SQDefault.javaでは d2(stats.getDouble(StatsConst.SQN_SCORE))

Strategy

image.png

1列目

Wins / Losses Ratio:

SQDefault.javaでは d2(stats.getDouble(StatsConst.WIN_LOSS_RATIO))
勝率を比で表しただけ?

AHPR:

SQDefault.javaでは d2(stats.getDouble(StatsConst.AHPR))
このサイトを参考にすると、多分、損益/保有期間みたいな計算式。

Expectancy

SQDefault.javaでは d2(stats.getDouble(StatsConst.EXPECTANCY))

Stagnation in Days:最長ドローダウン期間(日数)

SQDefault.javaでは "" + stats.getInt(StatsConst.STAGNATION_PERIOD)
なんで空の文字列を足してるのかは謎。

2列目

Payout Ratio (Avg Win/Loss)

SQDefault.javaでは d2(stats.getDouble(StatsConst.PAYOUT_RATIO))

Z-Score

SQDefault.javaでは d2(stats.getDouble(StatsConst.Z_SCORE))

Deviation

SQDefault.javaでは d2WithPlType(stats.getDouble(StatsConst.STANDARD_DEV), combination.getPLType())
StatsConst.STANDARD_DEVとの記述があるし、標準偏差かな?

Stagnation in %:最長ドローダウン期間(%)

SQDefault.javaでは d2WithPlType(stats.getDouble(StatsConst.STAGNATION_PERIOD_PCT), SQConst.PL_IN_PCT)

3列目

Average # of Bars in Trade

SQDefault.javaでは d2(stats.getDouble(StatsConst.AVG_BARS_TRADE))

Z-Probability

SQDefault.javaでは d2(stats.getDouble(StatsConst.Z_PROBABILITY)) + " %"

Exposure

SQDefault.javaでは d2(stats.getDouble(StatsConst.EXPOSURE, 0)) + " %"
保有する金融資産のうち市場の価格変動リスクにさらされている資産の割合のこと。

Correlation Factor R16:相関係数R16

SQDefault.javaでは d2(Math.pow(stats.getDouble(StatsConst.STABILITY), 4))
自作計測値。「損益曲線」と「その最初と最後の取引を結んだ直線」とがどれだけ離れてるかの係数。数値が1に近づくほど安定していると言えます。
普通はr^2ですが、QuantAnalyzerではr^4を使っているみたいで、差がわかりやすいです。
私はもっとわかりやすくしたかったので、r^16としました。

Trades(ちょっといじってレイアウトだけ変えてます。)

説明いらなそうだし、後回し。
image.png

1列目

# of Wins:勝ち数

説明不要かと
SQDefault.javaでは "" + stats.getInt(StatsConst.NUMBER_OF_PROFITS)

Gross Profit:合計利益

説明不要かと
SQDefault.javaでは d2WithPlType(stats.getDouble(StatsConst.GROSS_PROFIT), combination.getPLType())

Largest Win:最大利益

説明不要かと
SQDefault.javaでは d2WithPlType(stats.getDouble(StatsConst.MAX_PROFIT), combination.getPLType())

Avg Consec Wins:平均連敗

説明不要かと
SQDefault.javaでは d2(stats.getDouble(StatsConst.AVG_CONSEC_WIN))

2列目

# of Losses:負け数

説明不要かと
SQDefault.javaでは "" + stats.getInt(StatsConst.NUMBER_OF_LOSSES)

Gross Loss:合計損失

説明不要かと
SQDefault.javaでは d2WithPlType(stats.getDouble(StatsConst.GROSS_LOSS), combination.getPLType())

Largest Loss:最大損失

説明不要かと
SQDefault.javaでは d2WithPlType(stats.getDouble(StatsConst.MAX_LOSS), combination.getPLType())

Avg Consec Loss:平均連敗

説明不要かと
SQDefault.javaでは d2(stats.getDouble(StatsConst.AVG_CONSEC_LOSS))

3列目

SQDefault.javaでは ""

Average Win:平均利益

説明不要かと
SQDefault.javaでは d2WithPlType(stats.getDouble(StatsConst.AVG_WIN), combination.getPLType())

Max Consec Wins:最大連勝

説明不要かと
SQDefault.javaでは "" + stats.getInt(StatsConst.MAX_CONSEC_WINS)

Avg # of Bars in Wins

取引開始から決済まで、何本バーをまたいでいるか、だと思います…。(正直良くわかりません)
SQDefault.javaでは d2(stats.getDouble(StatsConst.AVG_BARS_WIN))

4列目

# of Cancelled/Expired:キャンセル・期限切れの数

説明不要かと
SQDefault.javaでは "" + stats.getInt(StatsConst.NUMBER_OF_CANCELED)

Average Loss:平均損失

説明不要かと
SQDefault.javaでは d2WithPlType(stats.getDouble(StatsConst.AVG_LOSS), combination.getPLType())

Max Consec Losses:最大連敗

説明不要かと
SQDefault.javaでは "" + stats.getInt(StatsConst.MAX_CONSEC_LOSS)

Avg Bars in Losses

取引開始から決済まで、何本バーをまたいでいるか、だと思います…。(正直良くわかりません)
SQDefault.javaでは d2(stats.getDouble(StatsConst.AVG_BARS_LOSS))

ここにはないけど、EquityControlのタブで気になるやつ

同じフォルダにあるファイルの「GetValue」内の「return stats.getDouble(StatsConst.STABILITY, 0」を参考にしていくといろいろわかるかも。

QuantAnalyzer4\extend\Snippets\com\strategyquant\extend\DatabankColumns\Stability.java
@Override
public Object getValue(SQResultsGroup strategyResults, String dataType, String direction, String sampleType, String plType) throws Exception {
    SQResult result = strategyResults.getResult(SQConst.SYMBOL_PORTFOLIO);

    SQStats stats = result.getStats(direction, getGlobalPlType(plType), sampleType);
    if(stats==null) throw new StatsMissingException();

    return stats.getDouble(StatsConst.STABILITY, 0);
}

こんなコードで取れそう

Stability
stats.getDouble(StatsConst.STABILITY, 0)

先述しましたが、「損益曲線」と「最初と最後の取引の間に結んだ直線」の相関係数(r^4)です。

Symmetry
stats.getDouble(StatsConst.SYMMETRY)

よくわからん!

Fittness
strategyResults.getResult(SQConst.SYMBOL_PORTFOLIO)
.getStats(SQConst.DIRECTION_ALL, SQConst.PL_IN_MONEY, SQConst.KEY_SAMPLE_ALL)
.getDouble(StatsConst.FITNESS, 0)

よくわからん!

CalmarRatio
stats.getDouble("CalmarRatio", 12)

The Calmar ratio is a comparison of the average annual compounded rate of return and the maximum drawdown risk of commodity trading advisors and hedge funds. The lower the Calmar ratio, the worse the investment performed on a risk-adjusted basis over the specified time period; the higher the Calmar ratio, the better it performed. Generally speaking, the time period used is three years, but this can be higher or lower based on the investment in question.
リスク・リターン比みたいなこと書いてます。シャープレシオとどう違うんだろう?高いほどいいってのはわかりますね。基本は3年ベースで見るけど、まぁ短くても長くてもいいみたい。

にいろいろあるみたいなので見てみるのも面白いかもしれません。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2