i]SrSSKJr SSKJr SSKJrJrJrJrJ r J r J r J r J r Jr SSKJr SSKJr \"5r"SS\5r"S S \5r"S S \5r"S S\5r"SS\5r"SS\5r"SS\5r"SS\5r"SS\5r"SS\5r"SS\5r"SS\5r"SS \5r "S!S"\5r!"S#S$\5r""S%S&\5r#"S'S(\5r$"S)S*\5r%g+),zR Database models for AI Trading System Sprint 1: Foundation - Data storage models )datetime)Optional) BooleanColumnDateTimeFloat ForeignKeyIntegerStringTextUniqueConstraintIndex)declarative_base) relationshipcb\rSrSrSrSr\"\SSS9r\"\ "S5SSSS9r \"\ "S 55r \"\ "S 55r \"\ "S 55r \"\ "S 5S S 9r\"\ "S55r\"\SS 9r\"\\R(S 9r\"\\R(\R(S9r\"SSSS9r\"SSSS9rSrSrg)StockzStock/Ticker informationstocksT primary_key autoincrementF)uniquenullableindexd2zBorsa Italianadefaultr onupdate PriceDatastockall, delete-orphanback_populatescascadeFundamentalDatac<SURSURS3$)Nz)tickernameselfs (C:\PYTHON\Trading\src\database\models.py__repr__Stock.__repr__0s  YtyykEEN)__name__ __module__ __qualname____firstlineno____doc__ __tablename__rr idr r,r-sectorindustrymarketpriorityr is_activerrutcnow created_at updated_atr price_datafundamental_datar1__static_attributes__r4r3r0rrs"M T >B F2Jte4 HF &+ D F3K FfSk"H F2J(8 9FfRj!Hw-I(//:J(//HOOTJk'K_`J#$5gWklFr3rc*\rSrSrSrSr\"SSSS9\"SSS54r\ "\ S S S 9r \ "\ \ "S 5S S 9r \ "\S S S9r\ "\5r\ "\5r\ "\5r\ "\S S 9r\ "\ 5r\ "\5r\ "\"S5SS9r\ "\\R4S9r\"SSS9rSrSrg)r#4z#Historical and real-time price datarDstock_iddate uq_stock_dater-idx_stock_dateTr stocks.idFrrrryfinancerrr'cVSURSURSURS3$)Nz)rIrJcloser.s r0r1PriceData.__repr__Ps.%dmm_HTYYKyQUQ[Q[P\\^__r3r4N) r5r6r7r8r9r:r r__table_args__rr r;r rIrrJropenhighlowrVvolume adj_closer data_sourcerrArBrr$r1rFr4r3r0r#r#4s- MV/B  F3N T >Bgz+6GH (U$ 7D %=D %=D -C 55 )E G_Fu IZ8K(//:J  >E`r3r#c\rSrSrSrSr\"SSSS9\"SSS54r\ "\ S S S 9r \ "\ \ "S 5S S 9r \ "\S S S9r\ "\5r\ "\5r\ "\5r\ "\5r\ "\5r\ "\5r\ "\5r\ "\5r\ "\5r\ "\5r\ "\5r\ "\5r\ "\5r\ "\5r\ "\5r\ "\5r \ "\5r!\ "\5r"\ "\#"S5SS9r$\ "\\%RLS9r'\("SSS9r)Sr*Sr+g)r)TzFundamental metrics for stocksrErIrJuq_fundamental_stock_daterLidx_fundamental_stock_dateTrrNFrOrPrrQrrrRcVSURSURSURS3$)NzBgz+6GH (U$ 7De}He}He}Hu I5MMe} -C -CE]N%=LE]N5MM-KE]NUmOJe} %=DZ8K(//:J 1C DElr3r)c\rSrSrSrSr\"\SSS9r\"\\ "S55r \"\ SSS9r \"\ "S 55r\"\5r\"\5r\"\5r\"\SS 9r\"\SS 9r\"\SS 9r\"\5r\"\ \R4S 9rS rS rg )DataQualityMetricz,Data quality tracking and validation metricsdata_quality_metricsTrrNFrPrrcVSURSURSURS3$)NzBgz+67H (U$ 7D$K7OMWoO'51Lgu-Hgt,HTlO(//:Jrr3rxc\rSrSrSrSr\"\SSS9r\"\ \ RSS9r \"\ "S55r\"\ "S55r\"\5r\"\5r\"\ "S55r\"\ "S55rS rS rg ) SystemLogz!System activity and error logging system_logsTrr rrrcVSURSURSURS3$)NzBxEI 6": E F3K FTlGTlG&*%Lvc{#Ijr3rc\rSrSrSrSr\"\SSS9r\"\ "S5SSS9r \"\ 5r \"\ S S 9r\"\ S S 9r\"\SS 9r\"\\R(S 9r\"\\R(\R(S 9r\"S S SS9r\"SS SS9rSrSrg) PortfoliozPortfolio/Account definition portfoliosTrrFrrrr! Transaction portfolior%r&Positionc<SURSURS3$)NzB &+d ;D,K%-L%-Lw-I(//:J(//HOOTJ kSghLZ MabILr3rc2\rSrSrSrSr\"SSS54r\"\ SSS9r \"\ \ "S 5S S 9r \"\ \ "S 5S S 9r \"\S SS 9r\"\"S5S S 9r\"\ S S 9r\"\S S 9r\"\SS9r\"\S S 9r\"\5r\"\\R4S9r\"SSS9r\"S5rSrSr g)rz!Portfolio transactions (buy/sell)ridx_transaction_portfolio_date portfolio_idrJTr portfolios.idFrOrNrP rrrrRrc pSURSURSURSURS3 $)NzB':o#>OLgz+6GH (U$ 7D &*u -Dg.H 55 )Es+J%%0L 4LE(//:J[HI  !Ewr3rc<\rSrSrSrSr\"SSSS94r\"\ SSS 9r \"\ \ "S 5S S 9r \"\ \ "S 5S S 9r \"\ S S 9r\"\S S 9r\"\S S 9r\"\5r\"\5r\"\5r\"\5r\"\\R0\R0S9r\"SSS9r\"S5rSrSrg)rzCurrent portfolio positionsrrrIuq_portfolio_stockrLTrrFrOrNr!rrRrcVSURSURSURS3$)NzB':o#>OLgz+6GHg.H551M.J5MM5MME]N(//HOOTJ[EI  !Elr3rc`\rSrSrSrSr\"\SSS9r\"\\ "S5SS9r \"\ "S 5SS9r \"\ "S 5SS9r \"\SS9r\"\SS 9r\"\SS 9r\"\5r\"\S S 9r\"\SS 9r\"\SS 9r\"\5r\"\\R6S 9r\"\\R6\R6S 9r\"S5rSr Sr!g)AlertizPrice and metric alertsalertsTrrNFrOrrrrr!rcVSURSURSURS3$)NzBgz+6GHr U3JvbzE2IUU3Ow-I'51Lx(7A.MWe4O'51L,K(//:J(//HOOTJ  !Epr3rc\rSrSrSrSr\"SSS54r\"\ SSS9r \"\ \ "S 5S S 9r \"\ "S 5S S 9r\"\ "S 55r\"\ "S55r\"\ "S5SS9r\"\ "S55r\"\S SS9r\"\5r\"\5r\"\ "S5SS9r\"\ "S5SS9r\"\\R6S9r\"S5r\"SSS SS9rSr Sr!g)Newsi=zNews articles related to stocksnewsidx_news_stock_daterI published_atTrrNFrOirri)rrPritrrnewsapir SentimentDatar%)r'uselistr(cBSURSURSSS3$)Nz)rItitler.s r0r1 News.__repr__]s& yCR8IPPr3r4N)"r5r6r7r8r9r:rrXrr r;r rIr rsourceauthorurl image_urlrrr rcontentlanguager^rrArBrr$ sentimentr1rFr4r3r0rr=s)M #Z@N T >Bgz+6GH 6#; /E F3K F F3K F d +Cvd|$I(U$?L,KTlGfRj$/HY7K(//:J  !E_VU\pqIQr3rc6\rSrSrSrSr\"\SSS9r\"\\ "S5SSS9r \"\\ "S 5SSS 9r \"\ "S 55r \"\5r\"\5r\"\5r\"\5r\"\5r\"\ "S 55r\"\\R.S 9r\"SSS9r\"S5rSrSrg)riaz,Sentiment analysis results for news articlessentiment_dataTrznews.idFrrNrPrrrrrrRrcVSURSURSURS3$)NzBWj3eDQGgz+6dSHVBZ(OUmOJE]NE]N5MMs $J8??;K { ;D  !E~r3rcj\rSrSrSrSr\"SSSSS9\"S SS54r\ "\ S S S 9r \ "\ \ "S 5S S9r \ "\"S5S S9r\ "\S S S9r\ "\S S9r\ "\5r\ "\5r\ "\5r\ "\"S55r\ "\5r\ "\\R4S9r\ "\5r\ "\5r\ "\5r\"S5r Sr!Sr"g) Predictioniz Price predictions from AI models predictionsrIprediction_dater uq_predictionrLidx_prediction_stock_dateTrrNFrOrrPrrrc pSURSURSURSURS3 $)NzOyY]YmYmXnnwx|yMyMxNNPQ Qr3r4N)#r5r6r7r8r9r:r rrXrr r;r rIr rrrrr lower_bound upper_boundrpredicted_directionpredicted_change_pctrrArB actual_priceprediction_errorprediction_error_pctrr$r1rFr4r3r0rrs*!M%6 ?[ ):7HIN T >Bgz+6GHr U3JXTBOUU3O-K-KJ!,!%=(//:J%=Le}!%=  !EQr3rc\rSrSrSrSr\"SSS54r\"\ SSS9r \"\ \ "S 5S S 9r \"\ "S 5S S 9r\"\S S 9r\"\5r\"\5r\"\5r\"\5r\"\5r\"\5r\"\S S 9r\"\5r\"\5r\"\SS 9r\"\S S 9r\"\5r\"\\ RBSS9r"\"\5r#\$"S5r%Sr&Sr'g)Recommendationiz,Trading recommendations based on AI analysisrecommendationsidx_recommendation_stock_daterIrBTrrNFrOrrrrcVSURSURSURS3$)NzBgz+6GH!e<.J%=Lu IUmOu UmOe}H551Mt I,Kw-I%0K"K(//FJ!J  !E|r3rcb\rSrSrSrSr\"SSS54r\"\ SSS9r \"\ "S 5S SS 9r \"\ S SS 9r\"\5r\"\5r\"\5r\"\5r\"\5r\"\5r\"\5r\"\ 5r\"\ 5r\"\5r\"\ "S 55r\"\5r\"\ \R<S 9rS r Sr!g) ModelMetricsiz!Performance metrics for AI models model_metricsidx_model_metrics_daterrJTrrFrPrcVSURSURSURS3$)NzBr U$?J (U$ 7D -C %=D %=De}Hu I E]Fe}Hg"5M6":&MTlO(//:J`r3rc@\rSrSrSrSr\"SSSS9\"SS54r\ "\ S S S 9r \ "\ \ "S 5S S 9r \ "\ \ "S5S S 9r\ "\S S 9r\ "\"S55r\ "\5r\ "\\R.S9r\ "\\R.\R.S9r\"S5r\"S5rSrSrg)TargetAllocationiz-Target portfolio allocation (for rebalancing)target_allocationsrrIuq_portfolio_stock_targetrLidx_target_allocation_portfolioTrrFrOrNrrr!rrcXSURSURSURSS3$)NzB':o#>OLgz+6GH551M6#;'M 4LE(//:J(//HOOTJ[)I  !EBr3r"c\rSrSrSrSr\"\SSS9r\"\ "S5SS9r \"\ \ RSS 9r\"\ 5r\"\ "S 5S S9r\"\5r\"\5r\"\5r\"\5r\"\ "S 55r\"\ "S 55r\"\5r\"\ "S55r\"\5r\"\S S9r\"\S S9r\"\ \ RS9r\"\ \ R\ RS 9r\ "SSSS9r!Sr"Sr#g)AdvisorSessioniz!LLM Advisor conversation sessionsadvisor_sessionsTrrr rrractiverr!AdvisorMessagesessionr%r&c pSURSURSURSURS3 $)NzBVBZ3G(//FJhH F2J 1FUmG"6":."6":.$D\!&*-GQ/Ngq1(//:J(//HOOTJ,YPdeH@r3r+c\rSrSrSrSr\"SSS54r\"\ SSS9r \"\ \ "S 5S S 9r \"\ \RSS 9r\"\"S 5S S 9r\"\S S 9r\"\5r\"SSS9rSrSrg)r.i@z,Individual messages in advisor conversationsadvisor_messagesidx_advisor_message_session session_idrTrzadvisor_sessions.idFrOrrr+rArRcVSURSURSURS3$)Nz= 80 (20%+ margin of safety) are saved. opportunitiesidx_opportunities_tickerr,idx_opportunities_found_date found_dateidx_opportunities_statusr2idx_opportunities_scorescoreTrrNrOrFrPrrr)r rnewrr!rc pSURSURSURSURS3 $)NzBgz+6FHF2Jd ;F&+&L F3K F 7OEF2J'NJ5MMe}%=Lt I4LMt Id|Hd|&*%L(//EJJ"K F2J F F2J .F8$M 4LE(//:J(//HOOTJ  !EEr3rKN)&r9rtypingr sqlalchemyrrrrr r r r r rsqlalchemy.ext.declarativersqlalchemy.ormrBaserr#r)rxrrrrrrrrrrr"r+r.rKr4r3r0res8    8'FDF2``@3ld3llrr:jj*LL.w$wBltlB pD pP!Q4!QH~D~>$Q$QN)|T)|X"`4"`JBtBF"@T"@JnTn2=E$=Er3