쪽지발송 성공
Click here
재능넷 이용방법
재능넷 이용방법 동영상편
가입인사 이벤트
판매 수수료 안내
안전거래 TIP
재능인 인증서 발급안내

🌲 지식인의 숲 🌲

🌳 디자인
🌳 음악/영상
🌳 문서작성
🌳 번역/외국어
🌳 프로그램개발
🌳 마케팅/비즈니스
🌳 생활서비스
🌳 철학
🌳 과학
🌳 수학
🌳 역사
해당 지식과 관련있는 인기재능

개인용도의 프로그램이나 소규모 프로그램을 합리적인 가격으로 제작해드립니다.개발 아이디어가 있으시다면 부담 갖지 마시고 문의해주세요. ...

프로그래밍 15년이상 개발자입니다.(이학사, 공학 석사) ※ 판매자와 상담 후에 구매해주세요. 학습을 위한 코드, 게임, 엑셀 자동화, 업...

30년간 직장 생활을 하고 정년 퇴직을 하였습니다.퇴직 후 재능넷 수행 내용은 쇼핑몰/학원/판매점 등 관리 프로그램 및 데이터 ...

#### 결재 먼저 하지 마시고 쪽지 먼저 주세요. ######## 결재 먼저 하지 마시고 쪽지 먼저 주세요. ####안녕하세요. C/C++/MFC/C#/Python 프...

강화학습을 이용한 포트폴리오 관리 시스템

2024-09-25 19:12:55

재능넷
조회수 18 댓글수 0

강화학습을 이용한 포트폴리오 관리 시스템 🚀💼

 

 

금융 시장의 복잡성과 불확실성이 증가함에 따라, 투자자들은 더욱 정교하고 효율적인 포트폴리오 관리 방법을 필요로 하고 있습니다. 이러한 요구에 부응하여, 인공지능과 머신러닝 기술을 활용한 혁신적인 접근 방식이 주목받고 있죠. 그 중에서도 '강화학습'을 이용한 포트폴리오 관리 시스템은 특히 주목할 만한 분야입니다. 🤖📊

이 글에서는 강화학습의 기본 개념부터 시작하여, 이를 포트폴리오 관리에 적용하는 방법, 그리고 실제 시스템 구현에 이르기까지 폭넓게 다루어보겠습니다. 금융 전문가부터 프로그래밍 애호가, 그리고 일반 투자자까지 모두가 이해하고 활용할 수 있는 내용으로 구성했습니다.

특히, 이 주제는 '프로그램 개발' 카테고리의 '응용프로그래밍' 영역에 속하는 만큼, 실제 코드 구현과 기술적 세부사항에 대해서도 자세히 설명드리겠습니다. 재능넷과 같은 재능 공유 플랫폼에서도 이러한 고급 기술을 배우고 공유할 수 있다는 점에서, 이 글이 여러분의 지식과 기술 향상에 도움이 되길 바랍니다. 💡🌟

자, 그럼 이제 강화학습을 이용한 포트폴리오 관리의 세계로 함께 떠나볼까요? 준비되셨나요? Let's dive in! 🏊‍♂️🌊

1. 강화학습의 기본 개념 이해하기 🧠

강화학습(Reinforcement Learning)은 머신러닝의 한 분야로, 에이전트가 환경과 상호작용하며 학습하는 방식입니다. 이 학습 방법은 인간이 시행착오를 통해 학습하는 과정과 매우 유사하죠. 🎓

1.1 강화학습의 핵심 요소

  • 에이전트(Agent): 학습하고 결정을 내리는 주체
  • 환경(Environment): 에이전트가 상호작용하는 세계
  • 상태(State): 현재 환경의 상황
  • 행동(Action): 에이전트가 취할 수 있는 선택
  • 보상(Reward): 행동의 결과로 얻는 피드백
  • 정책(Policy): 에이전트의 행동 결정 전략

1.2 강화학습의 작동 원리

강화학습의 기본 원리는 다음과 같습니다:

  1. 에이전트가 현재 상태를 관찰합니다.
  2. 정책에 따라 행동을 선택합니다.
  3. 환경이 변화하고, 새로운 상태가 됩니다.
  4. 에이전트는 보상을 받습니다.
  5. 이 과정을 반복하며 최적의 정책을 학습합니다.
강화학습 사이클 에이전트 행동 환경 상태 보상

1.3 강화학습의 주요 알고리즘

강화학습에는 다양한 알고리즘이 있습니다. 주요 알고리즘들을 살펴보겠습니다:

  • Q-Learning: 가장 기본적인 강화학습 알고리즘 중 하나로, 행동-가치 함수를 학습합니다.
  • SARSA (State-Action-Reward-State-Action): Q-Learning과 유사하지만, 현재 정책을 따르는 on-policy 알고리즘입니다.
  • DQN (Deep Q-Network): 딥러닝을 Q-Learning에 접목한 알고리즘으로, 복잡한 상태 공간을 다룰 수 있습니다.
  • Policy Gradient: 최적의 정책을 직접 학습하는 방법으로, 연속적인 행동 공간에서 유용합니다.
  • Actor-Critic: Policy Gradient와 가치 기반 방법을 결합한 알고리즘입니다.

💡 Pro Tip: 강화학습 알고리즘 선택 시, 문제의 특성과 환경의 복잡성을 고려해야 합니다. 단순한 환경에서는 Q-Learning이 효과적일 수 있지만, 복잡한 금융 시장과 같은 환경에서는 DQN이나 Actor-Critic 같은 고급 알고리즘이 더 적합할 수 있습니다.

1.4 강화학습의 장단점

강화학습은 강력한 도구이지만, 모든 상황에 적합한 것은 아닙니다. 장단점을 이해하는 것이 중요합니다:

장점 단점
- 복잡한 환경에서 효과적
- 지속적인 학습과 적응 가능
- 명시적인 프로그래밍 없이 최적화 가능
- 학습에 많은 시간과 데이터 필요
- 안정성 확보가 어려울 수 있음
- 결과 해석이 어려울 수 있음

이러한 기본 개념을 바탕으로, 다음 섹션에서는 강화학습을 포트폴리오 관리에 어떻게 적용할 수 있는지 살펴보겠습니다. 금융 시장이라는 복잡한 환경에서 강화학습이 어떻게 활용될 수 있는지, 그 가능성과 도전 과제에 대해 알아보겠습니다. 🚀

2. 포트폴리오 관리와 강화학습의 만남 💼🤝🤖

포트폴리오 관리는 투자자들에게 항상 큰 도전 과제였습니다. 시장의 불확실성, 다양한 자산 클래스, 그리고 끊임없이 변화하는 경제 환경은 전통적인 포트폴리오 관리 방법의 한계를 드러내고 있죠. 이러한 상황에서 강화학습은 혁신적인 해결책을 제시합니다. 🌟

2.1 전통적 포트폴리오 관리 vs 강화학습 기반 포트폴리오 관리

전통적인 포트폴리오 관리 방법과 강화학습 기반 방법을 비교해 보겠습니다:

전통적 방법 강화학습 기반 방법
- 정적인 자산 배분
- 과거 데이터에 크게 의존
- 인간의 판단에 의존
- 시장 변화에 느린 대응
- 동적인 자산 배분
- 실시간 데이터 활용
- 알고리즘 기반 의사결정
- 시장 변화에 빠른 적응

2.2 강화학습을 포트폴리오 관리에 적용하는 방법

강화학습을 포트폴리오 관리에 적용할 때, 다음과 같은 요소들을 고려해야 합니다:

  • 상태(State): 현재 포트폴리오 구성, 시장 지표, 경제 지표 등
  • 행동(Action): 자산 매수, 매도, 보유 등의 투자 결정
  • 보상(Reward): 포트폴리오 수익률, 샤프 비율 등의 성과 지표
  • 정책(Policy): 주어진 시장 상황에서 최적의 투자 결정을 내리는 전략
강화학습 기반 포트폴리오 관리 강화학습 기반 포트폴리오 관리 시장 데이터 강화학습 에이전트 투자 결정 동적 포트폴리오 최적화

2.3 강화학습 기반 포트폴리오 관리의 장점

  1. 동적 자산 배분: 시장 상황에 따라 실시간으로 포트폴리오를 조정할 수 있습니다.
  2. 다차원 데이터 활용: 가격 데이터뿐만 아니라 뉴스, 소셜 미디어 등 다양한 데이터를 통합적으로 분석할 수 있습니다.
  3. 비선형 패턴 인식: 복잡한 시장 패턴을 인식하고 이를 투자 결정에 반영할 수 있습니다.
  4. 리스크 관리: 수익뿐만 아니라 리스크를 고려한 최적의 포트폴리오 구성이 가능합니다.
  5. 감정 배제: 인간의 감정적 요소를 배제하고 데이터에 기반한 객관적인 결정을 내릴 수 있습니다.

💡 Pro Tip: 강화학습 기반 포트폴리오 관리 시스템을 구현할 때, 초기에는 시뮬레이션 환경에서 충분히 테스트하고 검증하는 것이 중요합니다. 실제 시장에 적용하기 전에 백테스팅과 페이퍼 트레이딩을 통해 시스템의 안정성과 성능을 확인하세요.

2.4 강화학습 기반 포트폴리오 관리의 도전 과제

물론, 이 접근 방식에도 몇 가지 도전 과제가 있습니다:

  • 데이터의 질과 양: 고품질의 충분한 데이터 확보가 필수적입니다.
  • 과적합(Overfitting) 위험: 과거 데이터에 너무 최적화되어 미래 성능이 저하될 수 있습니다.
  • 해석 가능성: 복잡한 모델의 결정 과정을 이해하고 설명하기 어려울 수 있습니다.
  • 시장의 비정상성: 금융 시장의 불규칙하고 예측 불가능한 변화에 대응해야 합니다.
  • 규제 및 윤리적 문제: 알고리즘 거래에 대한 규제와 윤리적 고려사항을 준수해야 합니다.

이러한 도전 과제들을 극복하고 강화학습의 장점을 최대한 활용하기 위해서는 지속적인 연구와 개발, 그리고 실제 시장 환경에서의 신중한 테스트가 필요합니다. 다음 섹션에서는 강화학습 기반 포트폴리오 관리 시스템의 구체적인 구현 방법에 대해 알아보겠습니다. 🛠️💻

3. 강화학습 기반 포트폴리오 관리 시스템 구현하기 🛠️

이제 실제로 강화학습을 이용한 포트폴리오 관리 시스템을 구현하는 방법에 대해 알아보겠습니다. 이 과정은 복잡할 수 있지만, 단계별로 접근하면 충분히 구현 가능합니다. 👨‍💻👩‍💻

3.1 시스템 아키텍처 설계

강화학습 기반 포트폴리오 관리 시스템의 기본 아키텍처는 다음과 같습니다:

포트폴리오 관리 시스템 아키텍처 포트폴리오 관리 시스템 아키텍처 데이터 수집 전처리 강화학습 모델 실행 엔진

3.2 데이터 수집 및 전처리

첫 번째 단계는 필요한 데이터를 수집하고 전처리하는 것입니다. 이는 다음과 같은 과정을 포함합니다:

  • 주가, 거래량, 재무제표 등의 기본 금융 데이터 수집
  • 경제 지표, 뉴스 데이터 등의 보조 데이터 수집
  • 결측치 처리, 정규화, 특성 엔지니어링 등의 데이터 전처리

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler

# 데이터 로드
df = pd.read_csv('stock_data.csv')

# 결측치 처리
df = df.fillna(method='ffill')

# 정규화
scaler = MinMaxScaler()
df['normalized_price'] = scaler.fit_transform(df[['close_price']])

# 기술적 지표 추가 (예: 5일 이동평균)
df['MA5'] = df['close_price'].rolling(window=5).mean()

3.3 강화학습 환경 설계

다음으로, 강화학습 에이전트가 상호작용할 환경을 설계해야 합니다. 이 환경은 다음과 같은 요소를 포함해야 합니다:

  • 상태 공간: 현재 포트폴리오 상태, 시장 상태 등
  • 행동 공간: 가능한 투자 결정들 (매수, 매도, 보유 등)
  • 보상 함수: 포트폴리오 성과를 평가하는 지표 (수익률, 샤프 비율 등)
  • 상태 전이: 행동에 따른 포트폴리오와 시장 상태의 변화

import gym
from gym import spaces

class PortfolioEnv(gym.Env):
    def __init__(self, data):
        super(PortfolioEnv, self).__init__()
        self.data = data
        self.action_space = spaces.Discrete(3)  # 매수, 매도, 보유
        self.observation_space = spaces.Box(low=0, high=1, shape=(5,), dtype=np.float32)

    def step(self, action):
        # 행동 실행 및 다음 상태, 보상 계산
        # ...

    def reset(self):
        # 환경 초기화
        # ...

    def render(self):
        # 현재 상태 시각화
        # ...

3.4 강화학습 모델 구현

이제 실제 강화학습 모델을 구 현하고 학습시킬 차례입니다. 여기서는 DQN (Deep Q-Network) 알고리즘을 예로 들어 설명하겠습니다:


import tensorflow as tf
from tensorflow import keras
import numpy as np

class DQNAgent:
    def __init__(self, state_size, action_size):
        self.state_size = state_size
        self.action_size = action_size
        self.memory = []
        self.gamma = 0.95    # 할인율
        self.epsilon = 1.0   # 탐험률
        self.epsilon_min = 0.01
        self.epsilon_decay = 0.995
        self.model = self._build_model()

    def _build_model(self):
        model = keras.Sequential([
            keras.layers.Dense(24, input_dim=self.state_size, activation='relu'),
            keras.layers.Dense(24, activation='relu'),
            keras.layers.Dense(self.action_size, activation='linear')
        ])
        model.compile(loss='mse', optimizer=keras.optimizers.Adam(lr=0.001))
        return model

    def remember(self, state, action, reward, next_state, done):
        self.memory.append((state, action, reward, next_state, done))

    def act(self, state):
        if np.random.rand() <= self.epsilon:
            return np.random.randint(self.action_size)
        act_values = self.model.predict(state)
        return np.argmax(act_values[0])

    def replay(self, batch_size):
        minibatch = random.sample(self.memory, batch_size)
        for state, action, reward, next_state, done in minibatch:
            target = reward
            if not done:
                target = reward + self.gamma * np.amax(self.model.predict(next_state)[0])
            target_f = self.model.predict(state)
            target_f[0][action] = target
            self.model.fit(state, target_f, epochs=1, verbose=0)
        if self.epsilon > self.epsilon_min:
            self.epsilon *= self.epsilon_decay

3.5 학습 및 평가

모델을 구현한 후에는 학습을 진행하고 성능을 평가해야 합니다:


# 환경과 에이전트 초기화
env = PortfolioEnv(data)
agent = DQNAgent(state_size=env.observation_space.shape[0], action_size=env.action_space.n)

# 학습
episodes = 1000
batch_size = 32

for e in range(episodes):
    state = env.reset()
    state = np.reshape(state, [1, env.observation_space.shape[0]])
    for time in range(500):
        action = agent.act(state)
        next_state, reward, done, _ = env.step(action)
        next_state = np.reshape(next_state, [1, env.observation_space.shape[0]])
        agent.remember(state, action, reward, next_state, done)
        state = next_state
        if done:
            print(f"episode: {e}/{episodes}, score: {time}")
            break
    if len(agent.memory) > batch_size:
        agent.replay(batch_size)

# 평가
def evaluate_model(env, agent, episodes=100):
    total_reward = 0
    for _ in range(episodes):
        state = env.reset()
        state = np.reshape(state, [1, env.observation_space.shape[0]])
        done = False
        while not done:
            action = agent.act(state)
            next_state, reward, done, _ = env.step(action)
            state = np.reshape(next_state, [1, env.observation_space.shape[0]])
            total_reward += reward
    return total_reward / episodes

average_reward = evaluate_model(env, agent)
print(f"Average reward over 100 episodes: {average_reward}")

3.6 실행 엔진 구현

마지막으로, 학습된 모델을 실제 트레이딩에 적용할 수 있는 실행 엔진을 구현해야 합니다:


class TradingExecutionEngine:
    def __init__(self, agent, broker_api):
        self.agent = agent
        self.broker_api = broker_api

    def execute_trade(self, state):
        action = self.agent.act(state)
        if action == 0:  # 매수
            self.broker_api.buy()
        elif action == 1:  # 매도
            self.broker_api.sell()
        # action == 2는 보유(아무 것도 하지 않음)

    def run(self):
        while True:
            current_state = self.get_current_market_state()
            self.execute_trade(current_state)
            time.sleep(60)  # 1분마다 실행

    def get_current_market_state(self):
        # 현재 시장 상태를 가져오는 로직
        # ...

💡 Pro Tip: 실제 트레이딩에 적용하기 전에 반드시 백테스팅과 페이퍼 트레이딩을 충분히 수행하세요. 또한, 리스크 관리 전략을 철저히 수립하고, 규제 준수 여부를 확인하는 것이 중요합니다.

3.7 시스템 최적화 및 유지보수

강화학습 기반 포트폴리오 관리 시스템을 구현한 후에도 지속적인 최적화와 유지보수가 필요합니다:

  • 하이퍼파라미터 튜닝: 그리드 서치나 베이지안 최적화를 통해 모델의 하이퍼파라미터를 최적화합니다.
  • 모델 업데이트: 정기적으로 새로운 데이터로 모델을 재학습시킵니다.
  • 성능 모니터링: 시스템의 성능을 지속적으로 모니터링하고, 필요시 조정합니다.
  • 리스크 관리: 포트폴리오의 리스크를 지속적으로 평가하고 관리합니다.
  • 규제 준수: 관련 법규와 규제를 지속적으로 모니터링하고 준수합니다.

이러한 단계를 거쳐 구현된 강화학습 기반 포트폴리오 관리 시스템은 전통적인 방법보다 더 동적이고 효율적인 자산 관리를 가능하게 합니다. 하지만 이는 복잡한 시스템이므로, 구현과 운영에 있어 세심한 주의와 지속적인 개선이 필요합니다. 🚀📈

4. 결론 및 미래 전망 🔮

강화학습을 이용한 포트폴리오 관리 시스템은 금융 기술의 혁신적인 발전을 대표하는 사례입니다. 이 기술은 다음과 같은 이점을 제공합니다:

  • 시장 변화에 대한 빠른 적응
  • 인간의 감정을 배제한 객관적인 의사결정
  • 복잡한 패턴 인식 능력
  • 24/7 모니터링 및 거래 가능

그러나 이러한 시스템을 구현하고 운영하는 데에는 여전히 많은 도전 과제가 있습니다:

  • 데이터의 품질과 양 확보
  • 모델의 안정성과 신뢰성 보장
  • 규제 준수 및 윤리적 고려사항
  • 극단적인 시장 상황에서의 대응

미래에는 다음과 같은 발전이 예상됩니다:

  1. 더 정교한 알고리즘: 멀티에이전트 시스템, 메타러닝 등의 고급 기술 적용
  2. 하이브리드 모델: 강화학습과 다른 AI 기술(예: 자연어 처리)의 결합
  3. 설명 가능한 AI: 모델의 결정 과정을 더 잘 이해하고 설명할 수 있는 기술 발전
  4. 실시간 적응: 시장 변화에 즉각적으로 대응하는 더욱 동적인 시스템
  5. 규제 기술(RegTech): AI 기반 포트폴리오 관리와 규제 준수를 동시에 달성하는 기술

💡 Pro Tip: 강화학습 기반 포트폴리오 관리 시스템을 개발하고 운영하려면 금융, 컴퓨터 과학, 수학 등 다양한 분야의 전문 지식이 필요합니다. 학제간 협력과 지속적인 학습이 성공의 열쇠입니다.

결론적으로, 강화학습을 이용한 포트폴리오 관리는 금융 기술의 미래를 보여주는 흥미로운 분야입니다. 이 기술은 투자 전략을 혁신하고, 더 효율적이고 지능적인 자산 관리를 가능하게 할 것입니다. 그러나 이러한 시스템을 책임감 있게 개발하고 사용하는 것이 중요합니다. 기술의 힘을 이해하고 적절히 활용하면서도, 윤리적 고려사항과 리스크 관리를 항상 염두에 두어야 합니다.

강화학습 기반 포트폴리오 관리 시스템의 개발과 운영은 도전적이지만 매우 보람찬 여정입니다. 이 분야에 관심 있는 개발자와 금융 전문가들에게 큰 기회가 될 것입니다. 지속적인 학습, 실험, 그리고 혁신을 통해 금융 기술의 새로운 지평을 열어갈 수 있을 것입니다. 🌟🚀💼

관련 키워드

  • 강화학습
  • 포트폴리오 관리
  • 인공지능
  • 금융기술
  • 알고리즘 트레이딩
  • 머신러닝
  • 데이터 분석
  • 리스크 관리
  • 자산 배분
  • 투자 전략

지식의 가치와 지적 재산권 보호

자유 결제 서비스

'지식인의 숲'은 "이용자 자유 결제 서비스"를 통해 지식의 가치를 공유합니다. 콘텐츠를 경험하신 후, 아래 안내에 따라 자유롭게 결제해 주세요.

자유 결제 : 국민은행 420401-04-167940 (주)재능넷
결제금액: 귀하가 받은 가치만큼 자유롭게 결정해 주세요
결제기간: 기한 없이 언제든 편한 시기에 결제 가능합니다

지적 재산권 보호 고지

  1. 저작권 및 소유권: 본 컨텐츠는 재능넷의 독점 AI 기술로 생성되었으며, 대한민국 저작권법 및 국제 저작권 협약에 의해 보호됩니다.
  2. AI 생성 컨텐츠의 법적 지위: 본 AI 생성 컨텐츠는 재능넷의 지적 창작물로 인정되며, 관련 법규에 따라 저작권 보호를 받습니다.
  3. 사용 제한: 재능넷의 명시적 서면 동의 없이 본 컨텐츠를 복제, 수정, 배포, 또는 상업적으로 활용하는 행위는 엄격히 금지됩니다.
  4. 데이터 수집 금지: 본 컨텐츠에 대한 무단 스크래핑, 크롤링, 및 자동화된 데이터 수집은 법적 제재의 대상이 됩니다.
  5. AI 학습 제한: 재능넷의 AI 생성 컨텐츠를 타 AI 모델 학습에 무단 사용하는 행위는 금지되며, 이는 지적 재산권 침해로 간주됩니다.

재능넷은 최신 AI 기술과 법률에 기반하여 자사의 지적 재산권을 적극적으로 보호하며,
무단 사용 및 침해 행위에 대해 법적 대응을 할 권리를 보유합니다.

© 2024 재능넷 | All rights reserved.

댓글 작성
0/2000

댓글 0개

해당 지식과 관련있는 인기재능

안녕하세요!!!고객님이 상상하시는 작업물 그 이상을 작업해 드리려 노력합니다.저는 작업물을 완성하여 고객님에게 보내드리는 것으로 거래 완료...

2015년 전국 기능경기대회 은메달 수상 경력이 있습니다.엑셀 차트, 데이터, 함수, vba 등 엑셀에 관련된 작업 해드립니다.   ...

AS규정기본적으로 A/S 는 평생 가능합니다. *. 구매자의 요청으로 수정 및 보완이 필요한 경우 일정 금액의 수고비를 상호 협의하에 요청 할수 있...

📚 생성된 총 지식 3,422 개

  • (주)재능넷 | 대표 : 강정수 | 경기도 수원시 영통구 봉영로 1612, 7층 710-09 호 (영통동) | 사업자등록번호 : 131-86-65451
    통신판매업신고 : 2018-수원영통-0307 | 직업정보제공사업 신고번호 : 중부청 2013-4호 | jaenung@jaenung.net

    (주)재능넷의 사전 서면 동의 없이 재능넷사이트의 일체의 정보, 콘텐츠 및 UI등을 상업적 목적으로 전재, 전송, 스크래핑 등 무단 사용할 수 없습니다.
    (주)재능넷은 통신판매중개자로서 재능넷의 거래당사자가 아니며, 판매자가 등록한 상품정보 및 거래에 대해 재능넷은 일체 책임을 지지 않습니다.

    Copyright © 2024 재능넷 Inc. All rights reserved.
ICT Innovation 대상
미래창조과학부장관 표창
서울특별시
공유기업 지정
한국데이터베이스진흥원
콘텐츠 제공서비스 품질인증
대한민국 중소 중견기업
혁신대상 중소기업청장상
인터넷에코어워드
일자리창출 분야 대상
웹어워드코리아
인터넷 서비스분야 우수상
정보통신산업진흥원장
정부유공 표창장
미래창조과학부
ICT지원사업 선정
기술혁신
벤처기업 확인
기술개발
기업부설 연구소 인정
마이크로소프트
BizsPark 스타트업
대한민국 미래경영대상
재능마켓 부문 수상
대한민국 중소기업인 대회
중소기업중앙회장 표창
국회 중소벤처기업위원회
위원장 표창