- 金币:
-
- 奖励:
-
- 热心:
-
- 注册时间:
- 2006-10-11
|
|
非常感谢风扬兄的耐心讲解:)
回老婆娘家的几天,继续看风扬兄这个代码。再添加了一些中文描述。本来想着回来就发的,不知道为什么回来后又忘了:)
话说,以后都不背本本回老婆娘家了,没座位,背得重死。以后会买个10吋小本本:)
下面的,是我加了中文描述的代码。嗯,一些变量名也改成汉语拼音了。同样的,不知道改错了没有:)
Dim shenlv, yinkuibi, p, zhuijiacangwei, maxlost, chushizijin, jiaoyichishu, xujiaoyibishu, meibiyinli, meibikuisun, gudincangbi, lostbroke
Dim peilv(801), biyinlijine(801), bikuisunjine(801), kaichangshoushushuzhu(801), zongyinlijine, zongkuisunjine, yinlichishu, kuisunchishu, shijijineshuzhu(800)
Dim winprice(10000), failprice(10000), allp, sp, sv, x, w, i, v, pri, wcv, fcv
Dim shilunjineshuzhu(100), pass_ret(1000)
'Fix Dollar Amount of Equity,固定金额交易一口合约。 设定我们有多少钱才能够交易一口合约。
Private Sub Command1_Click()
'test 11
chaobiaolunshu = 51
shichelunshu = 1
shiechishujiayi = 1
gudincangbi = Val(Text1.Text)
223344:
If shichelunshu = chaobiaolunshu Then GoTo 112233
'zhuijiacangwei = (( 0.7778 + 1 ) * 0.65 - 1 ) / 0.7778 = 0.20 = 20.0%
'10 0000 本金
'meibiyinli=700..1.4%..meibikuisun=900....1.8% 1point 50$美金 10point=500 mini S&P 1000点 合约价值 5万美金
'期望值 0.079 0.079*1000= 79
chushizijin = 100000
shenlv = 0.65
yinkuibi = 0.7778
zhuijiacangwei = ((yinkuibi + 1) * shenlv - 1) / yinkuibi 'kelly
meibiyinli = 700
meibikuisun = 900
maxlost = 7000 '14%
shou = Int(chushizijin / gudincangbi)
'求机率分布
Call jilvfenbu
xujiaoyibishu = 400 '笔数
zongyinlijine = 1
zongkuisunjine = 1
i = 1
List1.Clear
zongyinkuibi = 1
'一回测试
'Do While Abs(zongshenlv - shenlv) > 0.005 Or Abs(zongyinkuibi - yinkuibi) > 0.005 Or Abs(zongmeibiyinli - meibiyinli) > 5 Or Abs(zongmeibikuisun - meibikuisun) > 5
shenlvt = 0
zongkuisunjine = 0
zongyinlijine = 0
yinlichishu = 0
kuisunchishu = 0
i = 1
s = chushizijin 's为实时资金总额
shizhikaichang = shou
Do While i <= xujiaoyibishu
' 利用乱数 模似 WMA 与 FMA
q = Int(Rnd * 10000) + 1
If q <= 10000 - 10000 * shenlv Then
peilv(i) = -1
'm = Int(Rnd * pinjunkuisun * 2)
x = Int(Rnd * allp)
m = failprice(x) / fcv
bikuisunjine(i) = -m * shizhikaichang
kaichangshoushushuzhu(i) = shizhikaichang
zongkuisunjine = zongkuisunjine + m * shizhikaichang
kuisunchishu = kuisunchishu + shizhikaichang
s = s - m * shizhikaichang '错在这一行 原来是 S=S-M 改成 S=S-M*shizhikaichang
Else
peilv(i) = 1
'm = Int(Rnd * yinlijinea * 2)
x = Int(Rnd * allp)
m = winprice(x) / wcv
biyinlijine(i) = m * shizhikaichang
kaichangshoushushuzhu(i) = shizhikaichang
zongyinlijine = zongyinlijine + m * shizhikaichang
yinlichishu = yinlichishu + shizhikaichang
s = s + m * shizhikaichang '错在这一行 原来是 S=S+M 改成 S=S+M*shizhikaichang
End If
'======================================================
shizhikaichang = Int(s / gudincangbi)
i = i + 1
Loop
zongshenlv = yinlichishu / (yinlichishu + kuisunchishu)
If yinlichishu <> 0 Then zongmeibiyinli = zongyinlijine / yinlichishu
If kuisunchishu <> 0 Then zongmeibikuisun = zongkuisunjine / kuisunchishu
If zongmeibikuisun <> 0 Then zongyinkuibi = Abs(zongmeibiyinli / zongmeibikuisun)
'Loop
lostbroke = 0
s = chushizijin
shifenehuichefenzhi = chushizijin
shifenehuicheguzhi = chushizijin
zongyinlijine = 0
zongkuisunjine = 0
jiaoyichishu = 0
yinlichishu = 0
kuisunchishu = 0
For i = 1 To xujiaoyibishu
If peilv(i) = 1 Then
s = s + biyinlijine(i)
zongyinlijine = zongyinlijine + biyinlijine(i)
yinlichishu = yinlichishu + kaichangshoushushuzhu(i)
shijijineshuzhu(i) = s
Else
s = s + bikuisunjine(i)
zongkuisunjine = zongkuisunjine + bikuisunjine(i)
kuisunchishu = kuisunchishu + kaichangshoushushuzhu(i)
shijijineshuzhu(i) = s
End If
List1.AddItem "第 " & i & "笔 资金= " & Int(s) & " 手= " & kaichangshoushushuzhu(i)
If s < chushizijin * 0.3 Then
i = 800
lostbroke = 1
End If
Next
List1.ListIndex = List1.ListCount - 1
jiaoyichishu = yinlichishu + kuisunchishu
If yinlichishu <> 0 Then t1 = zongyinlijine / (yinlichishu)
If kuisunchishu <> 0 Then t2 = zongkuisunjine / (kuisunchishu)
If t2 <> 0 Then t3 = Abs(t1 / t2)
shilunjineshuzhu(shichelunshu) = Int(s)
shichelunshu = shichelunshu + 1
If lostbroke = 1 Then
List2.AddItem " 第" & shichelunshu - 1 & "轮 资金= " & Int(s) & " " & "破产 "
Else
List2.AddItem " 第" & shichelunshu - 1 & "轮 资金= " & Int(s) & " " & " 胜率=" & Int(yinlichishu / jiaoyichishu * 100) / 100 & " 盈亏比= " & Int(t3 * 100) / 100 & " 平均盈利= " & Int(t1) & " 平均亏损= " & Int(t2) & " 交易次数=" & jiaoyichishu
End If
'====================================== find maxdrawdown发现最大回撤
If lostbroke = 0 Then
shifenehuichefenzhi = shijijineshuzhu(1)
shifenehuicheguzhi = shijijineshuzhu(1)
fenzhibi = 1
guzhibi = 1
midv = 0.2 '20%
For i = 2 To xujiaoyibishu
If shijijineshuzhu(i) > shifenehuichefenzhi Then
shifenehuichefenzhi = shijijineshuzhu(i)
fenzhibi = i
End If
If shijijineshuzhu(i) < shifenehuicheguzhi Then
shifenehuicheguzhi = shijijineshuzhu(i)
guzhibi = i
End If
If (shifenehuichefenzhi - shifenehuicheguzhi) / shifenehuichefenzhi >= midv And fenzhibi > guzhibi Then 'up motion
If fenzhibi + 11 < i Then '7 min 没创新高
'List2.AddItem 1
shifenehuicheguzhi = shijijineshuzhu(i)
guzhibi = i
End If
End If
If Abs(shifenehuichefenzhi - shifenehuicheguzhi) / shifenehuichefenzhi >= midv And fenzhibi < guzhibi Then 'down motion
If guzhibi + 11 < i Then '7 min 没创新高
List2.AddItem "资金峰值" & " " & "资金谷值" & " " & "回撤" & "% " & "峰值笔" & " " & "谷值笔"
List2.AddItem Int(shifenehuichefenzhi) & " " & Int(shifenehuicheguzhi) & " " & Int(Abs(shifenehuichefenzhi - shifenehuicheguzhi) / shifenehuichefenzhi * 100) & "% " & fenzhibi & " " & guzhibi
pass_ret(shiechishujiayi) = Int(Abs(shifenehuichefenzhi - shifenehuicheguzhi) / shifenehuichefenzhi * 100)
shiechishujiayi = shiechishujiayi + 1
shifenehuichefenzhi = shijijineshuzhu(i)
fenzhibi = i
End If
End If
Next
End If
'==========================================================================
GoTo 223344
112233:
'================统计
s = 0
shifenehuichefenzhi = 0
shifenehuicheguzhi = 1E+30
shifenehuichefenzhiret = 0
shifenehuicheguzhiret = 1E+21
pochan = 0
For i = 1 To chaobiaolunshu - 1
s = s + shilunjineshuzhu(i)
If shilunjineshuzhu(i) > shifenehuichefenzhi Then shifenehuichefenzhi = shilunjineshuzhu(i)
If shilunjineshuzhu(i) < shifenehuicheguzhi Then shifenehuicheguzhi = shilunjineshuzhu(i)
If shilunjineshuzhu(i) <= chushizijin * 0.3 Then pochan = pochan + 1
Next
List2.AddItem "===================================== "
List2.AddItem "总共 " & chaobiaolunshu - 1 & " 轮 "
List2.AddItem "平均资金: " & Int(s / (chaobiaolunshu - 1))
List2.AddItem "资金峰值: " & Int(shifenehuichefenzhi)
List2.AddItem "资金谷值: " & Int(shifenehuicheguzhi)
List2.AddItem "===================================== "
List2.AddItem "破产次数= " & pochan & " 轮 "
s = 0
shifenehuichefenzhiret = 0
shifenehuicheguzhiret = 1E+21
For i = 1 To shiechishujiayi - 1
s = s + pass_ret(i)
If pass_ret(i) > shifenehuichefenzhiret Then shifenehuichefenzhiret = pass_ret(i)
Next
List2.AddItem "===================================== "
List2.AddItem "回撤20%以上: " & shiechishujiayi - 1 & " 次"
If shiechishujiayi <> 1 Then List2.AddItem "平均回撤:" & Int(s / (shiechishujiayi - 1)) & "% "
List2.AddItem "最大回撤:" & Int(shifenehuichefenzhiret) & "% "
'======================================
End Sub
Private Sub Form_Load()
Randomize
Command1.Caption = "点击运行"
Text2.Text = "初始资金:100000美元 胜率:65% 盈亏比:0.7778 平均盈利:700 平均亏损:900"
Text3.Text = "(最小5000,最大100000)固定仓比:"
End Sub
Sub jilvfenbu() '利用高斯的自然分布 模似 FMA
'模似 4百个整数 数值落在 0到 2*FMA 之间 此范围的任一值 机率一样
'所以 4百个乱数的总合 / 400 此值会接近 FMA
'x = Int(Rnd * allp)
'm = failprice(x) / fcv
'这二行功能同上的一行数学式子 模似 FMA
'利用 常态分布(normal distribution),高斯分布(Gaussian distribution)模似 FMA
'模似 4百个整数 数值落在 0到 3.2*FMA 之间, 此范围的任一值 机率符合高斯的自然分布 机率都不一样
sp = 0
sv = 0
w = 1
For x = 0 To 10.4 Step 0.1
p = (1 / (Sqr(2 * 3.1416) * 3)) * Exp(-((x - 1) ^ 2 / (2 * 3 * 3)))
p = Int(p * 1000)
sp = sp + p
v = Int(200 * x * p)
sv = sv + v
Next
'List1.AddItem sp & " " & " " & sv & " " & sv / sp
meibikuisun = 900
meibiyinli = 700
wcv = (sv / sp) / meibiyinli
fcv = (sv / sp) / meibikuisun
allp = sp '所有的状况
sp = 0
sv = 0
w = 0
For x = 0 To 10.4 Step 0.1
p = (1 / (Sqr(2 * 3.1416) * 3)) * Exp(-((x - 1) ^ 2 / (2 * 3 * 3)))
p = Int(p * 1000)
If p <> 0 Then
For k = 1 To p
failprice(w + k) = x * 200
Next
w = w + p
End If
sp = sp + p
v = Int((200 * x * p) / fcv)
sv = sv + v
Next
'List1.AddItem "fail ====>>>> " & sp & " " & sv & " " & Int(sv / sp)
sp = 0
sv = 0
w = 0
For x = 0 To 10.4 Step 0.1
p = (1 / (Sqr(2 * 3.1416) * 3)) * Exp(-((x - 1) ^ 2 / (2 * 3 * 3)))
p = Int(p * 1000)
If p <> 0 Then
For k = 1 To p
winprice(w + k) = x * 200
Next
w = w + p
End If
sp = sp + p
v = Int((200 * x * p) / wcv)
sv = sv + v
Next
'List1.AddItem "win ====>>>" & sp & " " & sv & " " & Int(sv / sp)
End Sub |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|
|