Commit 1ffdc001 by 20201219012

Upload New File

parent 2981f371
{
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import cvxopt as opt\n",
"from cvxopt import blas, solvers\n",
"import pandas as pd\n",
"from cvxopt import solvers, matrix\n",
"\n",
"df=pd.read_csv('stocks.csv')\n",
"\n",
"stock_list=[row['stock'] for index,row in df.iterrows()]\n",
"\n",
"#选股池\n",
"instruments=stock_list\n",
"\n",
"#回测时间\n",
"start_date='2019-01-03'\n",
"end_date='2021-01-22'\n",
"\n",
"\n",
"def initialize(context):\n",
" \n",
" context.set_commission(PerOrder(buy_cost=0.0003,sell_cost=0.0003,min_cost=5))\n",
"\n",
"\n",
" \n",
"\n",
"##每天执行一次\n",
"def handle_data(context,data):\n",
" \n",
" ##技术指标所需要的最大天数\n",
" \n",
" if context.trading_day_index<100:\n",
" return\n",
" \n",
" if (context.trading_day_index)%20!=0:\n",
" return \n",
" \n",
" print(context.trading_day_index)\n",
" \n",
" price_df=pd.DataFrame()\n",
" \n",
" stock_num=120\n",
" count=0\n",
" \n",
" for stock in instruments:\n",
" count+=1\n",
" sid=context.symbol(stock)\n",
" prices = data.history(sid,'price',5,'1d')\n",
" price_df=pd.concat([price_df,prices],axis=1)\n",
" price_df.fillna(0,inplace=True)\n",
" if(count==stock_num):\n",
" break\n",
" \n",
" ## 120,5\n",
" price_np=price_df.to_numpy().T\n",
" \n",
" \n",
" ##cov\n",
" ##(120,120)\n",
" cov_df= pd.DataFrame(np.cov(price_np))\n",
" P=matrix(cov_df.to_numpy())\n",
" \n",
" q=-matrix(np.mean(price_np,axis=1),(stock_num,1))\n",
" \n",
" \n",
" ##Ax=b\n",
" A=matrix(1.,(1,stock_num))\n",
" b=matrix(1.)\n",
" \n",
" \n",
" ##GX<=h\n",
" temp_df1= pd.DataFrame(-np.eye(stock_num))\n",
" temp_df2= pd.DataFrame(np.eye(stock_num))\n",
" G_df=pd.concat([temp_df1,temp_df2],axis=0)\n",
" G = matrix(G_df.to_numpy()) \n",
" \n",
" ##xi<=0.2\n",
" temp_list=[]\n",
" for i in range(stock_num):\n",
" temp_list.append([0.0])\n",
" \n",
" ##每只权重不超过0.2\n",
" for i in range(stock_num):\n",
" temp_list.append([0.2])\n",
" h = opt.matrix(np.array(temp_list))\n",
" \n",
" \n",
" ##solver:\n",
" solvers.options['show_progress'] = False\n",
" sol = solvers.qp(P,q,G,h,A,b)\n",
" weight=list(sol['x'])\n",
"\n",
" stock_selected_list=[]\n",
" sum_weight=0.0\n",
" cur=0\n",
" for stock in stock_list: \n",
" sid=context.symbol(stock)\n",
" if data.can_trade(sid):\n",
" stock_selected_list.append(stock)\n",
" sid=context.symbol(stock)\n",
" \n",
" ##融入技术指标,如果满足条件,,权重加倍\n",
" ma_3=data.history(sid,'price',3,'1d').mean()\n",
" ma_5=data.history(sid,'price',5,'1d').mean()\n",
" ma_10=data.history(sid,'price',10,'1d').mean()\n",
" ma_15=data.history(sid,'price',15,'1d').mean()\n",
" sum_weight+=weight[cur]\n",
" if ma_3>ma_5 and ma_5>ma_10 and ma_10>ma_15:\n",
" sum_weight+=weight[cur]*2\n",
" weight[cur]*=2\n",
" else:\n",
" weight[cur]=0\n",
" cur+=1\n",
" \n",
" cur=0\n",
" for stock in stock_list:\n",
" if weight[cur]!=0:\n",
" sid=context.symbol(stock)\n",
" price=data.current(sid,'price')\n",
" context.order_target_percent(sid,weight[cur]/sum_weight)\n",
" cur+=1\n",
"\n",
"m=M.trade.v2(\n",
" instruments=instruments,\n",
" start_date=start_date,\n",
" end_date=end_date,\n",
" initialize=initialize,\n",
" handle_data=handle_data,\n",
" order_price_field_buy='open',\n",
" order_price_field_sell='open',\n",
" capital_base=1000000\n",
")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"is_mlstudio": "false",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"name": ""
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment