Files
mmd/__pycache__/report.cpython-314.pyc

117 lines
13 KiB
Plaintext
Raw Normal View History

2026-05-26 22:21:27 +02:00
+
<1D>j_#<00><00><>a<02>Rt"0tRt^RIt^RIt^RIt^RIt^RIHtHt^RIH t ^RI
t ^RI H t Ht] !]4P R, t]P$!]P'44t]P+4UUu/uF wrVP-R4'dKWbK" uppt]^kRtRR ltR
R ltR R ltRRltRRltRRltRRltRt ]!R8Xd
] !4R#R#uuppi)u<>
report.py — Daily P&L report for MoneyMaker dry run.
Usage:
python report.py # full P&L report
python report.py --fees # fee drag analysis only
python report.py --signals # signal accuracy summary only
N)<02>datetime<6D>timezone)<01>Path)<02>get_conn<6E>DB_TYPEzc25.json<6F>_i'c<00>2<00>V^8<>dQhR\R,/#<00><03><00>returnN<6E><01>float)<01>formats"<22>)/home/hjess/Projects/MoneyMaker/report.py<70> __annotate__rs<00><00>
<10>
<10><15><14><1C>
<10>c<04>n<00>\P!R4PpVPR4;'gVPR4pVPR4;'gVPR4pV'd&V'dV^8<>dW!,
V, ^d,#R# \dR#i;i)z>Fetch today's return for OMX C25 CAP index from Yahoo Finance.z^OMXC25<32> previousClose<73>regularMarketPreviousClose<73> lastPrice<63>regularMarketPriceN)<05>yf<79>Ticker<65> fast_info<66>get<65> Exception)<03>info<66>prev<65>lasts r<00>_c25_day_returnrs<><00><00> <0A><11>y<EFBFBD>y<EFBFBD><19>#<23>-<2D>-<2D><04><14><08><08><1F>)<29>S<>S<>T<EFBFBD>X<EFBFBD>X<EFBFBD>6R<36>-S<><04><14><08><08><1B>%<25>G<>G<><14><18><18>2F<32>)G<><04> <0F>D<EFBFBD>T<EFBFBD>A<EFBFBD>X<EFBFBD><18>K<EFBFBD>4<EFBFBD>'<27>#<23>-<2D> -<2D> <10><> <15> <0A> <0C> <0F> <0A>s(<00>7B%<00>)B%<00>$B%<00>>B%<00>B%<00>% B4<03>3B4c<00>\<00>V^8<>dQhR\\\\,3,/#<00>r
r )<04>tupler <00>list<73>dict)rs"rrr(s!<00><00>'!<21>'!<21>5<EFBFBD><15><04>T<EFBFBD>
<EFBFBD>!2<>3<>'!rc<04>x<00>VPR4P4p.pRpVF<>pVR,p\VR,4p\VR,4pVR,p\P V/4P RVR,4p \
P !V 4PP R 4;'gTp
Wg,p Wj,p W<>,
p V 'dW<>, ^d,M^pW=, pVPRVRVR
VR V
R V R V RV RVRV/ 4K<> W23# \dTp
Lri;i)z`
Calculate unrealised P&L for all open positions.
Returns (total_unrealised_dkk, details_list).
zSELECT * FROM positions<6E><00>ticker<65>shares<65> entry_price<63>
entry_date<EFBFBD> ticker_yahooz.COr<00>entryr<00>cost<73>value<75>unreal<61>pct)
<EFBFBD>execute<74>fetchallr <00>C25rrrrr<00>append)<0F>db<64> positions<6E>details<6C> total_unreal<61>pr'r(r,r*<00> yf_tickerrr-r.r/r0s& r<00>_unrealised_pnlr;(s:<00><00>
<13>
<EFBFBD>
<EFBFBD>4<>5<>><3E>><3E>@<40>I<EFBFBD><10>G<EFBFBD><16>L<EFBFBD> <16><01><16>x<EFBFBD>[<5B><06><1A>1<EFBFBD>X<EFBFBD>;<3B>'<27><06><1A>1<EFBFBD>]<5D>+<2B>,<2C><05><16>|<7C>_<EFBFBD>
<EFBFBD><17>G<EFBFBD>G<EFBFBD>F<EFBFBD>B<EFBFBD>'<27>+<2B>+<2B>N<EFBFBD>F<EFBFBD>U<EFBFBD>N<EFBFBD>K<> <09> <19><15>9<EFBFBD>9<EFBFBD>Y<EFBFBD>'<27>1<>1<>5<>5<>k<EFBFBD>B<>K<>K<>e<EFBFBD>D<EFBFBD><19>.<2E><04><18>-<2D><05><17>,<2C><06>+/<2F>6<EFBFBD>=<3D>3<EFBFBD>&<26>Q<EFBFBD><03><14><1E> <0C><0F><0E><0E> <14>&<26> <14>&<26> <13>%<25> <12>$<24> <12>$<24> <13>%<25> <14>&<26> <11>#<23> <18>*<2A>

<EFBFBD>
<0B>%<17>< <18> <20> <20><>+<19> <19><18>D<EFBFBD> <19>s<00> 9D)<02>) D9<05>8D9c<00>$<00>V^8<>dQhR\/#r!r )rs"rrrRs<00><00>$<24>$<24><15>$rc<04>x<00>VPR4P4p\VR,;'g^4#)z*Sum all realised P&L from position_events.zQSELECT COALESCE(SUM(pnl_dkk),0) AS total FROM position_events WHERE action='sell'<27>total)r1<00>fetchoner <00>r5<00>rows& r<00> _realised_pnlrBRs6<00><00>
<0C>*<2A>*<2A>[<5B> <06><0E>h<EFBFBD>j<EFBFBD><08> <11><13>W<EFBFBD><1C>"<22>"<22><11> #<23>#rc<00>$<00>V^8<>dQhR\/#r!r )rs"rrrZs<00><00><13><13>u<EFBFBD>rc<04><><00>VPR4P4p\VR,;'g^4# \dR#i;i)zSum all fees from saxo_orders.z9SELECT COALESCE(SUM(fee_dkk),0) AS total FROM saxo_ordersr>r&)r1r?r rr@s& r<00> _total_feesrEZsM<00><00><13><10>j<EFBFBD>j<EFBFBD> G<>
<EFBFBD>
<12>(<28>*<2A> <0C><15>S<EFBFBD><17>\<5C>&<26>&<26>Q<EFBFBD>'<27>'<27><> <14><13><12><13>s<00>3=<00>=<00> A <03> A c<00>F<00>V^8<>dQhR\\,R\/#)r
<00>positions_detailsr )r#r$r )rs"rrres<00><00>5<>5<><14>d<EFBFBD><1A>5<><05>5rc<00>&<00>\RV44#)c3<00>2"<00>TF qR,x<00>K R#5i)r-N<>)<02>.0r9s& r<00> <genexpr><3E>_invested.<locals>.<genexpr>fs<00><00><00>4<>"3<>Q<EFBFBD><16>y<EFBFBD>y<EFBFBD>"3<>s<00>)<01>sum)rGs&r<00> _investedrOes<00><00> <0E>4<>"3<>4<> 4<>4rc<00>$<00>V^8<>dQhR\/#r!)r$)rs"rrris<00><00>2
<EFBFBD>2
<EFBFBD>D<EFBFBD>2
rc<04><><00>VPR4P4p\VR,;'g^4p\VR,;'g^4p\VR,;'g^4pV^8<>d\VR,4^d,MRpVPR4P4pR\VR ,;'g^4R
\VR
,;'g^4R \ \VR ,;'g^4^4RVRVRVR V/# \d ^;p;r4RpL<>i;i \dR^R
^R ^RTRTRTR T/u#i;i) z<>
Calculate signal accuracy from completed trades (position_events).
A signal is 'correct' if the trade had P&L > 0 (signal_correct=1).
Also returns overall signal scan stats from article_signals.
a<EFBFBD>
SELECT
COUNT(*) AS total_trades,
SUM(CASE WHEN signal_correct=1 THEN 1 ELSE 0 END) AS correct,
SUM(CASE WHEN signal_correct=0 THEN 1 ELSE 0 END) AS wrong,
COALESCE(AVG(CASE WHEN signal_correct IS NOT NULL
THEN signal_correct END), -1) AS accuracy
FROM position_events
WHERE action = 'sell' AND signal_correct IS NOT NULL
<20> total_trades<65>correct<63>wrong<6E>accuracyNa
SELECT
COUNT(*) AS total_signals,
SUM(CASE WHEN alert=1 THEN 1 ELSE 0 END) AS alerts,
AVG(signal_score) AS avg_score
FROM article_signals
WHERE signal_score IS NOT NULL
r><00> total_signals<6C>alerts<74> avg_score<72> accuracy_pct)r1r?<00>intr r<00>round)r5rArRrSrTrY<00>srows& r<00>_signal_accuracyr]isr<00><00><1C><10>j<EFBFBD>j<EFBFBD>  <0C>  <0A><16>X<EFBFBD>Z<EFBFBD> <0C><1B>3<EFBFBD>~<7E>.<2E>3<>3<>!<21>4<> <0C><1A>3<EFBFBD>y<EFBFBD>><3E>.<2E>.<2E>Q<EFBFBD>/<2F><07><1A>3<EFBFBD>w<EFBFBD><<3C>,<2C>,<2C>1<EFBFBD>-<2D><05>9E<39><01>9I<39><05>c<EFBFBD>*<2A>o<EFBFBD>.<2E><13>4<>t<EFBFBD> <0C> 
<EFBFBD><11>z<EFBFBD>z<EFBFBD> <0C> <0A><16>X<EFBFBD>Z<EFBFBD> <0A> <14>C<EFBFBD><04>_<EFBFBD> 5<> :<3A> :<3A><11>;<3B> <14>C<EFBFBD><04>X<EFBFBD><0E> 3<> 3<>!<21>4<> <17>E<EFBFBD>%<25><04>[<5B>(9<>(><3E>(><3E>Q<EFBFBD>"?<3F><11>C<> <1A>L<EFBFBD> <15>G<EFBFBD> <13>E<EFBFBD> <1A>L<EFBFBD>
<EFBFBD>
<EFBFBD><EFBFBD> <15><1C>)*<2A>*<2A> <0C>*<2A>w<EFBFBD><1B> <0C><1C><>. <15>
<EFBFBD> <13>Q<EFBFBD><08>!<21>[<5B>!<21> <1A>L<EFBFBD>)<29>W<EFBFBD> <13>U<EFBFBD>N<EFBFBD>L<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>sF<00>3D<00>D<00>D<00>.)D<00>4D7<00> D7<00>) D7<00>
D7<00>D4<03>3D4<03>7E<03>Ec<00><00>V^8<>dQhRR/#r rJ)rs"rrr<00>s<00><00>G<0F>G<0F>d<EFBFBD>Grc<00><00>\4p\P!\P4P R4p\ V4wr#\V4p\V4p\V4p\V,
pWB,V,
pV\, ^d,p \4p
V
e W<>,
MRp \V4p \4\RF4\RV 24\R\ 24\RF4\R\R R24\RVR R\V4 R 24\R
VR R24\4\R VR R24\R VR R24\RV)R R24\RVR RV R R24\4V
e7V 'd
V ^8<>dRMRp \RV
R R24\RV R RV 24M \R4\4V'd<>\R4VFfpVR,^8<>dRMRp\RV RVR ,R! R"VR#,R$ R%VR&,R$ R'VR(,R$ R)VR,R* R+VR,,R- R24Kh \R.4\4\R/V R0,R1 R224\R3V R4,R1 R524\R6V R7,R8 24V R9,^8<>dNV R:,pV'd
V^28<32>dRMRp\R;V R9, R<V R=, R>V R?, R@VR$ RAV 2
4M \RB4V^8<>d:V\!\#W<>,4^4, ^d,p\RCVRD RE24\RF4\4VP%4R#)Gz%d %b %Y %H:%M UTCNu MONEYMAKER P&L · z DB: z Kapital: z>10,.0fz DKKz Investeret: z DKK (z pos.)z Kontant: z Urealiseret: z>+10,.0fz Realiseret: z Total gebyrer: z>+8,.0fz Net P&L: z+.2fz%)u✅u❌z C25 index: z
% (i dag)z vs benchmark: z% z* C25 index: N/A (marked lukket?)ut ┌─ Åbne positioner ─────────────────────────────┐r/u📈u📉u<20> r'z<8z r(z.0fu stk købt r,z nu rz P&L z+.0fz (r0z+.1fu<EFBFBD> └────────────────────────────────────────────────┘z Signaler: r>z>5z analyseretz Alerts: rWu ⚡ triggersz Gns score: rXz>5.3frRrYz Lukkede handler: z (rSz korrekte / rTu forkerte) → z% z( Lukkede handler: 0 (ingen salg endnu)z Gebyr-drag: z.1fz% af brutto P&Lu<4C>════════════════════════════════════════════════)rr<00>nowr<00>utc<74>strftimer;rBrErO<00>CAPITALrr]<00>printr<00>len<65>max<61>abs<62>close)r5ra<00> unreal_totalr6<00>realised<65>fees<65>invested<65>cash<73>net_pnl<6E>net_pct<63>c25_ret<65>vs_bench<63> sig_stats<74>
bench_iconr9<00>icon<6F>acc<63>drag_pcts r<00> print_reportrx<00>s<><00><00>
<12>*<2A>B<EFBFBD>
<12>,<2C>,<2C>x<EFBFBD>|<7C>|<7C>
$<24>
-<2D>
-<2D>.C<>
D<EFBFBD>C<EFBFBD>-<2D>b<EFBFBD>1<><1B>L<EFBFBD><1F><02>#<23>H<EFBFBD><1D>b<EFBFBD>/<2F>D<EFBFBD><1B>I<EFBFBD>&<26>H<EFBFBD><19>H<EFBFBD>$<24>D<EFBFBD><1A>)<29>D<EFBFBD>0<>G<EFBFBD><1A>W<EFBFBD>$<24>s<EFBFBD>*<2A>G<EFBFBD>!<21>#<23>G<EFBFBD>)0<>)<<3C>7<EFBFBD>$<24>$<24>H<EFBFBD>"<22>2<EFBFBD>&<26>I<EFBFBD>
<EFBFBD>G<EFBFBD> <09>*<2A><15> <09> "<22>3<EFBFBD>%<25>
(<28>)<29> <09>F<EFBFBD>7<EFBFBD>)<29>
<1C><1D> <09>*<2A><15> <09>O<EFBFBD>G<EFBFBD>G<EFBFBD>,<2C>D<EFBFBD>
1<EFBFBD>2<> <09>O<EFBFBD>H<EFBFBD>W<EFBFBD>-<2D>W<EFBFBD>S<EFBFBD><19>^<5E>4D<34>F<EFBFBD>
K<EFBFBD>L<> <09>O<EFBFBD>D<EFBFBD><17>><3E><14>
.<2E>/<2F> <09>G<EFBFBD> <09>O<EFBFBD>L<EFBFBD><18>2<>$<24>
7<EFBFBD>8<> <09>O<EFBFBD>H<EFBFBD>X<EFBFBD>.<2E>d<EFBFBD>
3<EFBFBD>4<> <09> <1D>t<EFBFBD>e<EFBFBD>G<EFBFBD>_<EFBFBD>D<EFBFBD>
1<EFBFBD>2<> <09>O<EFBFBD>G<EFBFBD>H<EFBFBD>-<2D>W<EFBFBD>W<EFBFBD>T<EFBFBD>N<EFBFBD>"<22>
E<EFBFBD>F<> <09>G<EFBFBD><0F><1A>&<26>8<EFBFBD>q<EFBFBD>=<3D>U<EFBFBD>e<EFBFBD>
<EFBFBD> <0A>&<26>w<EFBFBD>t<EFBFBD>n<EFBFBD>J<EFBFBD>?<3F>@<40> <0A>&<26>x<EFBFBD><04>o<EFBFBD>S<EFBFBD><1A> <0C>E<>F<> <0A>:<3A>;<3B> <09>G<EFBFBD><11> <0A>E<02> F<02><1A>A<EFBFBD><1E>x<EFBFBD>[<5B>A<EFBFBD>-<2D>6<EFBFBD>6<EFBFBD>D<EFBFBD> <11><19>$<24><16>q<EFBFBD><11>8<EFBFBD><1B>R<EFBFBD> 0<><02>1<EFBFBD>X<EFBFBD>;<3B>s<EFBFBD>2C<32>D<19><1A>7<EFBFBD><1A>C<EFBFBD>(<28><05>a<EFBFBD><06>i<EFBFBD><03>_<EFBFBD>=<17><18><18>{<7B>4<EFBFBD>(<28><02>1<EFBFBD>U<EFBFBD>8<EFBFBD>D<EFBFBD>/<2F><12>=<3D> <0E><1B> <0E>i<02> j<02> <0A><07>
<EFBFBD>O<EFBFBD>I<EFBFBD>g<EFBFBD>.<2E>r<EFBFBD>2<>,<2C>
?<3F>@<40> <09>O<EFBFBD>I<EFBFBD>h<EFBFBD>/<2F><02>3<>><3E>
B<EFBFBD>C<> <09>O<EFBFBD>I<EFBFBD>k<EFBFBD>2<>5<EFBFBD>9<>
:<3A>;<3B><10><1E> <20>1<EFBFBD>$<24><17><0E>'<27><03><1B><03>r<EFBFBD> <09>u<EFBFBD>u<EFBFBD><04> <0A>#<23>I<EFBFBD>n<EFBFBD>$=<3D>#><3E>?<12><1B>I<EFBFBD>&<26>'<27>|<7C>I<EFBFBD>g<EFBFBD>4F<34>3G<33>H<15><18><13>I<EFBFBD>R<EFBFBD><04>v<EFBFBD>'<27> (<28> <0E>8<>9<> <0B>a<EFBFBD>x<EFBFBD><18>3<EFBFBD>s<EFBFBD>7<EFBFBD>><3E>2<>A<EFBFBD>6<>6<>#<23>=<3D><08> <0A><0F><08><13>~<7E>_<EFBFBD>=<3D>><3E> <09>*<2A><15> <09>G<EFBFBD><06>H<EFBFBD>H<EFBFBD>Jrc<00><><00>\P!RR7pVPRRR7VPRRR7VP4p\ 4R#)zMoneyMaker P&L rapport)<01> descriptionz--fees<65>
store_true)<01>actionz --signalsN)<05>argparse<73>ArgumentParser<65> add_argument<6E>
parse_argsrx)<02>parser<65>argss r<00>mainr<6E><00>sL<00><00> <15> $<24> $<24>1I<31> J<>F<EFBFBD>
<EFBFBD><17><17><08>L<EFBFBD><17>9<>
<EFBFBD><17><17> <0B>L<EFBFBD><17>9<> <11> <1C> <1C> <1E>D<EFBFBD><10>Nr<00>__main__c<00>b<00>V^8<>dQh/^\9d\\\3,;R&#)r
r3)<03>__conditional_annotations__r$<00>str)rs"rrrs'<00><00><04><04>*T<01>S<>T<EFBFBD>#<23>t<EFBFBD>)<29>_<EFBFBD>S<>+r)#r<><00>__doc__<5F>sys<79>time<6D>jsonr}rr<00>pathlibr<00>yfinancerr5rr<00>__file__<5F>parent<6E>C25_PATH<54>loads<64> read_text<78>_c25_raw<61>items<6D>
startswithr3rdrr;rBrErOr]rxr<><00>__name__r)<03>k<>vr<76>s00@r<00><module>r<>s<><00><><01><04> <0B> <0B> <0B><0F>'<27><18><15> <20> <0F><08>><3E> <20> <20>:<3A> -<2D><08> <0F>:<3A>:<3A>h<EFBFBD>(<28>(<28>*<2A> +<2B><08>)1<><1E><1E>)9<>S<>)9<><14><11><11><1C><1C>c<EFBFBD>AR<41><04><01><04>)9<>S<><03>S<>
<10><07>
<10>'!<21>T$<24><13>5<>2
<EFBFBD>jG<0F>T<13> <0C>z<EFBFBD><19><08>F<EFBFBD><1A><>uTs <00>?C.<06>C.