
    ^qi                       d Z ddlmZ ddlZddlmZ ddlZddlZ	ddl
mZ  ee                                          j        j        Z ee                                          j        dz  Zedz  dz  d	z  d
z  ZdZej                                         ej        d          z                       d          Zd Zedk    r e             dS dS )u  生成前端自助回测用的数据 JSON.

结构:
{
    "start_date": "2010-09-09",
    "end_date":   "2026-04-22",
    "prices": [{ "date": "...", "VOO": 95.88, "TQQQ": 1.14, "CASH": 50.00 }, ...],
    "signals": [{ "date": "...", "action": "🔵 回场", "target_state": "FULL", "spx": 1220.0 }, ...]
}

前端 backtest.html 从 start_date 用户选择的日期开始, 用这些数据实时模拟仓位演化.
    )annotationsN)Path)_classify_actionzbacktest_data.jsonoutputspxsellztrade_actions.csvz
2010-09-07   )days%Y-%m-%dc                    t          dt           d           t          j        g dt          t          dd          } | d         }d|j        v rrd	|j        v ri|d                                         }|D|j        |df         |j        |d	f         z  }|d                             |d	         |z            }n"|d	         }nd	|j        v r|d	         n|d         }t          j
        |d
         |d         |d                                          }t          dt          |           d|j        d                                          d|j        d                                                     t          j        t                     }t          j        |d                   |d<   ||d         |j        d         k    |d         |j        d         k    z                                           }dddddddd0fd}|d                             |          |d<   |                    dg          }t          d t          |                      d! |                                D             }d" |                                D             }	|j        d                             d#          |j        d                             d#          t          j                                                            d$          ||	d%}
t0                              t5          j        |
d&          d'(           t0                                          j        d)z  }t          d*t0           d+|d,d-t          |           d.t          |	           d/	           d S )1NzDownloading VOO/TQQQ/SGOV from z ...)VOOTQQQSGOVBILTF)startendauto_adjustprogressCloser   r   r   r   )r   r   CASHz  Price rows: z	, range: r   u    → dateEMPTYHALFFULLWARN)
full_clearupgrade_full
half_clearbuyreentrywarnaction_textstrreturn
str | Nonec                H                         t          |                     S )N)getr   )r#   _BACKTEST_TARGET_STATEs    Q/home/raptorx-1/project/yardeni/sentiment_indicator/web/generate_backtest_data.py
map_actionzmain.<locals>.map_actionM   s     %))*:;*G*GHHH       动作target_state)subsetz  Signal rows: c                   g | ]\  }}|                     d           t          t          |d                   d          t          t          |d                   d          t          t          |d                   d          dS )r   r      r   r   )r   r   r   r   )strftimeroundfloat).0drs      r*   
<listcomp>zmain.<locals>.<listcomp>U   s        Aq JJz**qx!,,%&	**A..%&	**A..		
 	
  r,   c                    g | ]n\  }}|d                               d          |d         |d         t          j        |d                   r#t          t	          |d                   d          nddoS )r   r   r-   r.   SPX   N)r   actionr.   r   )r2   pdnotnar3   r4   )r5   _r7   s      r*   r8   zmain.<locals>.<listcomp>^   s        Aq fI&&z22kn-0250B0BL5qx!,,,		
 	
  r,   r   z%Y-%m-%d %H:%M:%S)
start_dateend_dategenerated_atpricessignals)ensure_asciizutf-8)encodingi   u   
✅ 保存: z (z.0fz KB, u    日 × u    信号))r#   r$   r%   r&   )printSTARTyfdownloadENDcolumnsfirst_valid_indexlocfillnar=   	DataFramedropnalenindexr   read_csvTRADE_ACTIONSto_datetimecopyapplyiterrowsr2   	TimestampnowOUTPUT
write_textjsondumpsstatst_size)datacloses
sgov_start	bil_scalecashrC   
signals_dfr+   prices_listsignals_listr   size_kbr)   s               @r*   mainrk       s   	
7E
7
7
7888;555U#'%9 9 9D']FEV^$;$;F^5577
!
:v#56JPUDU9VVI&>(()BCCDD%=DD % 7 7ve}}VF^\e}v    vxx	 
 

g3v;;
g
ga1E1E1G1G
g
gfl[]N^NcNcNeNe
g
ghhh ]++J
6(:;;JvZ/6<?B(0FL4DDF GGKtvv   I I I I I I ",H!5!;!;J!G!GJ~"">*:";;J	
-C
OO
-
-...  OO%%  K  ''))  L l1o..z::L$--j99((**334GHH F dje<<<wOOOkkmm#d*G	
l6
l
lW
l
l
ls;7G7G
l
lQTUaQbQb
l
l
lmmmmmr,   __main__)__doc__
__future__r   r^   pathlibr   pandasr=   yfinancerI   !sentiment_indicator.core.positionr   __file__resolveparentROOTr\   rU   rH   rZ   r[   	Timedeltar2   rK   rk   __name__ r,   r*   <module>rz      s6    # " " " " "                > > > > > >tH~~&-	h			!	!	(+?	?x%'&03FF	|LBLa0000:::FFQn Qn Qnh zDFFFFF r,   