用Scipy中的linprog解决股票融资中的线性规划问题
問題:
目前有自有資金100萬元,已開通融資融券,可融資額度為100萬元。現已經確定需要買的10只股票(見下表),在盡量把自有資金用完的前提下,要求每只股票每只股票買入金額大致相等,并且能夠使獲得的融資額最大。
下表為每只股票的保證金比例及擔保品折算率:
|
| 保證金比例(A1..A10) | 擔保品折算率(B1...B10) |
| 601996 | 1 | 0.65 |
| 688598 | 1.5 | 0.5 |
| 603657 | 0 | 0.65 |
| 000875 | 1 | 0.65 |
| 002015 | 0 | 0.65 |
| 688595 | 1.5 | 0.5 |
| 601600 | 1 | 0.65 |
| 002721 | 0 | 0 |
| 000818 | 1 | 0.65 |
| 600152 | 0 | 0.65 |
變量分析:
10只股票,每只股票可進行擔保品買入和融資買入,則有20個變量:x1,x2...x20.其中x1...x10對應上表中從上往下各股票擔保品買入金額,x11...x20對應各股票融資買入金額。
規劃目標分析:
融資買入總額最大MAX(z)=x11+x12+...+x20
約束條件分析:
條件1,融資警戒線為145%:x1+x2+...+y10>=1.45(x11+x12+..+x20)
條件2,擔保品買入總額:x1+x2+...+x10≤1000000
條件3:? 擔保品折算后需大于融資額:A1*x11+A2*x12+...+A10*x20<=B1x1+B2x2+...B10*x10
條件4:只股票每只股票買入金額大致相等。每兩只股票間具有如下類似關系: x1+x11≤1.2(x2+x12),總計10*9=90個約束。其中1.2為差異度,大致相當于兩只股票買入金額差小于20%即為接近相等。
條件5:不能融資的股票。從上表中可以看到,有四只股票保證金比例為0,表示不能融資。例如600152不能融資,則有:X20=0。
運行結果為
[2.95546559e+04 1.33603239e+05 1.60323887e+05 2.95546557e+04
?1.60323887e+05 1.33603239e+05 2.95546560e+04 1.33603239e+05
?2.95546559e+04 1.60323887e+05 1.30769231e+05 2.83363480e-05
?0.00000000e+00 1.30769231e+05 0.00000000e+00 2.83363480e-05
?1.30769231e+05 0.00000000e+00 1.30769231e+05 0.00000000e+00]
前10個數字為各股票擔保品買入額,后10各數字為各股票融資買入額。
源代碼如下:
import numpy as np from scipy.optimize import linprogmoney=1000000#可用資金額 count=10#股票數量 warning_value=1.45#預警線 balance_value=1.2#股票買入額差異比 levers=[1,1.5,0,1,0,1.5,1,0,1,0]#保證金比例 guarantees=[0.65,0.5,0.65,0.65,0.65,0.5,0.65,0,0.65,0.65]#擔保品折算率#規劃目標為可融資額總和,每個元素對應各變量的系數,這里后一半變量為可融資額 c=np.zeros(shape=(count*2,), dtype = np.float64) for i in range(count):c[count+i]=1.0#第一行初始化維持擔保比例約束,按警戒線。 #第二行按現金確定最大擔保買入量。 #第三行保證金比例約束 data=np.zeros(shape=(3,count*2), dtype = np.float64) for i in range(count): data[0][i]=-1.0if levers[i]>0:data[0][count+i]=warning_valueelse:data[0][count+i]=0data[1][i]=1.0data[1][count+i]=0data[2][i]=-guarantees[i]data[2][count+i]=levers[i]#第4-93行為股票買入額相近約束 for i in range(count-1):line=np.zeros(shape=(1,count*2),dtype=np.float64)line[0][0]=1.0line[0][count]=1.0line[0][i+1]=0-balance_valueline[0][i+count+1]=0-balance_valuefor j in range(count):line2=np.roll(line,j)data=np.concatenate((data,line2),axis=0) A_ub=data B_ub=np.zeros(shape=(count*(count-1)+3,), dtype = np.float64) B_ub[1]=money#融資額為0的約束。 A_eq=np.empty(shape=(0,count*2),dtype = np.float64) zero_count=0 for i in range(count):if levers[i]>0:continueelse:tmp=np.zeros(shape=(1,count*2), dtype = np.float64)tmp[0][count+i]=1.0A_eq=np.concatenate((A_eq,tmp),axis=0)zero_count=zero_count+1 B_eq=np.zeros(shape=(zero_count,), dtype = np.float64) #第1個參數為-c,表示求最大值。 res=linprog(-c,A_ub,B_ub,A_eq,B_eq) if res.success==False:exit(1) #res.x中為對應x1,x2...x20的各個變量的值。 print(res.x)總結
以上是生活随笔為你收集整理的用Scipy中的linprog解决股票融资中的线性规划问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虚拟机服务器扩容,vmware虚拟机 u
- 下一篇: js仿百度文库文档上传页面的分类选择器_