33-Ulcer-Index

Sat 17 May 2025
# Created: 20250104
import pyutil as pyu
pyu.get_local_pyinfo()
'conda env: ml312-2024; pyv: 3.12.7 | packaged by Anaconda, Inc. | (main, Oct  4 2024, 13:27:36) [GCC 11.2.0]'
print(pyu.ps2("yfinance pandas matplotlib"))
yfinance==0.2.51
pandas==2.2.3
matplotlib==3.9.3
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# Step 1: Download historical data
symbol = "^GSPC"  # S&P 500 as an example
start = "2020-01-01"
end = "2023-12-31"
data = yf.download(symbol, start=start, end=end)

# Step 2: Calculate Ulcer Index (UI)
def calculate_ulcer_index(data, period=14):
    # Calculate rolling maximum
    data['Rolling Max'] = data['Close'].rolling(window=period, min_periods=1).max()

    # Calculate percentage drawdown
    data['Drawdown'] = ((data['Close'] - data['Rolling Max']) / data['Rolling Max']) * 100

    # Calculate Ulcer Index (UI)
    data['Drawdown Squared'] = data['Drawdown']**2
    data['Ulcer Index'] = np.sqrt(data['Drawdown Squared'].rolling(window=period, min_periods=1).mean())

    return data

# Apply Ulcer Index calculation
data = calculate_ulcer_index(data)

# Step 3: Plot Close Price and Ulcer Index
plt.figure(figsize=(14, 7))

# Plot Close Price
plt.subplot(2, 1, 1)
plt.plot(data['Close'], label='Close Price', color='blue')
plt.title(f'{symbol} Close Price')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.grid(True)

# Plot Ulcer Index
plt.subplot(2, 1, 2)
plt.plot(data['Ulcer Index'], label='Ulcer Index (UI)', color='red', linewidth=1.5)
plt.title(f'Ulcer Index (UI) for {symbol}')
plt.xlabel('Date')
plt.ylabel('Ulcer Index')
plt.legend(loc='best')
plt.grid(True)

plt.tight_layout()
plt.show()
[*********************100%***********************]  1 of 1 completed



---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

/tmp/ipykernel_1250259/2210956523.py in ?()
     23 
     24     return data
     25 
     26 # Apply Ulcer Index calculation
---> 27 data = calculate_ulcer_index(data)
     28 
     29 # Step 3: Plot Close Price and Ulcer Index
     30 plt.figure(figsize=(14, 7))


/tmp/ipykernel_1250259/2210956523.py in ?(data, period)
     14     # Calculate rolling maximum
     15     data['Rolling Max'] = data['Close'].rolling(window=period, min_periods=1).max()
     16 
     17     # Calculate percentage drawdown
---> 18     data['Drawdown'] = ((data['Close'] - data['Rolling Max']) / data['Rolling Max']) * 100
     19 
     20     # Calculate Ulcer Index (UI)
     21     data['Drawdown Squared'] = data['Drawdown']**2


~/miniconda3/envs/ml312-2024/lib/python3.12/site-packages/pandas/core/frame.py in ?(self, key, value)
   4297             self._setitem_frame(key, value)
   4298         elif isinstance(key, (Series, np.ndarray, list, Index)):
   4299             self._setitem_array(key, value)
   4300         elif isinstance(value, DataFrame):
-> 4301             self._set_item_frame_value(key, value)
   4302         elif (
   4303             is_list_like(value)
   4304             and not self.columns.is_unique


~/miniconda3/envs/ml312-2024/lib/python3.12/site-packages/pandas/core/frame.py in ?(self, key, value)
   4455 
   4456             return self.isetitem(locs, value)
   4457 
   4458         if len(value.columns) > 1:
-> 4459             raise ValueError(
   4460                 "Cannot set a DataFrame with multiple columns to the single "
   4461                 f"column {key}"
   4462             )


ValueError: Cannot set a DataFrame with multiple columns to the single column Drawdown

def show_graph(symbol):

pass
show_graph("AMZN")
---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

Cell In[5], line 1
----> 1 show_graph("AMZN")


NameError: name 'show_graph' is not defined


Score: 5

Category: stockmarket