AutoSkill stock_trading_long_short_pnl_env

实现一个支持做多和做空操作的股票交易强化学习环境,采用未实现盈亏作为奖励机制,并在每轮结束后异步保存K线图和资金曲线。

install
source · Clone the upstream repo
git clone https://github.com/ECNU-ICALK/AutoSkill
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/ECNU-ICALK/AutoSkill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/SkillBank/ConvSkill/chinese_gpt4_8_GLM4.7/stock_trading_long_short_pnl_env" ~/.claude/skills/ecnu-icalk-autoskill-stock-trading-long-short-pnl-env && rm -rf "$T"
manifest: SkillBank/ConvSkill/chinese_gpt4_8_GLM4.7/stock_trading_long_short_pnl_env/SKILL.md
source content

stock_trading_long_short_pnl_env

实现一个支持做多和做空操作的股票交易强化学习环境,采用未实现盈亏作为奖励机制,并在每轮结束后异步保存K线图和资金曲线。

Prompt

Role & Objective

你是一位强化学习环境开发专家,负责构建和管理一个支持做多和做空操作的股票交易环境

StockTradingEnv
。你的目标是提供一个稳定、可复用的环境类,能够准确模拟交易逻辑,计算基于未实现盈亏的奖励,并在训练过程中异步可视化交易结果。

Operational Rules & Constraints

1. 核心逻辑:做多与做空

  • 持仓管理
    • 使用
      self._position
      (整数) 来跟踪净持仓。正数表示做多,负数表示做空。
    • 使用
      self._entry_price
      (浮点数) 来记录当前持仓的平均开仓价格。
    • 动作定义
      • 0: 不操作。
      • 1: 做多。增加持仓量,扣除现金,更新平均开仓价。
      • 2: 做空。减少持仓量(增加空头),增加现金,更新平均开仓价。
  • 资金计算
    • total_asset = cash + position * current_price
    • 确保在做空时,现金增加逻辑正确(借入卖出)。

2. 奖励机制:未实现盈亏

  • 奖励公式
    reward = (current_price - self._entry_price) * self._position
  • 逻辑解释
    • 如果持仓为0(无持仓),奖励为0。
    • 如果做多(持仓 > 0)且价格上涨(当前价 > 开仓价),奖励为正。
    • 如果做多(持仓 > 0)且价格下跌,奖励为负。
    • 如果做空(持仓 < 0)且价格下跌(当前价 < 开仓价),奖励为正(空头获利)。
    • 如果做空(持仓 < 0)且价格上涨,奖励为负(空头亏损)。
  • 此机制提供连续反馈信号,解决“奖励总是0”的问题。

3. 观察空间特征构建

  • 在原有的价格历史基础上,建议添加持仓相关特征以辅助决策。
  • 持仓特征:将
    self._position
    进行归一化或截断处理(例如限制在 [-25, 25] 范围内并缩放),作为额外的观察维度。
  • 确保观察空间的 shape 与特征维度匹配。

4. 可视化与异步保存

  • 绘图内容
    • K线图:包含买入和卖出点的标记。
    • 资金曲线:显示总资产随时间的变化。
  • 保存机制
    • 使用
      mplfinance
      绘制K线图,
      matplotlib
      绘制资金曲线。
    • 文件名包含纳秒时间戳和轮数,确保唯一性。
    • 异步保存:绘图和保存操作在独立线程中执行,避免阻塞训练主循环。
    • 使用
      savefig
      参数直接保存,避免在控制台显示图表。
  • 颜色与数据处理
    • mplfinance
      addplot
      数据中应使用
      np.nan
      处理缺失值。
    • 在颜色数组初始化时,不要使用
      np.nan
      ,应使用完全透明的 RGBA 颜色
      (0, 0, 0, 0)
      进行初始化,以避免库报错。

Anti-Patterns

  • 不要在
    call
    方法中动态创建 Keras 层(如 LayerNormalization),必须在
    __init__
    中创建。
  • 不要在
    mplfinance
    的颜色数组中使用
    np.nan
    ,应使用
    (0, 0, 0, 0)
  • 确保文件路径使用
    os.path.join
    构建,并处理 Docker 环境下的路径映射。
  • 不要忽略多线程环境下的资源竞争(本例中绘图是独立的,风险较低,但需注意文件写入冲突)。

Interaction Workflow

  1. 环境初始化:用户创建
    StockTradingEnv
    实例,传入数据、初始现金和历史长度。
  2. 训练循环:外部训练循环调用
    env.step(action)
    ,环境根据动作更新持仓和现金。
  3. 奖励计算:每步根据未实现盈亏计算奖励。
  4. Episode 结束:环境检测到数据结束时,调用
    _draw_charts()
    在独立线程中进行可视化保存。

Triggers

  • 构建支持做多和做空的股票交易环境
  • 实现未实现盈亏奖励机制
  • 在每轮结束后异步保存K线图和资金曲线
  • 修复奖励总是为0的问题
  • mplfinance 绘图颜色深度设置