Week 8 ยท ๐ŸŸข ๊ณผ์ œ 5 ยท ์ˆ˜๋ฃŒ

Paper Trading + ์ˆ˜๋ฃŒ

Alpaca ยท Risk Guards ยท Bracket Order ยท ํ•™์Šต ๋ฐœํ‘œ

๐Ÿ  ๊ฐ•์˜๋…ธํŠธ ํ™ˆ ๐Ÿ“ฆ ์ด ํŽ˜์ด์ง€ GitHub โ†— ๐Ÿ“‚ W8 ํด๋” โ†—
๋ชฉํ‘œ

์ด๋ฒˆ ์ฃผ ๋ชฉํ‘œ โ€” End-to-End

W7์˜ Orchestrator๊ฐ€ BUY_STRONG/SELL_STRONG์„ ๋‚ผ ๋•Œ Risk Guards๋ฅผ ํ†ต๊ณผํ•œ ์‹œ๊ทธ๋„๋งŒ Alpaca paper ๊ณ„์ขŒ์— ์ž๋™ ๋ฐœ์ฃผํ•ฉ๋‹ˆ๋‹ค. Bracket Order(์ง„์ž…+์ต์ ˆ+์†์ ˆ ๋™์‹œ ๋“ฑ๋ก)๋กœ ์ง„์ž… ์ฆ‰์‹œ ์ถœ๊ตฌ๋„ ์ •ํ•ด๋‘ก๋‹ˆ๋‹ค.

๐Ÿšซ ์‹ค๊ฑฐ๋ž˜ ์ ˆ๋Œ€ ๊ธˆ์ง€. Alpaca paper-api URL๊ณผ paper credential๋งŒ ์‚ฌ์šฉ. ์‹ค ํ‚ค์™€ paper ํ‚ค๋Š” ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ณ„์ •์—์„œ ๋ฐœ๊ธ‰ํ•ด ์„ž์ด์ง€ ์•Š๊ฒŒ.
4 Risk Guards

4๋‹จ๊ณ„ Risk Guards

๊ฐ€๋“œ์ฒดํฌ์œ„๋ฐ˜ ์‹œ
1. ๋‹จ์ผ ์ข…๋ชฉ ๋น„์ค‘์ด๋ฒˆ ์ฃผ๋ฌธ ํ›„ ๋‹จ์ผ ์ข…๋ชฉ ๋น„์ค‘ โ‰ค 10%์ฃผ๋ฌธ ์ทจ์†Œ + Slack ๊ฒฝ๊ณ 
2. ์ผ์ผ ์ฒด๊ฒฐ ํšŸ์ˆ˜๋‹น์ผ ์ฒด๊ฒฐ โ‰ค 5๊ฑด๋‹น์ผ ์ถ”๊ฐ€ ์ฃผ๋ฌธ ์ฐจ๋‹จ
3. ๋ณ€๋™์„ฑ ์ž„๊ณ„20์ผ ๋ณ€๋™์„ฑ โ‰ค 5%์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰ ์ ˆ๋ฐ˜
4. DDL (Daily Drawdown Limit)๋‹น์ผ ํ‰๊ฐ€์†์ต โ‰ฅ -2%๋งค์ˆ˜ ์ „๋ฉด ์ค‘๋‹จ (์•ˆ์ „๋ชจ๋“œ)

4๊ฐ€์ง€ ๋ชจ๋‘ ํ†ต๊ณผํ•œ ์‹œ๊ทธ๋„๋งŒ Bracket Order๋กœ ๋ฐœ์ฃผ. ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจ ์‹œ ์‚ฌ์œ ์™€ ํ•จ๊ป˜ Slack ์•Œ๋ฆผ.

Bracket Order

Bracket Order ๊ตฌ์กฐ

ํ•œ ๋ฒˆ์˜ ์ฃผ๋ฌธ์— 3๊ฐœ ๋‹ค๋ฆฌ๊ฐ€ ๋™์‹œ ๋“ฑ๋ก:
1. Entry โ€” ์‹œ์žฅ๊ฐ€ ๋˜๋Š” ์ง€์ •๊ฐ€ ๋งค์ˆ˜/๋งค๋„
2. Take Profit โ€” +5% ์ˆ˜์ต ์‹œ ์ž๋™ ๋งค๋„
3. Stop Loss  โ€” -2% ์†์‹ค ์‹œ ์ž๋™ ๋งค๋„

โ†’ ์ง„์ž… ์งํ›„๋ถ€ํ„ฐ ๋ณดํ˜ธ์„ ์ด ์‚ด์•„์žˆ์Œ โ†’ ์ธ๊ฐ„ ๊ฐœ์ž… ์—†์ด๋„ ์†์‹ค ํ•œ์ •
Workflow

์›Œํฌํ”Œ๋กœ์šฐ ํ๋ฆ„

๐Ÿ”ด Triggerโ†’ W7 Orchestrator ๊ฒฐ๊ณผ โ€” verdict=BUY_STRONG/SELL_STRONG๋งŒ
๐Ÿ”ต Positionโ†’ Alpaca GET /v2/positions โ€” ํ˜„์žฌ ํฌ์ง€์…˜ ์กฐํšŒ
๐Ÿ”ต Accountโ†’ Alpaca GET /v2/account โ€” ์ž”๊ณ  + ์ผ์ผ ์†์ต ์กฐํšŒ
โšซ Risk ร— 4โ†’ Code โ€” 4 ๊ฐ€๋“œ ์ˆœ์ฐจ ์ฒดํฌ, ์ฒซ ์‹คํŒจ ์‹œ short-circuit
๐Ÿ”ต Bracketโ†’ Alpaca POST /v2/orders โ€” order_class=bracket
๐ŸŸข Log+Notifyโ†’ Sheets ์ฃผ๋ฌธ์ด๋ ฅ + Slack ๋ฐœ์ฃผ ์•Œ๋ฆผ (๋ชจ์˜)
API

Alpaca Bracket Order

POST https://paper-api.alpaca.markets/v2/orders
APCA-API-KEY-ID: {KEY}
APCA-API-SECRET-KEY: {SECRET}
Content-Type: application/json

{
  "symbol": "AAPL",
  "qty": 10,
  "side": "buy",
  "type": "market",
  "time_in_force": "gtc",
  "order_class": "bracket",
  "take_profit": { "limit_price": "{{entry * 1.05}}" },
  "stop_loss":   { "stop_price":  "{{entry * 0.98}}" }
}
Risk Guards Code

Risk Guards JavaScript ๊ณจ๊ฒฉ

// ์ž…๋ ฅ: {ticker, side, qty, price}, position[], account
// ์ถœ๋ ฅ: {pass: true|false, failed_guard?, reason?}

const orderValue = qty * price;
const portfolioValue = +account.portfolio_value;

// Guard 1: ๋‹จ์ผ ์ข…๋ชฉ ๋น„์ค‘ โ‰ค 10%
const myPosVal = positions.filter(p => p.symbol===ticker)
                          .reduce((s,p) => s + +p.market_value, 0);
const newConcentration = (myPosVal + orderValue) / portfolioValue;
if (newConcentration > 0.10) {
  return {pass:false, failed_guard:1, reason:`single ${(newConcentration*100).toFixed(1)}%`};
}

// Guard 2: ์ผ์ผ ์ฒด๊ฒฐ ํšŸ์ˆ˜ โ‰ค 5
const todayFills = await getAlpacaFillsToday(); // helper
if (todayFills.length >= 5) {
  return {pass:false, failed_guard:2, reason:`today ${todayFills.length} fills`};
}

// Guard 3: ๋ณ€๋™์„ฑ โ‰ค 5%
const vol20 = await get20DayVolatility(ticker); // helper from W2
if (vol20 > 0.05) {
  // ์ˆ˜๋Ÿ‰ ์ ˆ๋ฐ˜์œผ๋กœ
  qty = Math.floor(qty/2);
}

// Guard 4: DDL โ‰ฅ -2%
const dailyPnL = (+account.equity - +account.last_equity) / +account.last_equity;
if (dailyPnL < -0.02 && side === 'buy') {
  return {pass:false, failed_guard:4, reason:`DDL ${(dailyPnL*100).toFixed(1)}%`};
}

return {pass:true, qty};
Missions

๐ŸŸข ๊ณผ์ œ 5๊ฐœ (์ˆ˜๋ฃŒ)

1
Alpaca paper ๋ฐœ์ฃผ ๋‹จ๋…
Risk Guards ์—†์ด 1์ฃผ ๋งค์ˆ˜ โ†’ ์ฒด๊ฒฐ ํ™•์ธ โ†’ ์ฆ‰์‹œ ๋งค๋„. ๋ฐœ์ฃผ ํ๋ฆ„ ๊ฒ€์ฆ
2
Bracket Order
+5% ์ต์ ˆ / -2% ์†์ ˆ ๋™์‹œ ๋“ฑ๋ก. /v2/orders?nested=true๋กœ ๋‹ค๋ฆฌ 3๊ฐœ ํ™•์ธ
3
4 Risk Guards ์ ์šฉ
์œ„ ์ฝ”๋“œ ์ ์šฉ โ†’ ์ผ๋ถ€๋Ÿฌ ๋น„์ค‘ 11%์ธ ์‹œ๋‚˜๋ฆฌ์˜ค ๋งŒ๋“ค์–ด Guard 1 ์‹คํŒจ ๋ฉ”์‹œ์ง€ ํ™•์ธ
4
W7 โ†’ W8 ์—ฐ๊ฒฐ
W7 Orchestrator์˜ BUY_STRONG ์ถœ๋ ฅ์ด W8 ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ๋˜๋„๋ก Execute Workflow ์—ฐ๊ฒฐ
5
์ˆ˜๋ฃŒ ๋ฐœํ‘œ
๋ณธ์ธ์˜ ์ž๋™ ๋งค๋งค ๋ฆฌ์„œ์น˜ ์‹œ์Šคํ…œ 1๊ฐœ์›” paper ์šด์šฉ ๊ฒฐ๊ณผ๋ฅผ README/์Šฌ๋ผ์ด๋“œ๋กœ ์ •๋ฆฌ
๐ŸŽ“ ์ˆ˜๋ฃŒ
์—ฌ๊ธฐ๊นŒ์ง€ ๋๋ƒˆ๋‹ค๋ฉด ๋ณธ์ธ์€ ์‹œ์ค‘์—์„œ ๋ณด๊ธฐ ๋“œ๋ฌธ "์ „ ๊ณผ์ •์„ ์ž๋ ฅ์œผ๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋™๋งค๋งค ํ•™์Šต์ž"์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„๋Š”:
1. SP โ€” KIS ๋ชจ์˜ํˆฌ์ž๋กœ ํ•œ๊ตญ ์ฃผ์‹ ์ ์šฉ
2. ๋ฐฑํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(backtrader, vectorbt) ํ•™์Šต
3. Position Sizing (Kelly ยท ๋ณ€๋™์„ฑ ๊ธฐ๋ฐ˜)
4. ์ž๋™๋งค๋งค ์‹ฌ๋ฆฌ ํ•™์Šต (1๊ฐœ์›” paper ์†์ต ์ผ์ง€ ์ž‘์„ฑ)