1
0
Files
finance/财报筛选/选股回测.ipynb
2025-01-15 18:43:23 +08:00

160 lines
5.1 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"id": "initial_id",
"metadata": {
"collapsed": true
},
"source": [
"import pandas as pd\n",
"import tushare as ts\n",
"\n",
"ts_pro = ts.pro_api(token=\"64ebff4fa679167600b905ee45dd88e76f3963c0ff39157f3f085f0e\")"
],
"outputs": [],
"execution_count": null
},
{
"metadata": {},
"cell_type": "code",
"source": [
"sse_df = ts_pro.trade_cal(exchange=\"SSE\")[[\"cal_date\", \"is_open\"]]\n",
"szse_df = ts_pro.trade_cal(exchange=\"SZSE\")[[\"cal_date\", \"is_open\"]]\n",
"merge_df = pd.merge(sse_df, szse_df, on=\"cal_date\", how=\"left\")\n",
"merge_df = merge_df.fillna(value=0)\n",
"merge_df[\"is_open\"] = (merge_df[\"is_open_x\"] + merge_df[\"is_open_y\"]) > 0\n",
"trade_date_df = merge_df[[\"cal_date\", \"is_open\"]]\n",
"trade_date_df"
],
"id": "fe5b7f88c1739a13",
"outputs": [],
"execution_count": null
},
{
"metadata": {},
"cell_type": "code",
"source": [
"import os\n",
"import time\n",
"\n",
"for year in range(1990, 2025):\n",
" target_path = f\"../temp/stk_factor/{year}.csv\"\n",
" # 判断target_path文件是否存在\n",
" if os.path.exists(target_path):\n",
" continue\n",
" result_df = pd.DataFrame()\n",
" for trade_date in trade_date_df[(trade_date_df[\"cal_date\"].str.startswith(f\"{year}\")) & trade_date_df[\"is_open\"]][\n",
" \"cal_date\"].values:\n",
" time.sleep(1)\n",
" print(f\"{trade_date} downloading...\")\n",
" stk_df = ts_pro.stk_factor(trade_date=trade_date)\n",
" result_df = pd.concat([result_df, stk_df])\n",
" result_df.sort_values(by=[\"trade_date\", \"ts_code\"], ascending=True, inplace=True)\n",
" result_df.to_csv(f\"/Users/lanyuanxiaoyao/SynologyDrive/data/Tushare/日线行情/{year}.csv\", index=False)"
],
"id": "bde839364048fb89",
"outputs": [],
"execution_count": null
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-01-14T02:29:02.535840Z",
"start_time": "2025-01-14T02:28:19.578528Z"
}
},
"cell_type": "code",
"source": [
"root = \"/Users/lanyuanxiaoyao/SynologyDrive/data/Tushare/日线行情\"\n",
"\n",
"\n",
"def get_daily_df(start_year, end_year):\n",
" daily_df = pd.read_csv(f\"{root}/{start_year}.csv\")\n",
" for year in range(start_year + 1, end_year + 1):\n",
" daily_df = pd.concat([daily_df, pd.read_csv(f\"{root}/{year}.csv\")])\n",
" return daily_df"
],
"id": "d0701612c56add14",
"outputs": [],
"execution_count": 39
},
{
"metadata": {},
"cell_type": "code",
"outputs": [],
"execution_count": null,
"source": "daily_df = get_daily_df(2019, 2024)",
"id": "ffc7072a7c5a44f9"
},
{
"metadata": {},
"cell_type": "code",
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"\n",
"def is_ascending(code, year):\n",
" daily_df = get_daily_df(year, year)\n",
" daily_df = daily_df[daily_df[\"ts_code\"] == code][[\"trade_date\", \"close_qfq\"]]\n",
" daily_df[\"trade_date\"] = pd.to_datetime(daily_df[\"trade_date\"], format=\"%Y%m%d\")\n",
" daily_df[\"trade_date_timestamp\"] = daily_df[\"trade_date\"].astype(np.int64)\n",
" daily_df.sort_values(by=\"trade_date\", ascending=True, inplace=True)\n",
"\n",
" first = daily_df[daily_df[\"trade_date_timestamp\"] == daily_df[\"trade_date_timestamp\"].min()][\"close_qfq\"].values[0]\n",
" last = daily_df[daily_df[\"trade_date_timestamp\"] == daily_df[\"trade_date_timestamp\"].max()][\"close_qfq\"].values[0]\n",
"\n",
" print(first, last)\n",
"\n",
" coefficients = np.polyfit(daily_df[\"trade_date_timestamp\"], daily_df[\"close_qfq\"], 1)\n",
"\n",
" print(coefficients)\n",
" fn = np.poly1d(coefficients)\n",
" daily_df[\"close_predict\"] = fn(daily_df[\"trade_date_timestamp\"])\n",
"\n",
" plt.figure(figsize=(25, 8))\n",
" plt.scatter(daily_df[\"trade_date\"], daily_df[\"close_qfq\"])\n",
" plt.plot(daily_df[\"trade_date\"], daily_df[\"close_predict\"], color=\"orange\")\n",
"\n",
" plt.gcf().autofmt_xdate()\n",
" plt.show()\n",
"\n",
" return bool((coefficients[0] > 0) and (last > first))\n",
"\n",
"\n",
"print(is_ascending(\"000001.SZ\", 2020))\n",
"print(is_ascending(\"000001.SZ\", 2021))\n",
"print(is_ascending(\"000001.SZ\", 2022))\n",
"print(is_ascending(\"000001.SZ\", 2023))\n",
"print(is_ascending(\"000001.SZ\", 2024))"
],
"id": "e58494f608dcb055",
"outputs": [],
"execution_count": null
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}