95 lines
3.3 KiB
Python
95 lines
3.3 KiB
Python
# Assignment-C6 (Expert System - Stock Market Trading)
|
|
|
|
"""
|
|
THIS CODE HAS BEEN TESTED AND IS FULLY OPERATIONAL.
|
|
|
|
Problem Statement: Implement any one of the following Expert System
|
|
V. Stock market trading
|
|
|
|
Code from ArtificialIntelligence (SPPU - Third Year - Computer Engineering - Content) repository on KSKA Git: https://git.kska.io/sppu-te-comp-content/ArtificialIntelligence
|
|
"""
|
|
|
|
"""
|
|
Install required package: experta
|
|
pip install experta
|
|
"""
|
|
|
|
# BEGINNING OF CODE
|
|
from experta import *
|
|
|
|
# Define the Stock Fact
|
|
class Stock(Fact):
|
|
"""Stock details"""
|
|
name: str
|
|
current_price: float
|
|
pe_ratio: float
|
|
volatility: str # high, medium, low
|
|
trend: str # bullish, bearish, sideways
|
|
sector: str
|
|
risk_tolerance: str # low, medium, high
|
|
holding: bool # already holding the stock or not
|
|
|
|
# Expert System for Stock Trading
|
|
class StockTradingAdvisor(KnowledgeEngine):
|
|
|
|
@Rule(Stock(trend='bullish', pe_ratio=P(lambda x: x < 25), volatility='low', risk_tolerance='low', holding=False))
|
|
def buy_low_risk_stock(self):
|
|
print("Advice: BUY the stock - Low-risk bullish opportunity with good valuation.")
|
|
|
|
@Rule(Stock(trend='bullish', pe_ratio=P(lambda x: x < 40), volatility='high', risk_tolerance='high', holding=False))
|
|
def buy_aggressive_stock(self):
|
|
print("Advice: BUY the stock - High potential for return, suitable for high-risk appetite.")
|
|
|
|
@Rule(Stock(trend='bearish', holding=True))
|
|
def sell_on_downtrend(self):
|
|
print("Advice: SELL the stock - Market is bearish and you're holding the stock.")
|
|
|
|
@Rule(Stock(trend='sideways', holding=True))
|
|
def hold_in_uncertainty(self):
|
|
print("Advice: HOLD the stock - No clear trend, wait for a signal.")
|
|
|
|
@Rule(Stock(trend='bullish', holding=True))
|
|
def hold_during_bull_run(self):
|
|
print("Advice: HOLD the stock - Already in a bullish trend, ride the wave.")
|
|
|
|
@Rule(Stock(pe_ratio=P(lambda x: x > 50), volatility='high', risk_tolerance='low'))
|
|
def avoid_overvalued_stock(self):
|
|
print("Advice: AVOID the stock - Highly volatile and overvalued, not suitable for low risk tolerance.")
|
|
|
|
@Rule(Stock(volatility='medium', trend='bullish', risk_tolerance='medium'))
|
|
def moderate_buy(self):
|
|
print("Advice: BUY the stock - Balanced risk and good growth potential.")
|
|
|
|
# Run function
|
|
def run_trading_expert():
|
|
engine = StockTradingAdvisor()
|
|
engine.reset()
|
|
|
|
print("\n--- Enter Stock Details ---")
|
|
name = input("Stock Name: ")
|
|
current_price = float(input("Current Price: "))
|
|
pe_ratio = float(input("P/E Ratio: "))
|
|
volatility = input("Volatility (low/medium/high): ").lower()
|
|
trend = input("Market Trend (bullish/bearish/sideways): ").lower()
|
|
sector = input("Sector: ")
|
|
risk_tolerance = input("Your Risk Tolerance (low/medium/high): ").lower()
|
|
holding = input("Are you currently holding this stock? (yes/no): ").lower() == "yes"
|
|
|
|
engine.declare(Stock(
|
|
name=name,
|
|
current_price=current_price,
|
|
pe_ratio=pe_ratio,
|
|
volatility=volatility,
|
|
trend=trend,
|
|
sector=sector,
|
|
risk_tolerance=risk_tolerance,
|
|
holding=holding
|
|
))
|
|
|
|
print("\n🔍 Analyzing Market Conditions...\n")
|
|
engine.run()
|
|
|
|
if __name__ == "__main__":
|
|
run_trading_expert()
|
|
# END OF CODE
|