1
0

增加结构化策略

This commit is contained in:
2025-01-15 18:43:23 +08:00
parent a89c60227c
commit b74e33b37b
4 changed files with 139 additions and 9 deletions

15
selector.py Normal file
View File

@@ -0,0 +1,15 @@
import pandas as pd
class Selector:
def select(self, codes: [str], df: pd.DataFrame) -> [str]:
return codes
class PeriodSelector(Selector):
def __init__(self, period: int = 5):
self.__period = period
def select(self, codes: [str], df: pd.DataFrame) -> [str]:
size_df = df.groupby("code").size()
return list(filter(lambda code: size_df[code] > self.__period, codes))

View File

@@ -1,18 +1,20 @@
import os.path
import pandas as pd import pandas as pd
finance_root = "C:\\Users\\lanyuanxiaoyao\\Documents\\Tushare" finance_root = "/Users/lanyuanxiaoyao/SynologyDrive/data/Tushare"
def load_balance_sheet(): def load_balance_sheet():
return pd.read_csv(f"{finance_root}\\财务报表\\资产负债表1990-2024.csv") return pd.read_csv(os.path.join(finance_root, "财务报表", "资产负债表1990-2024.csv"))
def load_income(): def load_income():
return pd.read_csv(f"{finance_root}\\财务报表\\利润表1990-2024.csv") return pd.read_csv(os.path.join(finance_root, "财务报表", "利润表1990-2024.csv"))
def load_cashflow(): def load_cashflow():
return pd.read_csv(f"{finance_root}\\财务报表\\现金流量表1990-2024.csv") return pd.read_csv(os.path.join(finance_root, "财务报表", "现金流量表1990-2024.csv"))
def load_finance(): def load_finance():

View File

@@ -102,12 +102,12 @@
" daily_df[\"trade_date\"] = pd.to_datetime(daily_df[\"trade_date\"], format=\"%Y%m%d\")\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[\"trade_date_timestamp\"] = daily_df[\"trade_date\"].astype(np.int64)\n",
" daily_df.sort_values(by=\"trade_date\", ascending=True, inplace=True)\n", " daily_df.sort_values(by=\"trade_date\", ascending=True, inplace=True)\n",
" \n", "\n",
" first = daily_df[daily_df[\"trade_date_timestamp\"] == daily_df[\"trade_date_timestamp\"].min()][\"close_qfq\"].values[0]\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", " last = daily_df[daily_df[\"trade_date_timestamp\"] == daily_df[\"trade_date_timestamp\"].max()][\"close_qfq\"].values[0]\n",
" \n", "\n",
" print(first, last)\n", " print(first, last)\n",
" \n", "\n",
" coefficients = np.polyfit(daily_df[\"trade_date_timestamp\"], daily_df[\"close_qfq\"], 1)\n", " coefficients = np.polyfit(daily_df[\"trade_date_timestamp\"], daily_df[\"close_qfq\"], 1)\n",
"\n", "\n",
" print(coefficients)\n", " print(coefficients)\n",

View File

@@ -0,0 +1,113 @@
{
"cells": [
{
"cell_type": "code",
"id": "initial_id",
"metadata": {
"collapsed": true,
"ExecuteTime": {
"end_time": "2025-01-15T09:42:10.585456Z",
"start_time": "2025-01-15T09:42:06.693869Z"
}
},
"source": [
"import pandas as pd\n",
"import loader as ld\n",
"\n",
"source_finance_df = ld.load_finance()\n",
"finance_df = pd.DataFrame()\n",
"finance_df[[\n",
" \"code\",\n",
" # 年份\n",
" \"year\",\n",
" # 股东权益合计(含少数股东权益)\n",
" \"total_stockholder_interest\",\n",
" # 净利润\n",
" \"net_income\",\n",
" # 总资产\n",
" \"total_assets\",\n",
" # 营业总收入\n",
" \"total_revenue\",\n",
" # 存货\n",
" \"inventories\",\n",
" # 应收账款\n",
" \"accounts_receivable\",\n",
" # 营业成本\n",
" \"operating_costs\",\n",
" # 营业利润\n",
" \"operating_profit\",\n",
" # 现金与现金等价物\n",
" \"cash\",\n",
" # 营业活动现金流量净值\n",
" \"operating_net_cash_flow\",\n",
"]] = source_finance_df[[\n",
" \"ts_code\",\n",
" \"end_date\",\n",
" \"total_hldr_eqy_inc_min_int\",\n",
" \"n_income\",\n",
" \"total_assets\",\n",
" \"total_revenue\",\n",
" \"inventories\",\n",
" \"accounts_receiv\",\n",
" \"oper_cost\",\n",
" \"operate_profit\",\n",
" \"money_cap\",\n",
" \"n_cashflow_act\",\n",
"]]"
],
"outputs": [],
"execution_count": 17
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-01-15T09:45:06.335656Z",
"start_time": "2025-01-15T09:45:06.291888Z"
}
},
"cell_type": "code",
"source": [
"from selector import PeriodSelector\n",
"\n",
"filter_df = finance_df[(2010 < finance_df[\"year\"]) & (finance_df[\"year\"] < 2025)]\n",
"codes = filter_df[\"code\"].unique().tolist()\n",
"print(len(codes))\n",
"codes = PeriodSelector().select(codes, filter_df)\n",
"print(len(codes))"
],
"id": "26539ccd8ce0fb9e",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"5715\n",
"4892\n"
]
}
],
"execution_count": 24
}
],
"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
}