細かい演算がうまくいかない
きのうは以下のコードで終了しましたが、まともな結果がでないなど色々いじっているうちに
public double calcReward(double action, Stock stock) { double reward = 0.0; AssetManager am = AssetManager.getInstance(); TimeManager tm = TimeManager.getInstance(); long lastTotal = am.getAssetHistory(tm.getLastBusinessDay()).getTotalAssetValue(); long todayTotal = am.getTotalAssetValue(); System.out.print("lastTotal:" + lastTotal + ", todayTotal:" + todayTotal); double x = todayTotal / lastTotal - 1; //reward = Math.tanh(lastTotal / todayTotal); reward = Math.tanh(x); System.out.println("報酬は:" + reward); return reward; }
午前中に下のコードに生まれ変わりました
public double calcReward(double action, Stock stock) { double reward = 0.0; AssetManager am = AssetManager.getInstance(); TimeManager tm = TimeManager.getInstance(); BigDecimal lastTotal = new BigDecimal(am.getAssetHistory(tm.getLastBusinessDay()).getTotalAssetValue()); BigDecimal todayTotal = new BigDecimal(am.getTotalAssetValue()); System.out.print("lastTotal:" + lastTotal + ", todayTotal:" + todayTotal); double x = todayTotal.divide(lastTotal, BigDecimal.ROUND_UP).doubleValue() - 1; //reward = Math.tanh(lastTotal / todayTotal); reward = Math.tanh(x); System.out.println("x:" + x + ",報酬は:" + reward); return reward; }
でもちゃんとした値が出ません。
bigdecimal.divide(x, BigDecimal.ROUND_UP)のところの丸め指定を変えてはみたものの、うまくいきません。lastTotalとtodayTotalの比がたいていの場合小さすぎるのが問題。longからdoubleにキャストするとおかしな値になるし...、どうしたもんだか。
おかしな値と思ってたがおかしくなかった。でも、値が小さすぎる。こんな小さな報酬で大丈夫だろうか。
チョイ訂正したコード
public double calcReward(double action, Stock stock) { double reward = 0.0; AssetManager am = AssetManager.getInstance(); TimeManager tm = TimeManager.getInstance(); BigDecimal lastTotal = new BigDecimal(am.getAssetHistory(tm.getLastBusinessDay()).getTotalAssetValue()); BigDecimal todayTotal = new BigDecimal(am.getTotalAssetValue()); System.out.print("lastTotal:" + lastTotal + ", todayTotal:" + todayTotal); BigDecimal bigx = todayTotal.divide(lastTotal, 8, RoundingMode.HALF_UP).subtract(BigDecimal.ONE); double x = bigx.doubleValue(); reward = Math.tanh(x); System.out.println(" bigx:" + bigx +" x:" + x + ",報酬は:" + reward); return reward; }