1616df .set_index ('Date' , inplace = True )
1717
1818# Example trading strategy
19+
20+
1921def simple_moving_average_strategy (data , short_window , long_window ):
2022 signals = pd .DataFrame (index = data .index )
2123 signals ['Signal' ] = 0.0
22-
23- signals ['Short_MA' ] = data ['Close' ].rolling (window = short_window , min_periods = 1 , center = False ).mean ()
24- signals ['Long_MA' ] = data ['Close' ].rolling (window = long_window , min_periods = 1 , center = False ).mean ()
25-
26- signals ['Signal' ][short_window :] = np .where (signals ['Short_MA' ][short_window :] > signals ['Long_MA' ][short_window :], 1.0 , 0.0 )
27-
24+
25+ signals ['Short_MA' ] = data ['Close' ].rolling (
26+ window = short_window , min_periods = 1 , center = False ).mean ()
27+ signals ['Long_MA' ] = data ['Close' ].rolling (
28+ window = long_window , min_periods = 1 , center = False ).mean ()
29+
30+ signals ['Signal' ][short_window :] = np .where (
31+ signals ['Short_MA' ][short_window :] > signals ['Long_MA' ][short_window :], 1.0 , 0.0 )
32+
2833 signals ['Positions' ] = signals ['Signal' ].diff ()
29-
34+
3035 return signals
3136
37+
3238# Define strategy parameters
3339short_window = 10
3440long_window = 50
@@ -45,8 +51,10 @@ def simple_moving_average_strategy(data, short_window, long_window):
4551portfolio_value = []
4652for index , row in signals .iterrows ():
4753 if row ['Positions' ] == 1 :
48- max_position_size = (risk_per_trade * initial_portfolio_value ) / (row ['Close' ] - row ['Low' ])
49- position = min (max_position_size , initial_portfolio_value / row ['Close' ])
54+ max_position_size = (
55+ risk_per_trade * initial_portfolio_value ) / (row ['Close' ] - row ['Low' ])
56+ position = min (max_position_size ,
57+ initial_portfolio_value / row ['Close' ])
5058 initial_portfolio_value -= position * row ['Close' ]
5159 elif row ['Positions' ] == - 1 :
5260 initial_portfolio_value += position * row ['Close' ]
@@ -66,7 +74,8 @@ def simple_moving_average_strategy(data, short_window, long_window):
6674plt .title ('Price Data and Moving Averages' )
6775
6876plt .subplot (2 , 1 , 2 )
69- plt .plot (signals .index , signals ['PortfolioValue' ], label = 'Portfolio Value' , linestyle = '--' , color = 'green' )
77+ plt .plot (signals .index , signals ['PortfolioValue' ],
78+ label = 'Portfolio Value' , linestyle = '--' , color = 'green' )
7079plt .legend ()
7180plt .title ('Portfolio Value' )
7281
0 commit comments