1
0

Compare commits

...

11 Commits

Author SHA1 Message Date
df02782e8b 补充计算 2025-01-11 20:18:34 +08:00
3dcbab3909 补充计算 2025-01-10 17:27:24 +08:00
0dccacc0e2 增加金字塔选股规则 2025-01-09 18:11:36 +08:00
db713cb3b3 增加prophet 2025-01-09 18:11:29 +08:00
841630f9f1 增加B站跟学课程代码 2025-01-09 18:11:24 +08:00
5bf89d448d 增加数据采集操作 2025-01-09 18:11:11 +08:00
6e1e888606 使用样例数据尝试计算MACD 2025-01-09 18:11:09 +08:00
e15a5d41f9 尝试保存增量数据 2025-01-09 18:11:04 +08:00
4e792432c1 调试AkShare数据来源 2025-01-09 18:10:58 +08:00
a1e99ea5f7 安装常用依赖 2025-01-09 18:10:42 +08:00
8dcab5711e 初始化项目 2025-01-09 18:10:09 +08:00
9 changed files with 16303 additions and 6415 deletions

51
.idea/csv-editor.xml generated Normal file
View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CsvFileAttributes">
<option name="attributeMap">
<map>
<entry key="/document/ETF信息.csv">
<value>
<Attribute>
<option name="separator" value="," />
</Attribute>
</value>
</entry>
<entry key="/document/SZ000001.csv">
<value>
<Attribute>
<option name="separator" value="," />
</Attribute>
</value>
</entry>
<entry key="/document/Tushare股票信息.csv">
<value>
<Attribute>
<option name="separator" value="," />
</Attribute>
</value>
</entry>
<entry key="/document/指数基金信息.csv">
<value>
<Attribute>
<option name="separator" value="," />
</Attribute>
</value>
</entry>
<entry key="/document/新浪股票代码信息.csv">
<value>
<Attribute>
<option name="separator" value="," />
</Attribute>
</value>
</entry>
<entry key="/temp/stock/SZ000001.csv">
<value>
<Attribute>
<option name="separator" value="," />
</Attribute>
</value>
</entry>
</map>
</option>
</component>
</project>

34
.idea/dataSources.xml generated Normal file
View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="root@frp-air.top" uuid="4e00be9e-f73a-422f-aed0-c30816ad52aa">
<driver-ref>mysql.8</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>com.mysql.cj.jdbc.Driver</jdbc-driver>
<jdbc-url>jdbc:mysql://frp-air.top:43458/</jdbc-url>
<jdbc-additional-properties>
<property name="com.intellij.clouds.kubernetes.db.enabled" value="false" />
<property name="com.intellij.clouds.kubernetes.db.resource.type" value="Deployment" />
</jdbc-additional-properties>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
<data-source source="LOCAL" name="stock@frp-air.top" uuid="b5271197-5b8f-4c47-8580-243d89b63880">
<driver-ref>mysql.8</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>com.mysql.cj.jdbc.Driver</jdbc-driver>
<jdbc-url>jdbc:mysql://frp-air.top:43458/stock</jdbc-url>
<jdbc-additional-properties>
<property name="com.intellij.clouds.kubernetes.db.enabled" value="false" />
<property name="com.intellij.clouds.kubernetes.db.resource.type" value="Deployment" />
</jdbc-additional-properties>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
<data-source source="LOCAL" name="main@localhost" uuid="599837aa-a91c-4b7c-86be-08cddda134a2">
<driver-ref>mysql.8</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>com.mysql.cj.jdbc.Driver</jdbc-driver>
<jdbc-url>jdbc:mysql://localhost:3307/main</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>

8
.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/stock_leanrning.iml" filepath="$PROJECT_DIR$/.idea/stock_leanrning.iml" />
</modules>
</component>
</project>

View File

@@ -0,0 +1,725 @@
{
"cells": [
{
"cell_type": "code",
"id": "initial_id",
"metadata": {
"collapsed": true,
"ExecuteTime": {
"end_time": "2025-01-11T03:30:00.044697Z",
"start_time": "2025-01-11T03:30:00.041372Z"
}
},
"source": [
"import pandas as pd\n",
"import tushare as ts\n",
"\n",
"ts_pro = ts.pro_api(token=\"64ebff4fa679167600b905ee45dd88e76f3963c0ff39157f3f085f0e\")"
],
"outputs": [],
"execution_count": 25
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-01-09T06:28:32.524630Z",
"start_time": "2025-01-09T06:27:15.688831Z"
}
},
"cell_type": "code",
"source": [
"# 从1989年开始循环年份\n",
"for year in range(2000, 2024):\n",
" # ts_pro.balancesheet_vip(period=f\"{year}1231\").to_csv(f\"../temp/财务报表/资产负债表/{year}.csv\")\n",
" # ts_pro.cashflow_vip(period=f\"{year}1231\").to_csv(f\"../temp/财务报表/现金流量表/{year}.csv\")\n",
" # ts_pro.income_vip(period=f\"{year}1231\").to_csv(f\"../temp/财务报表/利润表/{year}.csv\")\n",
" ts_pro.fina_indicator_vip(period=f\"{year}1231\").to_csv(f\"../temp/财务报表/财务指标/{year}.csv\")\n",
" # ts_pro.fina_audit(period=f\"{year}1231\").to_csv(f\"../temp/财务报表/审计意见/{year}.csv\")"
],
"id": "b03b118c70b21315",
"outputs": [],
"execution_count": 15
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-01-10T03:01:43.076024Z",
"start_time": "2025-01-10T03:01:42.644700Z"
}
},
"cell_type": "code",
"source": [
"df_income = ts_pro.income(ts_code=\"600519.SH\", period=\"20231231\", fields=\"ts_code,end_date,n_income\")\n",
"df_balancesheet = ts_pro.balancesheet(ts_code=\"600519.SH\", period=\"20231231\",\n",
" fields=\"ts_code,end_date,total_hldr_eqy_exc_min_int\")\n",
"merged_df = pd.merge(df_income, df_balancesheet, on=['ts_code', 'end_date'])\n",
"merged_df['roe'] = merged_df['n_income'] / merged_df['total_hldr_eqy_exc_min_int']\n",
"merged_df"
],
"id": "575590399bf15e70",
"outputs": [
{
"data": {
"text/plain": [
" ts_code end_date n_income total_hldr_eqy_exc_min_int roe\n",
"0 600519.SH 20231231 7.752148e+10 2.156686e+11 0.359447"
],
"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>ts_code</th>\n",
" <th>end_date</th>\n",
" <th>n_income</th>\n",
" <th>total_hldr_eqy_exc_min_int</th>\n",
" <th>roe</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>600519.SH</td>\n",
" <td>20231231</td>\n",
" <td>7.752148e+10</td>\n",
" <td>2.156686e+11</td>\n",
" <td>0.359447</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 31
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-01-10T02:59:32.764968Z",
"start_time": "2025-01-10T02:59:32.601657Z"
}
},
"cell_type": "code",
"source": "ts_pro.fina_indicator(ts_code=\"600519.SH\", period=\"20231231\")[\"roe\"]",
"id": "d59f62a613379fbd",
"outputs": [
{
"data": {
"text/plain": [
"0 36.1755\n",
"Name: roe, dtype: float64"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 26
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-01-10T04:01:33.511246Z",
"start_time": "2025-01-10T04:01:33.382955Z"
}
},
"cell_type": "code",
"source": "ts_pro.income(ts_code='600519.SH', start_date='20220101', end_date='20241231', fields='end_date,n_income')",
"id": "c43925cfb5552cd9",
"outputs": [
{
"data": {
"text/plain": [
" end_date n_income\n",
"0 20240930 6.303146e+10\n",
"1 20240630 4.317691e+10\n",
"2 20240331 2.488235e+10\n",
"3 20231231 7.752148e+10\n",
"4 20230930 5.482717e+10\n",
"5 20230630 3.733197e+10\n",
"6 20230331 2.152473e+10\n",
"7 20221231 6.537514e+10\n",
"8 20221231 6.537514e+10\n",
"9 20220930 4.631399e+10\n",
"10 20220630 3.110536e+10\n",
"11 20220331 1.795212e+10\n",
"12 20211231 5.572053e+10\n",
"13 20211231 5.572053e+10"
],
"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>end_date</th>\n",
" <th>n_income</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>20240930</td>\n",
" <td>6.303146e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>20240630</td>\n",
" <td>4.317691e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>20240331</td>\n",
" <td>2.488235e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>20231231</td>\n",
" <td>7.752148e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>20230930</td>\n",
" <td>5.482717e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>20230630</td>\n",
" <td>3.733197e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>20230331</td>\n",
" <td>2.152473e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>20221231</td>\n",
" <td>6.537514e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>20221231</td>\n",
" <td>6.537514e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>20220930</td>\n",
" <td>4.631399e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>20220630</td>\n",
" <td>3.110536e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>20220331</td>\n",
" <td>1.795212e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>20211231</td>\n",
" <td>5.572053e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>20211231</td>\n",
" <td>5.572053e+10</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 40
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-01-10T04:17:56.196027Z",
"start_time": "2025-01-10T04:17:55.879469Z"
}
},
"cell_type": "code",
"source": [
"# 获取净利润\n",
"income_df = ts_pro.income(ts_code='600519.SH', start_date='20220101', end_date='20241231', fields='end_date,n_income')\n",
"net_profit = income_df[income_df['end_date'] == '20231231']['n_income'].values[0]\n",
"\n",
"# 获取期初和期末的股东权益和总资产\n",
"balancesheet_df = ts_pro.balancesheet(ts_code='600519.SH', start_date='20220101', end_date='20241231',\n",
" fields='end_date,total_hldr_eqy_exc_min_int,total_assets')\n",
"eqy_initial = balancesheet_df[balancesheet_df['end_date'] == '20230331']['total_hldr_eqy_exc_min_int'].values[0]\n",
"eqy_final = balancesheet_df[balancesheet_df['end_date'] == '20231231']['total_hldr_eqy_exc_min_int'].values[0]\n",
"total_assets_initial = balancesheet_df[balancesheet_df['end_date'] == '20230331']['total_assets'].values[0]\n",
"total_assets_final = balancesheet_df[balancesheet_df['end_date'] == '20231231']['total_assets'].values[0]\n",
"\n",
"# 计算平均股东权益和平均总资产\n",
"avg_eqy = (eqy_initial + eqy_final) / 2\n",
"avg_assets = (total_assets_initial + total_assets_final) / 2\n",
"\n",
"# 计算ROE和ROA\n",
"roe = net_profit / avg_eqy\n",
"roa = net_profit / avg_assets\n",
"\n",
"print(f'ROE: {roe:.4f}')\n",
"print(f'ROA: {roa:.4f}')"
],
"id": "caf1a1555d4c972e",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ROE: 0.3573\n",
"ROA: 0.2919\n"
]
}
],
"execution_count": 43
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-01-10T04:19:57.750533Z",
"start_time": "2025-01-10T04:19:57.531524Z"
}
},
"cell_type": "code",
"source": [
"# 获取营业收入净额\n",
"income_df = ts_pro.income(ts_code='600519.SH', start_date='20220101', end_date='20241231', fields='end_date,revenue')\n",
"revenue = income_df[income_df['end_date'] == '20231231']['revenue'].values[0]\n",
"\n",
"# 获取期初上一年12月31日和期末当前年12月31日的总资产\n",
"balancesheet_df = ts_pro.balancesheet(ts_code='600519.SH', start_date='20220101', end_date='20241231',\n",
" fields='end_date,total_assets')\n",
"total_assets_initial = balancesheet_df[balancesheet_df['end_date'] == '20221231']['total_assets'].values[0]\n",
"total_assets_final = balancesheet_df[balancesheet_df['end_date'] == '20231231']['total_assets'].values[0]\n",
"\n",
"# 计算平均总资产\n",
"avg_assets = (total_assets_initial + total_assets_final) / 2\n",
"\n",
"# 计算总资产周转率\n",
"total_asset_turnover = revenue / avg_assets\n",
"\n",
"print(f'总资产周转率: {total_asset_turnover:.4f}')"
],
"id": "49488c6640beb4ed",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"总资产周转率: 0.5604\n"
]
}
],
"execution_count": 48
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-01-10T04:23:50.762070Z",
"start_time": "2025-01-10T04:23:50.585818Z"
}
},
"cell_type": "code",
"source": [
"# 获取期末的现金及现金等价物和总资产\n",
"balancesheet_df = ts_pro.balancesheet(ts_code='600519.SH', start_date='20220101', end_date='20241231',\n",
" fields='end_date, money_cap, total_assets')\n",
"cash_and_equivalents = balancesheet_df[balancesheet_df['end_date'] == '20231231']['money_cap'].values[0]\n",
"total_assets = balancesheet_df[balancesheet_df['end_date'] == '20231231']['total_assets'].values[0]\n",
"\n",
"# 计算现金和现金等价物总和占总资产的比率\n",
"cash_ratio = cash_and_equivalents / total_assets\n",
"\n",
"print(f'现金和现金等价物总和占总资产的比率: {cash_ratio:.4f}')"
],
"id": "526ef46373e1c8fe",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"现金和现金等价物总和占总资产的比率: 0.2533\n"
]
}
],
"execution_count": 49
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-01-10T04:27:11.461667Z",
"start_time": "2025-01-10T04:27:11.160878Z"
}
},
"cell_type": "code",
"source": [
"# 获取营业收入\n",
"income_df = ts_pro.income(ts_code='600519.SH', start_date='20220101', end_date='20241231', fields='end_date, revenue')\n",
"revenue = income_df[income_df['end_date'] == '20231231']['revenue'].values[0]\n",
"\n",
"# 获取期初和期末的应收账款\n",
"balancesheet_df = ts_pro.balancesheet(ts_code='600519.SH', start_date='20220101', end_date='20241231',\n",
" fields='end_date, accounts_receiv')\n",
"accounts_receiv_initial = balancesheet_df[balancesheet_df['end_date'] == '20221231']['accounts_receiv'].values[0]\n",
"accounts_receiv_final = balancesheet_df[balancesheet_df['end_date'] == '20231231']['accounts_receiv'].values[0]\n",
"\n",
"# 计算平均应收账款余额\n",
"avg_accounts_receiv = (accounts_receiv_initial + accounts_receiv_final) / 2\n",
"\n",
"# 计算应收账款周转率\n",
"accounts_receiv_turnover = revenue / avg_accounts_receiv\n",
"\n",
"# 计算收现日数\n",
"collection_period = 365 / accounts_receiv_turnover\n",
"\n",
"print(f'收现日数: {collection_period:.2f} 天')"
],
"id": "dca87ef21cf425ee",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"收现日数: 0.10 天\n"
]
}
],
"execution_count": 50
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-01-10T07:10:09.564888Z",
"start_time": "2025-01-10T07:10:08.771019Z"
}
},
"cell_type": "code",
"source": [
"code = \"000672.SZ\"\n",
"year = \"2023\"\n",
"period = f\"{year}1231\"\n",
"last_period = f\"{int(year) - 1}1231\"\n",
"\n",
"balancesheet_fields = \"total_assets,total_hldr_eqy_inc_min_int,money_cap,accounts_receiv,inventories\"\n",
"balancesheet_df = ts_pro.balancesheet(ts_code=code, period=period, fields=balancesheet_fields)\n",
"last_balancesheet_df = ts_pro.balancesheet(ts_code=code, period=last_period, fields=balancesheet_fields)\n",
"\n",
"income_fields = \"n_income,revenue,total_revenue,oper_cost,operate_profit,total_opcost\"\n",
"income_df = ts_pro.income(ts_code=code, period=period, fields=income_fields)\n",
"last_income_df = ts_pro.income(ts_code=code, period=last_period, fields=income_fields)\n",
"\n",
"cashflow_fields = \"cash_paid_for_trade_fin\"\n",
"cashflow_df = ts_pro.cashflow(ts_code=code, period=period, fields=cashflow_fields)\n",
"last_cashflow_df = ts_pro.cashflow(ts_code=code, period=last_period, fields=cashflow_fields)"
],
"id": "524a18f138a84f4a",
"outputs": [],
"execution_count": 96
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-01-10T07:10:35.283014Z",
"start_time": "2025-01-10T07:10:35.268876Z"
}
},
"cell_type": "code",
"source": [
"# ROE & ROA\n",
"roe = income_df[\"n_income\"].values[0] / ((balancesheet_df[\"total_hldr_eqy_inc_min_int\"].values[0] +\n",
" last_balancesheet_df[\"total_hldr_eqy_inc_min_int\"].values[0]) / 2)\n",
"roa = income_df[\"n_income\"].values[0] / (\n",
" (balancesheet_df[\"total_assets\"].values[0] + last_balancesheet_df[\"total_assets\"].values[0]) / 2)\n",
"print(f\"ROE: {roe:.4f}\")\n",
"print(f\"ROA: {roa:.4f}\")\n",
"\n",
"# 净利润(转换为百万为单位)\n",
"net_profit = income_df[\"n_income\"].values[0] / 1000000\n",
"print(f\"净利润: {net_profit:.4f}百万\")\n",
"\n",
"# 总资产周转率\n",
"total_asset_turnover = income_df[\"total_revenue\"].values[0] / (\n",
" (balancesheet_df[\"total_assets\"].values[0] + last_balancesheet_df[\"total_assets\"].values[0]) / 2)\n",
"print(f\"总资产周转率: {total_asset_turnover:.4f}\")\n",
"\n",
"# 现金比率\n",
"cash_ratio = + balancesheet_df[\"money_cap\"].values[0] / balancesheet_df[\"total_assets\"].values[0]\n",
"print(f\"现金比率: {cash_ratio:.4f}\")\n",
"\n",
"# 收现日数\n",
"collection_period = 360 / (income_df[\"total_revenue\"].values[0] / balancesheet_df[\"accounts_receiv\"].values[0])\n",
"print(f\"收现日数: {collection_period:.2f} 天\")\n",
"\n",
"# 销货日数\n",
"sales_period = 360 / ((income_df[\"total_revenue\"].values[0]) / balancesheet_df[\"inventories\"].values[0])\n",
"print(f\"销货日数: {sales_period:.2f} 天\")\n",
"\n",
"# 毛利率\n",
"gross_profit_margin = (income_df[\"total_revenue\"].values[0] - income_df[\"oper_cost\"].values[0]) / income_df[\n",
" \"revenue\"].values[0]\n",
"print(f\"毛利率: {gross_profit_margin:.4f}\")\n",
"\n",
"# 经营利润率\n",
"operating_profit_margin = income_df[\"operate_profit\"].values[0] / income_df[\"total_revenue\"].values[0]\n",
"print(f\"经营利润率: {operating_profit_margin:.4f}\")\n",
"print(f\"经营安全边际率: {(operating_profit_margin / gross_profit_margin):.4f}\")"
],
"id": "8707ca42171475a8",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ROE: 0.0747\n",
"ROA: 0.0411\n",
"净利润: 701.3791百万\n",
"总资产周转率: 0.3745\n",
"现金比率: 0.2253\n",
"收现日数: 12.95 天\n",
"销货日数: 59.70 天\n",
"毛利率: 0.2775\n",
"经营利润率: 0.1474\n",
"经营安全边际率: 0.5312\n"
]
}
],
"execution_count": 98
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-01-11T03:51:41.253282Z",
"start_time": "2025-01-11T03:51:41.243498Z"
}
},
"cell_type": "code",
"source": [
"def get_blancesheet_df(start_year, end_year):\n",
" fields = [\"ts_code\", \"end_date\", \"total_assets\", \"total_hldr_eqy_inc_min_int\", \"money_cap\", \"accounts_receiv\",\n",
" \"inventories\"]\n",
" result = pd.DataFrame(columns=fields)\n",
" for year in range(start_year, end_year + 1):\n",
" period = f\"{year}1231\"\n",
" temp = ts_pro.balancesheet_vip(period=period, fields=\",\".join(fields))\n",
" result = pd.concat([result, temp], ignore_index=True)\n",
" return result\n",
"\n",
"def get_income_df(start_year, end_year):\n",
" fields = [\"ts_code\", \"end_date\", \"n_income\", \"revenue\", \"total_revenue\", \"oper_cost\", \"operate_profit\", \"total_opcost\"]\n",
" result = pd.DataFrame(columns=fields)\n",
" for year in range(start_year, end_year + 1):\n",
" period = f\"{year}1231\"\n",
" temp = ts_pro.income_vip(period=period, fields=\",\".join(fields))\n",
" result = pd.concat([result, temp], ignore_index=True)\n",
" return result\n",
"\n",
"def clean_df(df):\n",
" df = df.drop_duplicates(subset=[\"ts_code\", \"end_date\"])\n",
" df[\"end_date\"] = df[\"end_date\"].str[:4]\n",
" return df"
],
"id": "6d90bcb4c5151976",
"outputs": [],
"execution_count": 54
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-01-11T03:51:53.799229Z",
"start_time": "2025-01-11T03:51:42.756645Z"
}
},
"cell_type": "code",
"source": [
"blancesheet_df = clean_df(get_blancesheet_df(2018, 2024))\n",
"income_df = clean_df(get_income_df(2018, 2024))"
],
"id": "9d7013cff65167ed",
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/var/folders/7h/w0cmp4zj6mn9br_6nyj310m40000gn/T/ipykernel_39014/3037579022.py:8: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n",
" result = pd.concat([result, temp], ignore_index=True)\n",
"/var/folders/7h/w0cmp4zj6mn9br_6nyj310m40000gn/T/ipykernel_39014/3037579022.py:8: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n",
" result = pd.concat([result, temp], ignore_index=True)\n",
"/var/folders/7h/w0cmp4zj6mn9br_6nyj310m40000gn/T/ipykernel_39014/3037579022.py:17: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n",
" result = pd.concat([result, temp], ignore_index=True)\n",
"/var/folders/7h/w0cmp4zj6mn9br_6nyj310m40000gn/T/ipykernel_39014/3037579022.py:17: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n",
" result = pd.concat([result, temp], ignore_index=True)\n"
]
}
],
"execution_count": 55
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-01-11T04:06:53.483655Z",
"start_time": "2025-01-11T04:06:53.417743Z"
}
},
"cell_type": "code",
"source": [
"stock_df = pd.merge(blancesheet_df, income_df, on=[\"ts_code\", \"end_date\"])\n",
"test_df = stock_df[stock_df[\"ts_code\"] == \"000672.SZ\"].copy()\n",
"test_df[\"roe\"] = test_df[\"n_income\"] / ((test_df[\"total_hldr_eqy_inc_min_int\"] +\n",
" test_df[\"total_hldr_eqy_inc_min_int\"].shift(1)) / 2)\n",
"test_df[[\"ts_code\",\"end_date\",\"roe\"]]\n",
"# stock_group = income_df.groupby('ts_code')\n",
"# stock_group.get_group(\"000672.SZ\")"
],
"id": "f9317a2d18449db2",
"outputs": [
{
"data": {
"text/plain": [
" ts_code end_date roe\n",
"3346 000672.SZ 2018 NaN\n",
"8529 000672.SZ 2019 0.508885\n",
"12623 000672.SZ 2020 0.316230\n",
"17853 000672.SZ 2021 0.278297\n",
"22036 000672.SZ 2022 0.105235\n",
"28907 000672.SZ 2023 0.074670"
],
"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>ts_code</th>\n",
" <th>end_date</th>\n",
" <th>roe</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>3346</th>\n",
" <td>000672.SZ</td>\n",
" <td>2018</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8529</th>\n",
" <td>000672.SZ</td>\n",
" <td>2019</td>\n",
" <td>0.508885</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12623</th>\n",
" <td>000672.SZ</td>\n",
" <td>2020</td>\n",
" <td>0.316230</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17853</th>\n",
" <td>000672.SZ</td>\n",
" <td>2021</td>\n",
" <td>0.278297</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22036</th>\n",
" <td>000672.SZ</td>\n",
" <td>2022</td>\n",
" <td>0.105235</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28907</th>\n",
" <td>000672.SZ</td>\n",
" <td>2023</td>\n",
" <td>0.074670</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
]
},
"execution_count": 68,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 68
}
],
"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
}

View File

@@ -6,8 +6,8 @@
"metadata": {
"collapsed": true,
"ExecuteTime": {
"end_time": "2024-12-27T08:52:13.762454Z",
"start_time": "2024-12-27T08:52:13.010563Z"
"end_time": "2025-01-09T05:00:21.760774Z",
"start_time": "2025-01-09T05:00:20.927280Z"
}
},
"source": [
@@ -17,7 +17,7 @@
"ts_pro = ts.pro_api(token=\"64ebff4fa679167600b905ee45dd88e76f3963c0ff39157f3f085f0e\")"
],
"outputs": [],
"execution_count": 1
"execution_count": 2
},
{
"metadata": {},
@@ -1358,6 +1358,239 @@
}
],
"execution_count": 6
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-01-09T05:00:24.994492Z",
"start_time": "2025-01-09T05:00:24.204010Z"
}
},
"cell_type": "code",
"source": [
"# 获取股票基本信息\n",
"ts_pro.stock_basic()"
],
"id": "9ae4b033636fbaad",
"outputs": [
{
"data": {
"text/plain": [
" ts_code symbol name area industry cnspell market list_date \\\n",
"0 000001.SZ 000001 平安银行 深圳 银行 payh 主板 19910403 \n",
"1 000002.SZ 000002 万科A 深圳 全国地产 wka 主板 19910129 \n",
"2 000004.SZ 000004 国华网安 深圳 软件服务 ghwa 主板 19910114 \n",
"3 000006.SZ 000006 深振业A 深圳 区域地产 szya 主板 19920427 \n",
"4 000007.SZ 000007 全新好 深圳 其他商业 qxh 主板 19920413 \n",
"... ... ... ... ... ... ... ... ... \n",
"5381 920111.BJ 920111 聚星科技 None None jxkj 北交所 20241111 \n",
"5382 920116.BJ 920116 星图测控 None None xtck 北交所 20250102 \n",
"5383 920118.BJ 920118 太湖远大 None None thyd 北交所 20240822 \n",
"5384 920128.BJ 920128 胜业电气 None None sydq 北交所 20241129 \n",
"5385 689009.SH 689009 九号公司-WD 北京 摩托车 jhgs 科创板 20201029 \n",
"\n",
" act_name act_ent_type \n",
"0 无实际控制人 无 \n",
"1 深圳市人民政府国有资产监督管理委员会 地方国企 \n",
"2 李映彤 民营企业 \n",
"3 深圳市人民政府国有资产监督管理委员会 地方国企 \n",
"4 王玩虹 民营企业 \n",
"... ... ... \n",
"5381 None None \n",
"5382 None None \n",
"5383 None None \n",
"5384 None None \n",
"5385 None None \n",
"\n",
"[5386 rows x 10 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>ts_code</th>\n",
" <th>symbol</th>\n",
" <th>name</th>\n",
" <th>area</th>\n",
" <th>industry</th>\n",
" <th>cnspell</th>\n",
" <th>market</th>\n",
" <th>list_date</th>\n",
" <th>act_name</th>\n",
" <th>act_ent_type</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>000001.SZ</td>\n",
" <td>000001</td>\n",
" <td>平安银行</td>\n",
" <td>深圳</td>\n",
" <td>银行</td>\n",
" <td>payh</td>\n",
" <td>主板</td>\n",
" <td>19910403</td>\n",
" <td>无实际控制人</td>\n",
" <td>无</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>000002.SZ</td>\n",
" <td>000002</td>\n",
" <td>万科A</td>\n",
" <td>深圳</td>\n",
" <td>全国地产</td>\n",
" <td>wka</td>\n",
" <td>主板</td>\n",
" <td>19910129</td>\n",
" <td>深圳市人民政府国有资产监督管理委员会</td>\n",
" <td>地方国企</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>000004.SZ</td>\n",
" <td>000004</td>\n",
" <td>国华网安</td>\n",
" <td>深圳</td>\n",
" <td>软件服务</td>\n",
" <td>ghwa</td>\n",
" <td>主板</td>\n",
" <td>19910114</td>\n",
" <td>李映彤</td>\n",
" <td>民营企业</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>000006.SZ</td>\n",
" <td>000006</td>\n",
" <td>深振业A</td>\n",
" <td>深圳</td>\n",
" <td>区域地产</td>\n",
" <td>szya</td>\n",
" <td>主板</td>\n",
" <td>19920427</td>\n",
" <td>深圳市人民政府国有资产监督管理委员会</td>\n",
" <td>地方国企</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>000007.SZ</td>\n",
" <td>000007</td>\n",
" <td>全新好</td>\n",
" <td>深圳</td>\n",
" <td>其他商业</td>\n",
" <td>qxh</td>\n",
" <td>主板</td>\n",
" <td>19920413</td>\n",
" <td>王玩虹</td>\n",
" <td>民营企业</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",
" </tr>\n",
" <tr>\n",
" <th>5381</th>\n",
" <td>920111.BJ</td>\n",
" <td>920111</td>\n",
" <td>聚星科技</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>jxkj</td>\n",
" <td>北交所</td>\n",
" <td>20241111</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5382</th>\n",
" <td>920116.BJ</td>\n",
" <td>920116</td>\n",
" <td>星图测控</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>xtck</td>\n",
" <td>北交所</td>\n",
" <td>20250102</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5383</th>\n",
" <td>920118.BJ</td>\n",
" <td>920118</td>\n",
" <td>太湖远大</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>thyd</td>\n",
" <td>北交所</td>\n",
" <td>20240822</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5384</th>\n",
" <td>920128.BJ</td>\n",
" <td>920128</td>\n",
" <td>胜业电气</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>sydq</td>\n",
" <td>北交所</td>\n",
" <td>20241129</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5385</th>\n",
" <td>689009.SH</td>\n",
" <td>689009</td>\n",
" <td>九号公司-WD</td>\n",
" <td>北京</td>\n",
" <td>摩托车</td>\n",
" <td>jhgs</td>\n",
" <td>科创板</td>\n",
" <td>20201029</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5386 rows × 10 columns</p>\n",
"</div>"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 3
}
],
"metadata": {

File diff suppressed because it is too large Load Diff

1012
document/ETF信息.csv Normal file

File diff suppressed because it is too large Load Diff

8064
document/SZ000001.csv Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff