2017-11-08 7 views
0

606取引日間に1万パスを実行する株式とオプション価格のモンテカルロシミュレーションを自動化しました。すべてとすべてそれはうまく動作し、問題は遅いです。コードの遅い部分は、スプレッドシートに400 x 10000の配列を書き込んだ後、新しいCSVファイルに書き出して保存する必要があるときです。配列をcsvファイルに送信する - シミュレーションが遅すぎる

これは25個のオプションポートフォリオ(1オプションにつき1分かかる)で実行されます。したがって、全体的には25分かかるため、これは受け入れられません。私はシミュレーションで満たしているデータの配列をCSVに直接書き込むことができますか?私はすべての株価、オプション価格と総ポートフォリオの価値を維持する必要があります。以下はこれのために作成したコードです。

Sub Background_simulation() 

0 Application.ScreenUpdating = False 
1 Windows("Option Portfolio Simulation v7.xlsm").Activate 
2 Sheets("Export").Activate 
3 Dim Arr() As Variant 
4 ArrStock = Range("F11:NTU616") 
6 ArrOption = Range("F621:NTU1226") 
7 Sheets("Export").Activate 

8 Dim DestinationStock As Range 
9 Set DestinationStock = Range("F11") 

10 Dim DestinationOption As Range 
11 Set DestinationOption = Range("F621") 
12 Dim RAND(1 To 606, 1 To 10000) As Variant 
13 Paths = Range("D6").Value 

15 Dim Option_Paths(1 To 606, 1 To 10000) As Variant 
16 Dim St_Paths(1 To 606, 1 To 10000) As Variant 
17 Dim Options_Total(1 To 606, 1 To 10000) As Variant 
18 FromOption = Range("D7").Value 
19 UpToOption = Range("D8").Value 
20 Sheets("Portfolio").Select 
21 Let MaxExpirationOfSet = Application.WorksheetFunction.Max(Range("BC2:BC26").Value) 
22 Sheets("Export").Select 

23 For a = 2 To 606 
24 For b = 1 To Paths 
25 Randomize 
26 RAND(a, b) = Application.WorksheetFunction.NormInv(RND(), 0, 1) 
27 Next 
28 Next 

31 For Option_Nr = FromOption To UpToOption 
32 Sheets("Export").Select 
33 Range("F11:NTU616").Select 
34 Selection.ClearContents 
35 Range("F621:NTU1226").Select 
36 Selection.ClearContents 
38 Range("B1").Select 
39 ActiveCell.FormulaR1C1 = Option_Nr 
42 Calls = Range("L3").Value 
43 If Calls = 0 Then GoTo 2010 
44 St = Range("G2").Value 
45 Rf = Range("G3").Value 
46 Sigma = Range("G4").Value 
47 dt = 1/250 
48 mrn = Rf - (1/2) * Sigma^2 
49 X = Range("L5").Value 
50 Expiration_Date = Range("D4").Value 

120 For b = 1 To Paths 
130 RAND(1, b) = 1 
140 St_Paths(1, b) = St 
150 Option_Paths(1, b) = Application.WorksheetFunction.Max(St - X, 0) * Calls 
160 Options_Total(1, b) = Options_Total(1, b) + Option_Paths(1, b) 
170 Next 

190 For a = 2 To Expiration_Date 
200 For b = 1 To Paths 
600 St_Paths(a, b) = St_Paths(a - 1, b) * Exp(mrn * dt + Sigma * (dt)^(1/2) * RAND(a, b)) 
700 Option_Paths(a, b) = Application.WorksheetFunction.Max(St_Paths(a, b) - X, 0) * Calls 
701 Options_Total(a, b) = Options_Total(a, b) + Option_Paths(a, b) 
703 Next 
704 Next 

705 For a = (Expiration_Date + 1) To MaxExpirationOfSet 
706 For b = 1 To Paths 
707 St_Paths(a, b) = St_Paths(a - 1, b) 
710 Option_Paths(a, b) = Option_Paths(a - 1, b) 
711 Options_Total(a, b) = Options_Total(a - 1, b) 
712 Next 
730 Next 

740 Sheets("Export").Select 
750 Range("F11:NTU616").Select 
760 Selection.ClearContents 
770 Range("F621:NTU1226").Select 
780 Selection.ClearContents 
790 Range("A1").Select 

800 DestinationStock.Resize(UBound(ArrStock, 1), UBound(ArrStock, 2)).Value = St_Paths 
810 DestinationOption.Resize(UBound(ArrOption, 1), UBound(ArrOption, 2)).Value = Option_Paths 

830 Sheets("Export").Copy 
840 Range("F620").Select 
845 ActiveWorkbook.BreakLink Name:= _ 
     "C:\Users\pmesples\Desktop\Options\Option Portfolio Simulation v7.xlsm", Type _ 
     :=xlExcelLinks 

850 ChDir "C:\Users\pmesples\Desktop\Options" 
860 ActiveWorkbook.SaveAs Filename:="C:\Users\pmesples\Desktop\Options\" & Option_Nr & ".csv", _ 
     FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False 


900 ActiveWindow.Close 
1000 Sheets("Export").Select 

1001 Range("F" & 620 + MaxExpirationOfSet & ":NTU" & 620 + MaxExpirationOfSet).Select 
1002 Selection.Copy 
1003 Sheets("Results").Select 
1004 Cells(5, Option_Nr + 3).Select 
1005 Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=True 

1006 Sheets("Export").Select 
1010 Range("F11").Select 
1020 Range(Selection, Selection.End(xlToRight)).Select 
1030 Range(Selection, Selection.End(xlDown)).Select 
1040 Selection.ClearContents 
1050 Selection.End(xlDown).Select 
1060 Range("F621").Select 
1080 Range(Selection, Selection.End(xlDown)).Select 
1090 Range(Selection, Selection.End(xlToRight)).Select 
2000 Selection.ClearContents 
2005 Range("A1").Select 
2010 Next 

2015 Range("B1").Select 
2016 ActiveCell.FormulaR1C1 = 26 
2020 DestinationOption.Resize(UBound(ArrOption, 1), UBound(ArrOption, 2)).Value = Options_Total 
2030 Sheets("Export").Copy 
2040 Range("F620").Select 
2045 ActiveWorkbook.BreakLink Name:= _ 
     "C:\Users\pmesples\Desktop\Options\Option Portfolio Simulation v7.xlsm", Type _ 
     :=xlExcelLinks 

2050 ChDir "C:\Users\pmesples\Desktop\Options" 
2060 ActiveWorkbook.SaveAs Filename:="C:\Users\pmesples\Desktop\Options\26.csv", _ 
     FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False 


2100 ActiveWindow.Close 
2110 Sheets("Export").Select 
2215 Range("B1").Select 
2120 ActiveCell.FormulaR1C1 = 1 


End Sub 
+0

速度を求めている場合は、Excel VBAを使用するのが最善の選択肢ではありません。代わりにVB.NETを使用して、Excelを完全にバイパスしてCSVファイルを直接書き込みます。あなたの最も遅い要因はExcelです。 – braX

答えて

0

あなたはおそらく、マクロをスピードアップするために選択して、選択を取り除くことができように:

32 Sheets("Export").Select 
33 Range("F11:NTU616").Select 
34 Selection.ClearContents 

32 Sheets("Export").Range("F11:NTU616").ClearContents 

によって置き換えかもしれないが、あなたはおそらく貴重な秒のほとんどを失いましたすでに気付いたように、ファイルを保存しています。確かに、あなたは私のサブルーチンを参照してください、ファイルへのエクスポートを試みることができる:

Private Sub PrintToCSV(sFileName As String, rng As Range) 
Dim TextFile As Integer 
Dim FilePath As String 
Dim FileContent As String 
Dim cl As Range 

FilePath = ThisWorkbook.Path & "\something something\" & sFileName & ".csv" 

TextFile = FreeFile 

Open FilePath For Output As TextFile 

For Each cl In rng 
    Print #TextFile, cl.Value 
Next cl 

Close TextFile 
End Sub 

しかし、一般的に言えば、VBAはスクリプト言語なので、遅いです。ファイルへの書き込みが保存するよりも速いのかどうかはわかりませんが、試してみてください。

+0

ありがとうございます@MarcinSzaleniec。あなたのサブルーチンを使用しようとしましたが、私のルーチンの一部として機能させることができませんでした。配列を定義したIntegerとStringにどのように転送するのですか? –

+0

あなたの配列は配列に範囲が渡されるので、範囲を直接使用してください。 ArrStockの代わりにRange( "F11:NTU616")を使用します。しかし、私はbraXと一致しています、あなたはVBAで重要な結果を得ることはまずありません。それにもかかわらず、あなたのコードは最適化されるかもしれません。 – MarcinSzaleniec

+0

もう一度ありがとうMarcin!良い一日を。 –

関連する問題