mirror of
https://github.com/microsoft/qlib.git
synced 2026-07-10 22:36:55 +08:00
38 lines
1.2 KiB
Python
38 lines
1.2 KiB
Python
import numpy as np
|
|
from .base import Instant_Reward
|
|
|
|
|
|
class VP_Penalty_small(Instant_Reward):
|
|
"""Reward: (Abs(vv_ratio_t - 1) * 10000 - v_t^2 * penalty) / 100"""
|
|
|
|
def __init__(self, config):
|
|
self.penalty = config["penalty"]
|
|
|
|
def get_reward(self, performance_raise, v_t, target, *args):
|
|
"""
|
|
|
|
:param performance_raise: Abs(vv_ratio_t - 1) * 10000.
|
|
:param target: Target volume
|
|
:param v_t: The traded volume
|
|
"""
|
|
assert target > 0
|
|
reward = performance_raise * v_t / target
|
|
reward -= self.penalty * (v_t / target) ** 2
|
|
assert not (np.isnan(reward) or np.isinf(reward)), f"{performance_raise}, {v_t}, {target}"
|
|
return reward / 100
|
|
|
|
|
|
class VP_Penalty_small_vec(VP_Penalty_small):
|
|
def get_reward(self, performance_raise, v_t, target, *args):
|
|
"""
|
|
|
|
:param performance_raise: Abs(vv_ratio_t - 1) * 10000.
|
|
:param target: Target volume
|
|
:param v_t: The traded volume
|
|
"""
|
|
assert target > 0
|
|
reward = performance_raise * v_t.sum() / target
|
|
reward -= self.penalty * ((v_t / target) ** 2).sum()
|
|
assert not (np.isnan(reward) or np.isinf(reward)), f"{performance_raise}, {v_t}, {target}"
|
|
return reward / 100
|