iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0

風險管理的重要性
風險管理在投資和交易中扮演著至關重要的角色。它有助於控制潛在損失,確保資本的安全性,了解並測量風險價值(Value at Risk,VaR)是金融機構和投資者的首要任務之一。本文將介紹使用Python來測度風險價值的不同方法,包括風險價值的概述、方差-協方差法歷史模擬法蒙地卡羅模擬法以及回溯檢驗壓力測試壓力風險價值。並維護長期投資和交易的可持續性。在這篇文章中,我們將介紹風險管理的重要性,並示範如何使用Python程式建立風險管理策略,包括停損和停利策略。

風險價值的方差-協方差法
方差-協方差法:這種方法使用股票的期望收益和協方差矩陣,通常假定股票收益率符合正態分佈,來計算風險價值。

import numpy as np

# random two sample
x = np.random.randint(0, 9, 1000)
y = np.random.randint(0, 9, 1000)

# 平均值
mx = x.mean()
my = y.mean()

# 標準差
stdx = x.std()
stdy = y.std()

# 協方差矩陣
covariance  = np.cov(x, y)

covx = np.mean((x - x.mean()) ** 2) 
covy = np.mean((y - y.mean()) ** 2) 
print(covx)
print(covy)

covariance = np.mean((x - x.mean()) * (y - y.mean()))
print(covariance)

# 關係矩陣
corr_coef  = np.corrcoef(x, y)
print(corr_coef)

風險價值的歷史模擬法
歷史模擬法是一種基於過去數據的風險價值計算方法。它不依賴於正態分佈假設,而是使用過去的實際收益率數據來估計風險價值。我們可以使用Python中的pandas和numpy庫來實施這種方法。通過排序過去的收益率數據,我們可以找到在特定置信水平下的風險價值。

import numpy as np

# 定義投資組合或資產的日度收益率數據(用百分比表示)
returns = np.array([-1.2, 0.5, -0.8, -1.5, 2.0, 1.1, -0.2, 0.7, -0.5, 1.3])

# 設定置信水平(例如,95%)
confidence_level = 0.95

# 計算VaR
def historical_var(returns, confidence_level):
    sorted_returns = np.sort(returns)
    index = int(confidence_level * len(sorted_returns))
    var = -sorted_returns[index]
    return var

# 計算VaR
var = historical_var(returns, confidence_level)

print(f"{confidence_level*100}% 置信水平下的VaR:{var:.2f}%")

在這個程式中,我們首先定義了投資組合或資產的日度收益率數據,以百分比形式表示。接著,我們設定了信心程度,例如95%。

然後,我們定義了一個名為 historical_var 的函數,該函數接受收益率數據和置信水平作為輸入,並使用歷史模擬法計算VaR。計算VaR的過程包括以下步驟:

對每日收益率進行排序。
根據置信水平,找到對應的百分位數。
選取該百分位數對應的收益率值,並將其取反向(因為VaR是損失的度量)。
最後,我們調用 historical_var 函數來計算VaR,並將結果輸出為百分比形式。

蒙地卡羅模擬法
這種方法通過生成大量隨機價格路徑,來模擬未來的股票價格。然後,計算在不同情景下的潛在損失,以估計風險價值。

用於估計圓周率π的值

import random

# 蒙特卡洛模擬的點數
num_points = 1000000

# 在1x1的正方形內隨機生成點,並計算落在圓內的點數
inside_circle = 0
for _ in range(num_points):
    x = random.uniform(0, 1)
    y = random.uniform(0, 1)
    if x**2 + y**2 <= 1:
        inside_circle += 1

# 估計圓周率π的值
pi_estimate = (inside_circle / num_points) * 4

print(f"估計的圓周率π:{pi_estimate}")

運用在股票上

import numpy as np
import matplotlib.pyplot as plt

# 股票價格模擬函數
def monte_carlo_simulation(start_price, days, mean_return, volatility):
    dt = 1 / 252  # 假設交易日為一年的1/252
    returns = np.random.normal((mean_return * dt), (volatility * np.sqrt(dt)), days)
    price = start_price * np.exp(np.cumsum(returns))
    return price

# 股票參數
initial_price = 100  # 初始股票價格
trading_days = 252  # 一年的交易日數
avg_return = 0.12  # 平均年度回報率 (12%)
volatility = 0.2  # 年度波動率 (20%)

# 模擬股票價格
simulated_prices = monte_carlo_simulation(initial_price, trading_days, avg_return, volatility)

示範如何建立風險管理策略,包括停損停利策略

import pandas as pd
import numpy as np

# 假設您持有的股票價格數據
stock_prices = pd.Series([100, 105, 110, 115, 120, 125, 120, 130, 140, 135])

# 設定停損和停利位
stop_loss = 115  # 停損價格
take_profit = 130  # 停利價格

# 創建一個DataFrame來記錄交易策略
strategy_df = pd.DataFrame(index=stock_prices.index)
strategy_df['Price'] = stock_prices
strategy_df['Position'] = None  # 創建一個空的Position欄位

# 實施停損和停利策略
for i in range(len(stock_prices)):
    price = stock_prices[i]
    if price <= stop_loss:
        strategy_df.at[i, 'Position'] = 'Sell (Stop Loss)'
    elif price >= take_profit:
        strategy_df.at[i, 'Position'] = 'Sell (Take Profit)'

# 輸出策略結果
print(strategy_df)


上一篇
交易回測分析
下一篇
實際數據串接
系列文
嘗試使用Python與Open Data 打造自動化投資30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言