Skip to content

Commit

Permalink
ソルティノレシオの追加、その他リファクタリング
Browse files Browse the repository at this point in the history
  • Loading branch information
T.K committed Feb 6, 2024
1 parent 0add38a commit 2cbbcc2
Show file tree
Hide file tree
Showing 22 changed files with 1,233 additions and 529 deletions.
53 changes: 27 additions & 26 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"net/http"
"time"
chart "v1/pkg/charts"
data "v1/pkg/data/utils"
// "v1/pkg/analytics/metrics"
// "v1/pkg/db/models"
// p "v1/pkg/management/position"
Expand Down Expand Up @@ -147,32 +148,32 @@ func main() {
// query.GetCloseData("BTCUSDT", "4h")

//DBにデータを追加するための関数
// var assets_names []string = []string{"RUNEUSDT", "BTCUSDT", "AAVEUSDT", "ORDIUSDT", "SANUSDT", "LTCUSDT", "OKBUSDT", "ASTRUSDT", "MNTUSDT", "FTMUSDT", "SNXUSDT", "DYDXUSDT", "BONKUSDT", "LUNAUSDT", "MAGICUSDT", "XLMUSDT", "DOGEUSDT", "TRSUSDT", "LINKUSDT", "TONUSDT", "ISPUSDT", "BONKUSDT", "GMXUSDT", "INJUSDT", "ETHUSDT", "SOLUSDT", "AVAXUSDT", "MATICUSDT", "ATOMUSDT", "UNIUSDT", "ARBUSDT", "OPUSDT", "PEPEUSDT", "SEIUSDT", "SUIUSDT", "TIAUSDT", "WLDUSDT", "XRPUSDT", "NEARUSDT", "DOTUSDT", "APTUSDT", "XMRUSDT", "LDOUSDT", "FILUSDT", "KASUSDT", "STXUSDT", "RNDRUSDT", "GRTUSDT"}

// var durations []string = []string{"1m", "3m", "5m", "15m", "30m", "1h", "2h", "4h", "6h", "8h", "12h"}
// paths := data.GetRelativePaths()

// groupedPaths := data.GroupAssetNamePaths(paths)

// asset_data, err := data.LoadOHLCV(groupedPaths, assets_names, durations)
// if err != nil {
// log.Fatalf("Error loading OHLCV data: %v", err)
// }

// // // data.SaveAssetDatasCSV(asset_data)

// // DBに接続する関数を呼び出し
// db, err := data.ConnectDB("./db/kline.db")
// if err != nil {
// log.Fatal(err)
// }
// // DBをクローズするのを遅延実行
// defer db.Close()
// // データをDBに保存する関数を呼び出し
// err = data.SaveAssetDatasDB(db, asset_data)
// if err != nil {
// log.Fatal(err)
// }
var assets_names []string = []string{"RUNEUSDT", "BTCUSDT", "AAVEUSDT", "ORDIUSDT", "SANUSDT", "LTCUSDT", "OKBUSDT", "ASTRUSDT", "MNTUSDT", "FTMUSDT", "SNXUSDT", "DYDXUSDT", "BONKUSDT", "LUNAUSDT", "MAGICUSDT", "XLMUSDT", "DOGEUSDT", "TRSUSDT", "LINKUSDT", "TONUSDT", "ISPUSDT", "BONKUSDT", "GMXUSDT", "INJUSDT", "ETHUSDT", "SOLUSDT", "AVAXUSDT", "MATICUSDT", "ATOMUSDT", "UNIUSDT", "ARBUSDT", "OPUSDT", "PEPEUSDT", "SEIUSDT", "SUIUSDT", "TIAUSDT", "WLDUSDT", "XRPUSDT", "NEARUSDT", "DOTUSDT", "APTUSDT", "XMRUSDT", "LDOUSDT", "FILUSDT", "KASUSDT", "STXUSDT", "RNDRUSDT", "GRTUSDT"}

var durations []string = []string{"1m", "3m", "5m", "15m", "30m", "1h", "2h", "4h", "6h", "8h", "12h"}
paths := data.GetRelativePaths()

groupedPaths := data.GroupAssetNamePaths(paths)

asset_data, err := data.LoadOHLCV(groupedPaths, assets_names, durations)
if err != nil {
log.Fatalf("Error loading OHLCV data: %v", err)
}

// // data.SaveAssetDatasCSV(asset_data)

// DBに接続する関数を呼び出し
db, err := data.ConnectDB("./db/kline.db")
if err != nil {
log.Fatal(err)
}
// DBをクローズするのを遅延実行
defer db.Close()
// データをDBに保存する関数を呼び出し
err = data.SaveAssetDatasDB(db, asset_data)
if err != nil {
log.Fatal(err)
}
//ここまで

// for key, paths := range groupedPaths {
Expand Down
8 changes: 4 additions & 4 deletions config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@


#バックテストの基本設定 startとendの月は必ず二桁になるように。
assetName: "SOLUSDT"
duration: "15m"
start: "2021-04"
end: "2022-011"
assetName: "BTCUSDT"
duration: "5m"
start: "20220101"
end: "20220109"
16 changes: 13 additions & 3 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,20 @@ func main() {

start := time.Now()

strategey.RunEmaOptimize()
// strategey.RunBacktestDonchainChoppy()
// strategey.RunBacktestSuperTrend()
// strategey.RunEmaOptimize()
// strategey.RunSTOptimize()
// strategey.RunDonchainOptimize()

// strategey.DonchainBacktest()
// strategey.SuperTrendBacktest()
// strategey.EmaBacktest()
// strategey.RunBacktestST()
// strategey.RunRsi2Optimize()

strategey.RunBacktestMacd()

// strategey.RunBacktestMacd()
// strategey.EmaBacktest()
// assetName := "TIAUSDT"
// duration := "4h"

Expand Down
52 changes: 52 additions & 0 deletions pkg/analytics/calc_total_trade.go
Original file line number Diff line number Diff line change
Expand Up @@ -196,3 +196,55 @@ func AverageLosingHoldingBars(s *execute.SignalEvents) float64 {
}
return float64(totalBars) / float64(losingTrades)
}

func MaxWinCount(s *execute.SignalEvents) int {
if s == nil {
return 0
}
var maxWinStreak, winStreak int
var buyPrice float64

for _, signal := range s.Signals {
if signal.Side == "BUY" {
buyPrice = signal.Price
} else if signal.Side == "SELL" && buyPrice != 0 {
if signal.Price > buyPrice {
winStreak++
if winStreak > maxWinStreak {
maxWinStreak = winStreak
}
} else {
winStreak = 0
}
buyPrice = 0 // Reset buy price after a sell
}
}

return maxWinStreak
}

func MaxLoseCount(s *execute.SignalEvents) int {
if s == nil {
return 0
}
var maxLoseStreak, loseStreak int
var buyPrice float64

for _, signal := range s.Signals {
if signal.Side == "BUY" {
buyPrice = signal.Price
} else if signal.Side == "SELL" && buyPrice != 0 {
if signal.Price < buyPrice {
loseStreak++
if loseStreak > maxLoseStreak {
maxLoseStreak = loseStreak
}
} else {
loseStreak = 0
}
buyPrice = 0 // Reset buy price after a sell
}
}

return maxLoseStreak
}
35 changes: 35 additions & 0 deletions pkg/analytics/sharp_ratio.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,38 @@ func SharpeRatio(s *execute.SignalEvents, riskFreeRate float64) float64 {

return sharpeRatio
}

func downsideDeviation(data []float64, target float64) float64 {
var sqDiffSum float64
for _, value := range data {
diff := math.Min(value-target, 0) // Only consider negative deviations
sqDiffSum += diff * diff
}
variance := sqDiffSum / float64(len(data))
return math.Sqrt(variance)
}

// Modified function to calculate the Sortino Ratio
func SortinoRatio(s *execute.SignalEvents, riskFreeRate float64) float64 {

if s == nil {
return 0.0
}
// Calculate the returns
returns := calculateReturns(s)

// Calculate the excess returns
excessReturns := make([]float64, len(returns))
for i, ret := range returns {
excessReturns[i] = ret - riskFreeRate
}

// Calculate the mean and downside deviation of the excess returns
meanExcessReturn := mean(excessReturns)
downsideDeviationExcessReturn := downsideDeviation(excessReturns, 0)

// Calculate the Sortino Ratio
sortinoRatio := meanExcessReturn / downsideDeviationExcessReturn

return sortinoRatio
}
2 changes: 1 addition & 1 deletion pkg/charts/candle_chart.go
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,7 @@ func klineWithChoppy() *charts.Kline {
lowdata[i] = k.data[2]
closedata[i] = k.data[1]
}
index := risk.ChoppySlice(closedata, highdata, lowdata)
index := risk.ChoppySlice(70, closedata, highdata, lowdata)
choppyEma13 := risk.ChoppyEma(index, 13)

choppyIndex := make([]opts.LineData, len(index))
Expand Down
10 changes: 5 additions & 5 deletions pkg/management/risk/market_index.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,27 +22,27 @@ func ChoppyMarketIndex(close []float64, high []float64, low []float64) float64 {
return index
}

func ChoppySlice(close []float64, high []float64, low []float64) []float64 {
func ChoppySlice(d int, close []float64, high []float64, low []float64) []float64 {

if len(close) < 30 || len(high) < 30 || len(low) < 30 {
if len(close) < d || len(high) < d || len(low) < d {
return nil
}

var choppySlice []float64

for i := 1; i < len(close); i++ {

if i < 30 {
if i < d {
continue
}

// iが30以上のときだけChoppyIndexの計算を行う

// 現在の終値と30日前の終値の差の絶対値を計算する
direction := math.Abs(close[i] - close[i-30])
direction := math.Abs(close[i] - close[i-d])

// 過去30日間の最高値と最安値の差を計算する
volatility := Max(high[len(high)-30:]) - Min(low[len(low)-30:])
volatility := Max(high[len(high)-d:]) - Min(low[len(low)-d:])

// 市場の方向性とボラティリティのバランスを計算する
choppySlice = append(choppySlice, direction/volatility*100.0)
Expand Down
34 changes: 6 additions & 28 deletions pkg/strategey/bb.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,15 @@ package strategey

import (
"fmt"
"log"
"runtime"
"sync"
"v1/pkg/analytics"
"v1/pkg/config"
"v1/pkg/execute"
"v1/pkg/trader"

"github.com/markcheno/go-talib"
)

func getStrageyNameBb() string {
return "BB"
}

func (df *DataFrameCandle) BbStrategy(n int, k float64, account *trader.Account) *execute.SignalEvents {

var StrategyName = "BB"
Expand Down Expand Up @@ -57,9 +51,9 @@ func (df *DataFrameCandle) OptimizeBbGoroutin() (performance float64, bestN int,
bestN = 20
bestK = 2.0

a := trader.NewAccount(1000)
// a := trader.NewAccount(1000)

marketDefault, _ := BuyAndHoldingStrategy(a)
// marketDefault, _ := BuyAndHoldingStrategy(a)
var mu sync.Mutex
var wg sync.WaitGroup

Expand All @@ -80,9 +74,9 @@ func (df *DataFrameCandle) OptimizeBbGoroutin() (performance float64, bestN int,
return
}

if analytics.NetProfit(signalEvents) < marketDefault {
return
}
// if analytics.NetProfit(signalEvents) < marketDefault {
// return
// }

// if analytics.WinRate(signalEvents) < 0.50 {
// return
Expand Down Expand Up @@ -114,23 +108,7 @@ func (df *DataFrameCandle) OptimizeBbGoroutin() (performance float64, bestN int,
}
func RunBacktestBb() {

var err error

// account := trader.NewAccount(1000)
btcfg, err := config.Yaml()
if err != nil {
log.Fatalf("error: %v", err)
}

fmt.Println(btcfg.AssetName)

assetName := btcfg.AssetName
duration := btcfg.Dration
// limit := btcfg.Limit

account := trader.NewAccount(1000)

df, _ := GetCandleData(assetName, duration)
df, account, _ := RadyBacktest()

performance, bestN, bestK := df.OptimizeBbGoroutin()

Expand Down
4 changes: 2 additions & 2 deletions pkg/strategey/donchain.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import (
// return "DBO"
// }

func (df *DataFrameCandleCsv) DonchainStrategy(period int, account *trader.Account) *execute.SignalEvents {
func (df *DataFrameCandle) DonchainStrategy(period int, account *trader.Account) *execute.SignalEvents {
var StrategyName = "DBO"

lenCandles := len(df.Candles)
Expand Down Expand Up @@ -63,7 +63,7 @@ func (df *DataFrameCandleCsv) DonchainStrategy(period int, account *trader.Accou
return signalEvents

}
func (df *DataFrameCandleCsv) OptimizeDonchainGoroutin() (performance float64, bestPeriod int) {
func (df *DataFrameCandle) OptimizeDonchainGoroutin() (performance float64, bestPeriod int) {

bestPeriod = 40
var mu sync.Mutex
Expand Down
Loading

0 comments on commit 2cbbcc2

Please sign in to comment.