版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
2025年Python金融量化分析模擬試卷技術實戰考試時間:______分鐘總分:______分姓名:______第一題假設你已經通過某種方式獲取了以下格式的股票日頻數據(存為`stock_data.csv`文件),其中包含股票代碼(`code`)、日期(`date`)、開盤價(`open`)、最高價(`high`)、最低價(`low`)、收盤價(`close`)和成交量(`volume`)。```csvcode,date,open,high,low,close,volume000001,2023-01-01,10.00,10.50,9.80,10.20,100000000001,2023-01-02,10.20,10.60,10.10,10.40,120000000001,2023-01-03,10.40,10.70,10.30,10.50,150000...(更多數據)```請編寫Python代碼,完成以下任務:1.讀取`stock_data.csv`文件到`pandas`的`DataFrame`對象`df`中。2.將`date`列轉換為`datetime`類型,并將其設置為`DataFrame`的索引。3.計算每日的日收益率(使用收盤價計算,`rtn=(close-previous_close)/previous_close`),并將結果作為新的列`daily_rtn`添加到`df`中。注意處理第一個交易日的收益率計算(可以設置為0或NaN,需明確說明)。4.篩選出`daily_rtn`大于0.05的交易日,并打印出這些交易日的日期和對應的`daily_rtn`值。5.計算并打印出該股票總成交量(`volume`列的總和)。6.計算并打印出該股票日收益率的標準差。第二題繼續使用上一題的`DataFrame`對象`df`。假設你想分析該股票的價格趨勢和波動性。請編寫Python代碼,完成以下任務:1.使用`Matplotlib`繪制該股票的收盤價隨時間變化的折線圖。圖表應包含清晰的標題、X軸標簽(日期)和Y軸標簽(收盤價)。2.在同一張圖上,繪制該股票的日收益率隨時間變化的折線圖,使用不同的顏色或線型區分。圖表應有圖例說明兩條線的含義。3.使用`pandas`的內置函數,計算并繪制該股票的簡單移動平均線(SMA),設置窗口期為5天和20天。在折線圖上疊加這兩條SMA線,使用不同的顏色。圖表應有圖例說明三條線的含義。第三題假設你想為該股票構建一個簡單的技術分析交易策略。策略規則如下:*買入信號:當5日SMA(已計算,存儲在`sma5`列)上穿20日SMA(已計算,存儲在`sma20`列)時,生成買入信號。*賣出信號:當5日SMA下穿20日SMA時,生成賣出信號。請編寫Python代碼,完成以下任務:1.在`df`中添加兩列`signal`和`action`。*`signal`列:當5日SMA上穿20日SMA時,值為`'buy'`;下穿時,值為`'sell'`;其他情況為`'hold'`。*`action`列:只有當`signal`列的值發生變化時(相對于前一交易日),才記錄`'buy'`、`'sell'`或`'hold'`。例如,如果`signal`序列是`['hold','buy','hold','sell','hold']`,則`action`序列應是`['hold','buy','hold','sell','hold']`(第一個`'buy'`是買入信號,`'sell'`是賣出信號)。2.篩選出`action`列不為`'hold'`的行(即買入或賣出的交易日),并按日期排序。3.打印出這些買入和賣出的交易日、對應的`action`值、當日的`daily_rtn`以及當時的`sma5`和`sma20`值。第四題請編寫Python代碼,對第三題構建的簡單交易策略進行回測。1.假設初始投資額為100,000元。2.模擬根據`action`列的信號進行交易:*當`action`為`'buy'`時,用所有可用資金買入股票,計算買入的股數(`shares=funds/close_price`)。*當`action`為`'sell'`時,賣出所有持有的股票,計算賣出后的資金余額(`funds=funds+shares*close_price`)。3.忽略交易成本。4.每日結束時,根據當日的收盤價(`close`)計算持有股票的價值(`holding_value=shares*close_price`),更新總資產價值(`total_value=funds+holding_value`)。5.將每日的日期、投資組合總價值(`total_value`)、可用資金(`funds`)和持有股票價值(`holding_value`)存儲到一個新的`pandas``DataFrame`對象`backtest_df`中。6.繪制`backtest_df`中的`total_value`隨時間變化的折線圖。圖表應有清晰的標題、X軸標簽(日期)和Y軸標簽(總價值)。第五題假設你想使用機器學習方法預測該股票的日收益率。請編寫Python代碼,完成以下任務:1.從`df`中創建一個新的特征列`lag1_rtn`,表示滯后1天的日收益率(即`daily_rtn`的上一行值)。注意處理第一個交易日的`lag1_rtn`(可以設置為0或NaN)。2.為了簡化模型訓練,篩選出`df`中`lag1_rtn`和`daily_rtn`都非NaN的行,并將這些行存儲到一個新的`DataFrame`對象`train_data`中。3.從`train_data`中,將`lag1_rtn`作為特征(X),將`daily_rtn`作為目標變量(y)。4.使用`Scikit-learn`的`train_test_split`函數,將數據隨機劃分為訓練集和測試集,比例分別為80%和20%。設置`random_state=42`以確保結果可復現。5.使用`Scikit-learn`中的`LinearRegression`模型,在訓練集上擬合線性回歸模型。6.在測試集上,使用擬合好的模型預測`daily_rtn`。7.計算并打印出測試集上模型預測值與實際值之間的均方誤差(MSE)。試卷答案第一題```pythonimportpandasaspd#1.讀取數據df=pd.read_csv('stock_data.csv')#2.轉換日期索引df['date']=pd.to_datetime(df['date'])df.set_index('date',inplace=True)#3.計算日收益率df['previous_close']=df['close'].shift(1)df['daily_rtn']=(df['close']-df['previous_close'])/df['previous_close']#或者:df['daily_rtn']=df['close'].pct_change()#第一個值設為0df['daily_rtn'].iloc[0]=0.0#或者df['daily_rtn'].iloc[0]=pd.NA#4.篩選收益率大于0.05的交易日rtn_positive=df[df['daily_rtn']>0.05]print(rtn_positive[['daily_rtn']])#5.計算總成交量total_volume=df['volume'].sum()print(total_volume)#6.計算日收益率標準差rtn_std=df['daily_rtn'].std()print(rtn_std)```解析思路:1.使用`pandas.read_csv`讀取CSV文件到`DataFrame`。2.使用`pd.to_datetime`將`date`列轉換為`datetime`類型,然后用`set_index`設置為索引。3.使用`shift(1)`獲取上一行的收盤價作為`previous_close`列。計算日收益率`daily_rtn`。第一個交易日的收益率由于沒有前一日數據,通常設為0或NaN,這里設為0。也可以直接使用`pct_change()`方法計算百分比變化。4.使用布爾索引`df['daily_rtn']>0.05`篩選出滿足條件的行,并選擇`daily_rtn`列打印。5.使用`sum()`函數對`volume`列進行求和,得到總成交量。6.使用`std()`函數計算`daily_rtn`列的標準差,衡量收益率的波動性。第二題```pythonimportmatplotlib.pyplotasplt#1.繪制收盤價折線圖plt.figure(figsize=(12,6))plt.plot(df.index,df['close'],label='ClosePrice',color='blue')#2.繪制日收益率折線圖plt.plot(df.index,df['daily_rtn'],label='DailyReturn',color='red',alpha=0.7)#3.繪制SMAdf['sma5']=df['close'].rolling(window=5).mean()df['sma20']=df['close'].rolling(window=20).mean()plt.plot(df.index,df['sma5'],label='SMA5',color='green')plt.plot(df.index,df['sma20'],label='SMA20',color='purple')#添加圖表元素plt.title('StockPriceandReturns')plt.xlabel('Date')plt.ylabel('Value')plt.legend()plt.grid(True)plt.show()```解析思路:1.使用`plt.plot`繪制`df.index`(X軸,日期)和`df['close']`(Y軸,收盤價),設置標簽和顏色。2.使用`plt.plot`再次繪制`df.index`和`df['daily_rtn']`,使用不同顏色并設置透明度。3.使用`rolling`方法分別計算5天和20天的收盤價移動平均線(SMA),存儲到新列`sma5`和`sma20`中。然后分別用`plt.plot`繪制這兩條線。4.使用`plt.title`,`plt.xlabel`,`plt.ylabel`添加標題和軸標簽。5.使用`plt.legend`添加圖例,區分不同線條。6.使用`plt.grid(True)`添加網格線,使用`plt.show()`顯示圖表。第三題```python#1.添加signal和action列df['sma5']=df['close'].rolling(window=5).mean()df['sma20']=df['close'].rolling(window=20).mean()condition=df['sma5']>df['sma20']df['signal']='buy'df.loc[~condition,'signal']='sell'df.loc[condition&df['sma5'].shift(1)<=df['sma20'].shift(1),'signal']='hold'df.loc[~condition&df['sma5'].shift(1)>df['sma20'].shift(1),'signal']='hold'df['action']=df['signal']df['action'][df['action']!=df['action'].shift(1)]=df['signal'][df['action']!=df['action'].shift(1)]#2.篩選非hold的行動action_df=df[df['action']!='hold'].sort_index()#3.打印相關信息print(action_df[['action','daily_rtn','sma5','sma20']])```解析思路:1.首先計算`sma5`和`sma20`列。2.初始化`signal`列。使用條件`df['sma5']>df['sma20']`創建一個布爾序列`condition`。根據`condition`設置`signal`列的初始值。3.為了區分“首次交叉”和“反向交叉”,需要比較當前周期和上一周期的SMA狀態。對于買入信號(`'buy'`),需要滿足當前`sma5>sma20`且上一周期`sma5<=sma20`。對于賣出信號(`'sell'`)同理,但方向相反。對于保持持有(`'hold'`),需要滿足信號未發生變化的條件。使用`shift(1)`獲取上一周期的值進行比較,并更新`signal`列。4.初始化`action`列為`signal`列的值。然后,使用`shift(1)`比較當前`action`與上一行的`action`,如果不同,則更新`action`列為當前的`signal`值。這樣,`action`列只記錄信號發生變化的交易日。5.使用布爾索引`df['action']!='hold'`篩選出非持有的交易日,并使用`sort_index()`按日期排序。6.打印出這些行動日期及其對應的`action`,`daily_rtn`,`sma5`,`sma20`列。第四題```python#初始化funds=100000shares=0.0total_value=fundsbacktest_df=pd.DataFrame(columns=['date','total_value','funds','holding_value'])#模擬交易回測fordate,rowindf.iterrows():ifpd.notna(row['action']):#前一天的總價值prev_total_value=total_value#如果是買入ifrow['action']=='buy':shares=funds/row['close']funds=0.0#如果是賣出elifrow['action']=='sell':funds=shares*row['close']shares=0.0#計算當天的總價值和持有股票價值holding_value=shares*row['close']total_value=funds+holding_valueelse:#沒有行動,價值按前一天計算holding_value=shares*row['close']total_value=funds+holding_value#存儲回測數據backtest_df=backtest_df.append({'date':date,'total_value':total_value,'funds':funds,'holding_value':holding_value},ignore_index=True)#繪制總價值曲線plt.figure(figsize=(12,6))plt.plot(backtest_df['date'],backtest_df['total_value'],label='PortfolioTotalValue',color='black')plt.title('Backtest-PortfolioTotalValueOverTime')plt.xlabel('Date')plt.ylabel('TotalValue(CNY)')plt.legend()plt.grid(True)plt.show()```解析思路:1.初始化投資總額`funds`為100,000,持股數量`shares`為0,初始總資產價值`total_value`等于`funds`。創建一個空的`DataFrame``backtest_df`用于存儲回測結果。2.遍歷`df`的每一行(按日期排序),獲取當前日期`date`和行數據`row`。3.檢查當前行是否有`action`(即不是`'hold'`)。如果有:*記錄前一天的總價值`prev_total_value`(用于后續計算收益)。*根據行動類型執行交易:*買入:用所有`funds`買入股票,計算能買的股數`shares`,將`funds`設為0。*賣出:賣出所有股票,計算賣出后的`funds`,將`shares`設為0。*計算當前持有股票的價值`holding_value`。*更新總資產價值`total_value`為`funds`加上`holding_value`。4.如果當前行沒有行動(`action`為`'hold'`):*總價值`total_value`就是`funds`加上當前持有的股票價值`holding_value`(持股數量`shares`不變)。5.將當天的日期、總價值、可用資金和持有股票價值添加到`backtest_df`中。6.遍歷結束后,使用`plt.plot`繪制`backtest_df`中的`date`和`total_value`,展示投資組合總價值隨時間的變化。添加圖表標題、軸標簽、圖例和網格線。第五題```pythonfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLinearRegressionfromsklearn.metricsimportmean_squared_error#1.創建滯后收益率特征df['lag1_rtn']=df['daily_rtn'].shift(1)df.dropna(subs
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2026學年西寧市高考生物一模試卷含解析
- 2026屆云南省曲靖市高考全國統考預測密卷生物試卷含解析
- 教育投入結構、產業結構與經濟增長質量
- 市場推廣團隊新設備采購申請通知函4篇
- 核心素養視域下高中化學生活化教學策略研究
- 地質勘探數據分析師績效考核表
- 2026河北新業態企業服務有限公司社會招聘8人筆試模擬試題及答案詳解
- 農業領域農場經理作物管理及市場開發效果績效衡量表
- 2026貴州省衛生健康委選聘貴州健康報傳媒有限責任公司總編輯1人筆試參考題庫及答案詳解
- 2026貴州畢節職業技術學院“銀齡教師”招募25人筆試備考題庫及答案詳解
- GB 44721-2026智能網聯汽車自動駕駛系統安全要求
- 2026年浙江中考(語文)真題帶答案
- 2026年醫師定期考核考試題庫及答案
- 2026年重慶市渝中區中考二模語文試卷
- 2026-2030軌道鋼產業市場深度調研及發展趨勢與投資前景研究報告
- 2026光纖氧氣傳感在煤礦安全監測中的推廣應用報告
- 灼口湯治療灼口綜合征的臨床觀察與療效探究
- 2025年英語六級翻譯真題與模擬試卷
- 高血壓病基層診療指南
- 汽車公告查詢手機版
- 《刮痧肩周炎》課件
評論
0/150
提交評論