456 lines
16 KiB
Plaintext
456 lines
16 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2026-01-30T05:41:51.291397Z",
|
||
"start_time": "2026-01-30T04:34:22.917761Z"
|
||
}
|
||
},
|
||
"cell_type": "code",
|
||
"source": [
|
||
"import urllib.parse\n",
|
||
"\n",
|
||
"import pandas as pd\n",
|
||
"import sqlalchemy\n",
|
||
"from sqlalchemy import text\n",
|
||
"from sqlalchemy.orm import DeclarativeBase, Session\n",
|
||
"\n",
|
||
"postgresql_engin = sqlalchemy.create_engine(\n",
|
||
" f\"postgresql://leopard:{urllib.parse.quote_plus(\"9NEzFzovnddf@PyEP?e*AYAWnCyd7UhYwQK$pJf>7?ccFiN^x4$eKEZ5~E<7<+~X\")}@81.71.3.24:6785/leopard\"\n",
|
||
")\n",
|
||
"sqlite_engine = sqlalchemy.create_engine(f\"sqlite:////Users/lanyuanxiaoyao/Documents/leopard_data/leopard.sqlite\")\n",
|
||
"\n",
|
||
"\n",
|
||
"class Base(DeclarativeBase):\n",
|
||
" pass\n",
|
||
"\n",
|
||
"\n",
|
||
"class Daily(Base):\n",
|
||
" __tablename__ = 'daily'\n",
|
||
"\n",
|
||
" code = sqlalchemy.Column(sqlalchemy.String, primary_key=True)\n",
|
||
" trade_date = sqlalchemy.Column(sqlalchemy.Date, primary_key=True)\n",
|
||
" open = sqlalchemy.Column(sqlalchemy.Double)\n",
|
||
" close = sqlalchemy.Column(sqlalchemy.Double)\n",
|
||
" high = sqlalchemy.Column(sqlalchemy.Double)\n",
|
||
" low = sqlalchemy.Column(sqlalchemy.Double)\n",
|
||
" previous_close = sqlalchemy.Column(sqlalchemy.Double)\n",
|
||
" turnover = sqlalchemy.Column(sqlalchemy.Double)\n",
|
||
" volume = sqlalchemy.Column(sqlalchemy.Integer)\n",
|
||
" price_change_amount = sqlalchemy.Column(sqlalchemy.Double)\n",
|
||
" factor = sqlalchemy.Column(sqlalchemy.Double)\n",
|
||
"\n",
|
||
"\n",
|
||
"try:\n",
|
||
" with Session(postgresql_engin) as pg_session:\n",
|
||
" results = pg_session.execute(text(\"select distinct trade_date from leopard_daily\")).fetchall()\n",
|
||
" results = list(map(lambda x: x[0].strftime(\"%Y-%m-%d\"), results))\n",
|
||
" dates = [results[i: i + 30] for i in range(0, len(results), 30)]\n",
|
||
"\n",
|
||
" for index, date in enumerate(dates):\n",
|
||
" print(date)\n",
|
||
" daily_df = pd.read_sql(\n",
|
||
" f\"\"\"\n",
|
||
" select code,\n",
|
||
" trade_date,\n",
|
||
" open,\n",
|
||
" close,\n",
|
||
" high,\n",
|
||
" low,\n",
|
||
" previous_close,\n",
|
||
" turnover,\n",
|
||
" volume,\n",
|
||
" price_change_amount,\n",
|
||
" factor\n",
|
||
" from leopard_daily d\n",
|
||
" left join leopard_stock s on d.stock_id = s.id\n",
|
||
" where d.trade_date in ('{\"','\".join(date)}')\n",
|
||
" \"\"\",\n",
|
||
" postgresql_engin\n",
|
||
" )\n",
|
||
" with Session(sqlite_engine) as session:\n",
|
||
" rows = []\n",
|
||
" for _, row in daily_df.iterrows():\n",
|
||
" rows.append(\n",
|
||
" Daily(\n",
|
||
" code=row[\"code\"],\n",
|
||
" trade_date=row[\"trade_date\"],\n",
|
||
" open=row[\"open\"],\n",
|
||
" close=row[\"close\"],\n",
|
||
" high=row[\"high\"],\n",
|
||
" low=row[\"low\"],\n",
|
||
" previous_close=row[\"previous_close\"],\n",
|
||
" turnover=row[\"turnover\"],\n",
|
||
" volume=row[\"volume\"],\n",
|
||
" price_change_amount=row[\"price_change_amount\"],\n",
|
||
" factor=row[\"factor\"]\n",
|
||
" )\n",
|
||
" )\n",
|
||
" session.add_all(rows)\n",
|
||
" session.commit()\n",
|
||
"finally:\n",
|
||
" postgresql_engin.dispose()\n",
|
||
" sqlite_engine.dispose()"
|
||
],
|
||
"id": "48821306efc640a1",
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"['2025-12-25', '2025-12-26', '2025-12-29', '2025-12-30', '2025-12-31', '2026-01-05', '2026-01-06', '2026-01-07', '2026-01-08', '2026-01-09']\n"
|
||
]
|
||
}
|
||
],
|
||
"execution_count": 22
|
||
},
|
||
{
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2026-01-30T09:24:09.859231Z",
|
||
"start_time": "2026-01-30T09:24:09.746912Z"
|
||
}
|
||
},
|
||
"cell_type": "code",
|
||
"source": [
|
||
"import tushare as ts\n",
|
||
"\n",
|
||
"pro = ts.pro_api(\"64ebff4fa679167600b905ee45dd88e76f3963c0ff39157f3f085f0e\")\n",
|
||
"# stocks = pro.stock_basic(ts_code=\"600200.SH\", list_status=\"D\", fields=\"ts_code,name,fullname,market,exchange,industry,list_date,delist_date\")\n",
|
||
"# stocks"
|
||
],
|
||
"id": "ed58a1faaf2cdb8e",
|
||
"outputs": [],
|
||
"execution_count": 34
|
||
},
|
||
{
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2026-01-30T07:14:29.897120Z",
|
||
"start_time": "2026-01-30T07:14:29.664124Z"
|
||
}
|
||
},
|
||
"cell_type": "code",
|
||
"source": "# stocks.to_csv(\"dlist.csv\")",
|
||
"id": "3c8c0a38d6b2992e",
|
||
"outputs": [],
|
||
"execution_count": 24
|
||
},
|
||
{
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2026-01-30T09:46:34.808300Z",
|
||
"start_time": "2026-01-30T09:46:34.129412Z"
|
||
}
|
||
},
|
||
"cell_type": "code",
|
||
"source": [
|
||
"daily_df = pro.daily(trade_date=\"20251231\")\n",
|
||
"daily_df.set_index(\"ts_code\", inplace=True)\n",
|
||
"factor_df = pro.adj_factor(trade_date=\"20251231\")\n",
|
||
"factor_df.set_index(\"ts_code\", inplace=True)"
|
||
],
|
||
"id": "c052a945869aa329",
|
||
"outputs": [],
|
||
"execution_count": 50
|
||
},
|
||
{
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2026-01-30T09:46:36.697015Z",
|
||
"start_time": "2026-01-30T09:46:36.642975Z"
|
||
}
|
||
},
|
||
"cell_type": "code",
|
||
"source": [
|
||
"result_df = daily_df.join(factor_df, lsuffix=\"_daily\", rsuffix=\"_factor\", how=\"left\")\n",
|
||
"result_df\n",
|
||
"# factor_df"
|
||
],
|
||
"id": "d61ee80d2cd9f06b",
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
" trade_date_daily open high low close pre_close change \\\n",
|
||
"ts_code \n",
|
||
"000001.SZ 20251231 11.48 11.49 11.40 11.41 11.48 -0.07 \n",
|
||
"000002.SZ 20251231 4.66 4.68 4.62 4.65 4.62 0.03 \n",
|
||
"000004.SZ 20251231 11.30 11.35 11.07 11.08 11.27 -0.19 \n",
|
||
"000006.SZ 20251231 9.95 10.03 9.69 9.95 9.86 0.09 \n",
|
||
"000007.SZ 20251231 11.72 11.75 11.28 11.44 11.62 -0.18 \n",
|
||
"... ... ... ... ... ... ... ... \n",
|
||
"920978.BJ 20251231 37.64 38.39 36.88 36.90 37.78 -0.88 \n",
|
||
"920981.BJ 20251231 32.20 32.29 31.75 31.96 32.07 -0.11 \n",
|
||
"920982.BJ 20251231 233.00 238.49 232.10 233.70 234.80 -1.10 \n",
|
||
"920985.BJ 20251231 7.32 7.35 7.17 7.19 7.30 -0.11 \n",
|
||
"920992.BJ 20251231 17.33 17.60 17.29 17.39 17.38 0.01 \n",
|
||
"\n",
|
||
" pct_chg vol amount trade_date_factor adj_factor \n",
|
||
"ts_code \n",
|
||
"000001.SZ -0.6098 590620.37 675457.357 20251231 134.5794 \n",
|
||
"000002.SZ 0.6494 1075561.25 499883.113 20251231 181.7040 \n",
|
||
"000004.SZ -1.6859 18056.00 20248.567 20251231 4.0640 \n",
|
||
"000006.SZ 0.9128 270369.08 267758.676 20251231 39.7400 \n",
|
||
"000007.SZ -1.5491 80556.00 92109.366 20251231 8.2840 \n",
|
||
"... ... ... ... ... ... \n",
|
||
"920978.BJ -2.3293 33945.04 126954.937 20251231 1.2885 \n",
|
||
"920981.BJ -0.3430 8237.16 26301.206 20251231 1.4343 \n",
|
||
"920982.BJ -0.4685 5210.09 122452.646 20251231 4.2831 \n",
|
||
"920985.BJ -1.5068 35174.30 25350.257 20251231 1.6280 \n",
|
||
"920992.BJ 0.0575 6991.87 12193.445 20251231 1.4932 \n",
|
||
"\n",
|
||
"[5458 rows x 12 columns]"
|
||
],
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>trade_date_daily</th>\n",
|
||
" <th>open</th>\n",
|
||
" <th>high</th>\n",
|
||
" <th>low</th>\n",
|
||
" <th>close</th>\n",
|
||
" <th>pre_close</th>\n",
|
||
" <th>change</th>\n",
|
||
" <th>pct_chg</th>\n",
|
||
" <th>vol</th>\n",
|
||
" <th>amount</th>\n",
|
||
" <th>trade_date_factor</th>\n",
|
||
" <th>adj_factor</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>ts_code</th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>000001.SZ</th>\n",
|
||
" <td>20251231</td>\n",
|
||
" <td>11.48</td>\n",
|
||
" <td>11.49</td>\n",
|
||
" <td>11.40</td>\n",
|
||
" <td>11.41</td>\n",
|
||
" <td>11.48</td>\n",
|
||
" <td>-0.07</td>\n",
|
||
" <td>-0.6098</td>\n",
|
||
" <td>590620.37</td>\n",
|
||
" <td>675457.357</td>\n",
|
||
" <td>20251231</td>\n",
|
||
" <td>134.5794</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>000002.SZ</th>\n",
|
||
" <td>20251231</td>\n",
|
||
" <td>4.66</td>\n",
|
||
" <td>4.68</td>\n",
|
||
" <td>4.62</td>\n",
|
||
" <td>4.65</td>\n",
|
||
" <td>4.62</td>\n",
|
||
" <td>0.03</td>\n",
|
||
" <td>0.6494</td>\n",
|
||
" <td>1075561.25</td>\n",
|
||
" <td>499883.113</td>\n",
|
||
" <td>20251231</td>\n",
|
||
" <td>181.7040</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>000004.SZ</th>\n",
|
||
" <td>20251231</td>\n",
|
||
" <td>11.30</td>\n",
|
||
" <td>11.35</td>\n",
|
||
" <td>11.07</td>\n",
|
||
" <td>11.08</td>\n",
|
||
" <td>11.27</td>\n",
|
||
" <td>-0.19</td>\n",
|
||
" <td>-1.6859</td>\n",
|
||
" <td>18056.00</td>\n",
|
||
" <td>20248.567</td>\n",
|
||
" <td>20251231</td>\n",
|
||
" <td>4.0640</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>000006.SZ</th>\n",
|
||
" <td>20251231</td>\n",
|
||
" <td>9.95</td>\n",
|
||
" <td>10.03</td>\n",
|
||
" <td>9.69</td>\n",
|
||
" <td>9.95</td>\n",
|
||
" <td>9.86</td>\n",
|
||
" <td>0.09</td>\n",
|
||
" <td>0.9128</td>\n",
|
||
" <td>270369.08</td>\n",
|
||
" <td>267758.676</td>\n",
|
||
" <td>20251231</td>\n",
|
||
" <td>39.7400</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>000007.SZ</th>\n",
|
||
" <td>20251231</td>\n",
|
||
" <td>11.72</td>\n",
|
||
" <td>11.75</td>\n",
|
||
" <td>11.28</td>\n",
|
||
" <td>11.44</td>\n",
|
||
" <td>11.62</td>\n",
|
||
" <td>-0.18</td>\n",
|
||
" <td>-1.5491</td>\n",
|
||
" <td>80556.00</td>\n",
|
||
" <td>92109.366</td>\n",
|
||
" <td>20251231</td>\n",
|
||
" <td>8.2840</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>920978.BJ</th>\n",
|
||
" <td>20251231</td>\n",
|
||
" <td>37.64</td>\n",
|
||
" <td>38.39</td>\n",
|
||
" <td>36.88</td>\n",
|
||
" <td>36.90</td>\n",
|
||
" <td>37.78</td>\n",
|
||
" <td>-0.88</td>\n",
|
||
" <td>-2.3293</td>\n",
|
||
" <td>33945.04</td>\n",
|
||
" <td>126954.937</td>\n",
|
||
" <td>20251231</td>\n",
|
||
" <td>1.2885</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>920981.BJ</th>\n",
|
||
" <td>20251231</td>\n",
|
||
" <td>32.20</td>\n",
|
||
" <td>32.29</td>\n",
|
||
" <td>31.75</td>\n",
|
||
" <td>31.96</td>\n",
|
||
" <td>32.07</td>\n",
|
||
" <td>-0.11</td>\n",
|
||
" <td>-0.3430</td>\n",
|
||
" <td>8237.16</td>\n",
|
||
" <td>26301.206</td>\n",
|
||
" <td>20251231</td>\n",
|
||
" <td>1.4343</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>920982.BJ</th>\n",
|
||
" <td>20251231</td>\n",
|
||
" <td>233.00</td>\n",
|
||
" <td>238.49</td>\n",
|
||
" <td>232.10</td>\n",
|
||
" <td>233.70</td>\n",
|
||
" <td>234.80</td>\n",
|
||
" <td>-1.10</td>\n",
|
||
" <td>-0.4685</td>\n",
|
||
" <td>5210.09</td>\n",
|
||
" <td>122452.646</td>\n",
|
||
" <td>20251231</td>\n",
|
||
" <td>4.2831</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>920985.BJ</th>\n",
|
||
" <td>20251231</td>\n",
|
||
" <td>7.32</td>\n",
|
||
" <td>7.35</td>\n",
|
||
" <td>7.17</td>\n",
|
||
" <td>7.19</td>\n",
|
||
" <td>7.30</td>\n",
|
||
" <td>-0.11</td>\n",
|
||
" <td>-1.5068</td>\n",
|
||
" <td>35174.30</td>\n",
|
||
" <td>25350.257</td>\n",
|
||
" <td>20251231</td>\n",
|
||
" <td>1.6280</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>920992.BJ</th>\n",
|
||
" <td>20251231</td>\n",
|
||
" <td>17.33</td>\n",
|
||
" <td>17.60</td>\n",
|
||
" <td>17.29</td>\n",
|
||
" <td>17.39</td>\n",
|
||
" <td>17.38</td>\n",
|
||
" <td>0.01</td>\n",
|
||
" <td>0.0575</td>\n",
|
||
" <td>6991.87</td>\n",
|
||
" <td>12193.445</td>\n",
|
||
" <td>20251231</td>\n",
|
||
" <td>1.4932</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>5458 rows × 12 columns</p>\n",
|
||
"</div>"
|
||
]
|
||
},
|
||
"execution_count": 51,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"execution_count": 51
|
||
}
|
||
],
|
||
"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
|
||
}
|