252 lines
8.9 KiB
Python
252 lines
8.9 KiB
Python
"""
|
||
НАСТРОЙКИ АКТИВОВ
|
||
"""
|
||
|
||
|
||
class AssetsConfig:
|
||
# Категории активов
|
||
ASSET_CATEGORIES = {
|
||
'bonds': {'name': 'Облигации', 'color': '#4CAF50', 'icon': '🏦'},
|
||
'stocks': {'name': 'Акции', 'color': '#2196F3', 'icon': '📈'},
|
||
'real_estate': {'name': 'Недвижимость', 'color': '#FF9800', 'icon': '🏠'},
|
||
'crypto': {'name': 'Криптовалюта', 'color': '#9C27B0', 'icon': '💰'},
|
||
'commodities': {'name': 'Сырье', 'color': '#795548', 'icon': '⛽'},
|
||
'business': {'name': 'Бизнес', 'color': '#F44336', 'icon': '🏢'},
|
||
'unique': {'name': 'Уникальные', 'color': '#FFD700', 'icon': '🏆'},
|
||
}
|
||
|
||
# Список всех активов
|
||
ASSETS = {
|
||
# ОБЛИГАЦИИ
|
||
'gov_bonds': {
|
||
'name': 'Государственные облигации',
|
||
'category': 'bonds',
|
||
'base_price': 10000,
|
||
'volatility': 0.05,
|
||
'income_per_month': 0.01,
|
||
'risk_level': 1,
|
||
'liquidity': 10,
|
||
'total_quantity': None,
|
||
'max_per_player': None,
|
||
'min_purchase': 1,
|
||
'description': 'Самый надежный актив. Защита от кризисов.'
|
||
},
|
||
|
||
# АКЦИИ
|
||
'stock_gazprom': {
|
||
'name': 'Акции Газпрома',
|
||
'category': 'stocks',
|
||
'base_price': 1000,
|
||
'volatility': 0.15,
|
||
'income_per_month': 0.03,
|
||
'risk_level': 3,
|
||
'liquidity': 8,
|
||
'total_quantity': 10000,
|
||
'max_per_player': 2000,
|
||
'min_purchase': 10,
|
||
'description': 'Голубые фишки. Стабильные дивиденды.'
|
||
},
|
||
'stock_sberbank': {
|
||
'name': 'Акции Сбербанка',
|
||
'category': 'stocks',
|
||
'base_price': 300,
|
||
'volatility': 0.18,
|
||
'income_per_month': 0.04,
|
||
'risk_level': 4,
|
||
'liquidity': 9,
|
||
'total_quantity': 15000,
|
||
'max_per_player': 3000,
|
||
'min_purchase': 10,
|
||
'description': 'Крупнейший банк. Высокая ликвидность.'
|
||
},
|
||
'stock_yandex': {
|
||
'name': 'Акции Яндекса',
|
||
'category': 'stocks',
|
||
'base_price': 3500,
|
||
'volatility': 0.25,
|
||
'income_per_month': 0.00,
|
||
'risk_level': 6,
|
||
'liquidity': 7,
|
||
'total_quantity': 5000,
|
||
'max_per_player': 1000,
|
||
'min_purchase': 1,
|
||
'description': 'IT-гигант. Высокий рост, высокая волатильность.'
|
||
},
|
||
|
||
# НЕДВИЖИМОСТЬ
|
||
'apartment_small': {
|
||
'name': 'Небольшая квартира',
|
||
'category': 'real_estate',
|
||
'base_price': 5000000,
|
||
'volatility': 0.10,
|
||
'income_per_month': 0.02,
|
||
'risk_level': 2,
|
||
'liquidity': 4,
|
||
'total_quantity': 12,
|
||
'max_per_player': 3,
|
||
'min_purchase': 1,
|
||
'description': 'Стабильный доход от аренды.'
|
||
},
|
||
'apartment_elite': {
|
||
'name': 'Элитная квартира',
|
||
'category': 'real_estate',
|
||
'base_price': 15000000,
|
||
'volatility': 0.08,
|
||
'income_per_month': 0.03,
|
||
'risk_level': 2,
|
||
'liquidity': 2,
|
||
'total_quantity': 3,
|
||
'max_per_player': 1,
|
||
'min_purchase': 1,
|
||
'description': 'Статусный актив. Низкая волатильность.'
|
||
},
|
||
|
||
# КРИПТОВАЛЮТА
|
||
'bitcoin': {
|
||
'name': 'Биткоин',
|
||
'category': 'crypto',
|
||
'base_price': 2000000,
|
||
'volatility': 0.35,
|
||
'income_per_month': 0.00,
|
||
'risk_level': 9,
|
||
'liquidity': 7,
|
||
'total_quantity': None,
|
||
'max_per_player': None,
|
||
'min_purchase': 0.001,
|
||
'description': 'Высокорисковый актив. Только спекуляции.'
|
||
},
|
||
|
||
# СЫРЬЕ
|
||
'oil': {
|
||
'name': 'Нефть Brent',
|
||
'category': 'commodities',
|
||
'base_price': 5500,
|
||
'volatility': 0.25,
|
||
'income_per_month': 0.00,
|
||
'risk_level': 6,
|
||
'liquidity': 6,
|
||
'total_quantity': 200,
|
||
'max_per_player': 40,
|
||
'min_purchase': 10,
|
||
'description': 'Зависит от политики. Высокая волатильность.'
|
||
},
|
||
'natural_gas': {
|
||
'name': 'Природный газ',
|
||
'category': 'commodities',
|
||
'base_price': 3000,
|
||
'volatility': 0.20,
|
||
'income_per_month': 0.00,
|
||
'risk_level': 5,
|
||
'liquidity': 5,
|
||
'total_quantity': 300,
|
||
'max_per_player': 50,
|
||
'min_purchase': 100,
|
||
'description': 'Сезонный актив. Пик зимой.'
|
||
},
|
||
|
||
# БИЗНЕС
|
||
'coffee_shop': {
|
||
'name': 'Кофейня',
|
||
'category': 'business',
|
||
'base_price': 2000000,
|
||
'volatility': 0.12,
|
||
'income_per_month': 0.05,
|
||
'risk_level': 5,
|
||
'liquidity': 3,
|
||
'total_quantity': 8,
|
||
'max_per_player': 2,
|
||
'min_purchase': 1,
|
||
'description': 'Пассивный бизнес. Средний риск.'
|
||
},
|
||
'it_startup': {
|
||
'name': 'IT-стартап',
|
||
'category': 'business',
|
||
'base_price': 1000000,
|
||
'volatility': 0.40,
|
||
'income_per_month': 0.00,
|
||
'risk_level': 10,
|
||
'liquidity': 1,
|
||
'total_quantity': 4,
|
||
'max_per_player': 1,
|
||
'min_purchase': 1,
|
||
'description': 'Венчурные инвестиции. Может взлететь или провалиться.'
|
||
},
|
||
|
||
# УНИКАЛЬНЫЕ
|
||
'shopping_mall': {
|
||
'name': 'Торговый центр',
|
||
'category': 'unique',
|
||
'base_price': 50000000,
|
||
'volatility': 0.10,
|
||
'income_per_month': 0.06,
|
||
'risk_level': 4,
|
||
'liquidity': 1,
|
||
'total_quantity': 1,
|
||
'max_per_player': 1,
|
||
'min_purchase': 1,
|
||
'description': 'Ключевой актив. Контроль над малым бизнесом.',
|
||
'special_rules': {
|
||
'can_be_fractional': True,
|
||
'min_fraction': 0.1,
|
||
'control_bonus': 0.1
|
||
}
|
||
},
|
||
'oil_field': {
|
||
'name': 'Нефтяное месторождение',
|
||
'category': 'unique',
|
||
'base_price': 100000000,
|
||
'volatility': 0.20,
|
||
'income_per_month': 0.08,
|
||
'risk_level': 7,
|
||
'liquidity': 1,
|
||
'total_quantity': 1,
|
||
'max_per_player': 1,
|
||
'min_purchase': 1,
|
||
'description': 'Стратегический актив. Контроль над ценами на нефть.',
|
||
'special_rules': {
|
||
'affects_other_assets': ['oil'],
|
||
'price_influence': 0.15
|
||
}
|
||
}
|
||
}
|
||
|
||
@staticmethod
|
||
def calculate_price(asset_data, demand_factor, month, total_players):
|
||
"""Расчет текущей цены актива"""
|
||
base_price = asset_data['base_price']
|
||
volatility = asset_data['volatility']
|
||
|
||
# Базовое изменение от спроса
|
||
price = base_price * (1 + demand_factor * volatility)
|
||
|
||
# Инфляция (0.5% в месяц)
|
||
price *= (1.005 ** month)
|
||
|
||
# Ограничения
|
||
price = max(price, base_price * 0.1) # Не ниже 10% от базы
|
||
price = min(price, base_price * 5) # Не выше 500% от базы
|
||
|
||
# Округление
|
||
if price < 1000:
|
||
return round(price, 2)
|
||
elif price < 1000000:
|
||
return round(price, 0)
|
||
else:
|
||
return round(price, -3)
|
||
|
||
@staticmethod
|
||
def calculate_income(asset_data, player_share, total_owners):
|
||
"""Расчет доходности с учетом баланса"""
|
||
base_income = asset_data['income_per_month']
|
||
|
||
if base_income <= 0:
|
||
return 0
|
||
|
||
# Штраф за концентрацию (если много владельцев у одного игрока)
|
||
if total_owners > 0:
|
||
concentration_penalty = (player_share ** 2) * 0.2
|
||
income = base_income * (1 - concentration_penalty)
|
||
else:
|
||
income = base_income
|
||
|
||
return max(income, 0.001) # Минимум 0.1% |